我有一個列表視圖控件在我的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
事件?
我想你正在看着這個錯誤的方式 - 總是觸發和'取消'框的檢查*除非*你在編程上做 - 例如'void itemChanging(object sender,ListViewExItemSelectionChangingEventArgs e){if(!programaticallyChanging)e.Cancel = true; }'。然後當編程方式改變'programaticallyChanging'設置爲true時,然後設置'selected'標誌,然後將'programaticallyChanging'設置爲false – Charleh
但emartel有一點 - 爲什麼要爲事件打擾?事件的要點是在發生某些操作時處理事件...如果您在代碼隱藏中控制項目的滴答聲,爲什麼不直接跳過整個事件處理程序呢? – Charleh
啊掛 - 我剛剛意識到我看了你的更新,然後同意emartels評論不會爲你工作,然後我打了我自己的大腦一秒鐘,並忽略了原來的想法,並用謊言代替它,然後張貼作爲評論謊言。我原來的評論應該工作,第二個只是一個瘋狂的時刻 – Charleh