我有一个列表视图控件在我的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