2012-11-27 130 views
2

我有一個列表視圖控件在我的Windows應用程序,這是與一些項目集填充。我將通過將ListViewItem.Selected屬性設置爲true來編程選擇一個項目。但我想阻止用戶在列表視圖中選擇一個項目。即它應該總是以編程方式選擇。我可以通過禁用控件來阻止用戶選擇,但禁用控件也會禁用不正確的滾動條。防止用戶選擇,但允許以編程方式選擇

即使我已創建一個自定義列表視圖控件實現並採用的WndProc check link一個ItemSelectionChanging事件處理程序,使用它我可以取消事件,如下圖所示,

private void lstLiveTables_ItemSelectionChanging(object sender, ListViewExItemSelectionChangingEventArgs e) 
{ 
    e.Cancel = true; 
} 

但同樣,這將取消該事件,甚至以編程方式選擇的項目。我的問題是,無論如何確定選擇是手動(由用戶)還是以編程方式在SelectedIndexChanged或使用WndProc消息。

注意:如果需要,我將上傳CustomListView控件的代碼。

更新1

感謝emartel。這是一個很好的想法。即使我試圖通過只在選擇項目之前訂閱事件並在選擇後立即將其刪除之後實現相同的目的。通過這種方式,選擇後,事件將立即觸發並繼續。這工作正常。

this.lstTables.SelectedIndexChanged += new System.EventHandler(this.lstTables_SelectedIndexChanged); 
item.Selected = true; 
this.lstTables.SelectedIndexChanged -= new System.EventHandler(this.lstTables_SelectedIndexChanged); 

但同樣我有,如果用戶手動選擇一個項目,什麼都不會發生(不將觸發事件),但是單獨的項目將被高亮顯示的問題。一旦項目突出顯示,並且如果我嘗試以編程方式選擇相同的項目,則不會發生任何事件,即SelectedIndexChanged事件沒有被觸發,因爲它已被突出顯示。

注意:即使我遵循您所建議的標記方法,也會出現相同的行爲。

更新2

我可以有我自己的方法,而不是通過事件emartel的建議處理解決這個問題。但我的問題是,根據我的更新1,無論如何,當項目被突出顯示但沒有實際選擇時觸發SelectedIndexChanged事件?

+0

我想你正在看着這個錯誤的方式 - 總是觸發和'取消'框的檢查*除非*你在編程上做 - 例如'void itemChanging(object sender,ListViewExItemSelectionChangingEventArgs e){if(!programaticallyChanging)e.Cancel = true; }'。然後當編程方式改變'programaticallyChanging'設置爲true時,然後設置'selected'標誌,然後將'programaticallyChanging'設置爲false – Charleh

+0

但emartel有一點 - 爲什麼要爲事件打擾?事件的要點是在發生某些操作時處理事件...如果您在代碼隱藏中控制項目的滴答聲,爲什麼不直接跳過整個事件處理程序呢? – Charleh

+0

啊掛 - 我剛剛意識到我看了你的更新,然後同意emartels評論不會爲你工作,然後我打了我自己的大腦一秒鐘,並忽略了原來的想法,並用謊言代替它,然後張貼作爲評論謊言。我原來的評論應該工作,第二個只是一個瘋狂的時刻 – Charleh

回答

0

那麼,一個簡單的解決辦法是保持一個標誌說,你是編程方式更改的選擇,並允許的情況下通過,並重置標誌當你完成

編輯:如果您,只有你,可以改變選擇,並且你以編程的方式做到這一點,所以你有控制在何時何地發生這種情況,爲什麼你甚至需要EventHandler?爲什麼不調用一個方法來做任何你想要發生的處理呢?

+0

請檢查更新1 – Reuben

+0

其實我是通過事件,因爲它實際上是從另一個事件觸發。無論如何,你是對的,我可以有我自己的方法,可以從原始事件中調用。謝謝。 – Reuben

0

一個這樣做的方法是保持所選項目的列表和刷新選擇每次改變其他方式比你的代碼。

還有一個ItemSelectionChanged事件會針對其選擇狀態已更改的每個項目單獨引發。您可以將選擇狀態翻轉回此事件。

你也可以看看Better ListView Express控件。它有一個只讀模式,所以用戶不能改變選擇。它的設置非常簡單:

listView.ReadOnly = true; 

full version還支持自定義的非選項。簡單設置:

listView.Items[0].Selectable = false; 

使第一個不可選(由用戶)。

當然,您仍然可以從代碼中選擇項目。

下圖顯示了在行動非可選項目(它們是由灰色標記):

enter image description here

1
public FrmTest() 
{ 
    list.ItemSelectionChanged += list_ItemSelectionChanged; 
} 

private bool changing; 

private void list_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) 
{ 
    if (changing) 
     return; 

    if (e.Item == nonSelectableListItem) 
    { 
     changing = true; 
     nonSelectableListItem.Selected = false; 
     changing = false; 
    } 
} 

樣品:

enter image description here

相關問題