我的 Windows 应用程序中有一个 listview 控件,其中填充了一些项目。我将通过将ListViewItem.Selected
属性设置为 true 以编程方式选择项目。但我想阻止用户在列表视图中选择一个项目。即,应始终以编程方式选择它。我可以通过禁用控件来阻止用户选择,但是禁用控件也会禁用不正确的滚动条。
即使我创建了一个自定义列表视图控件并ItemSelectionChanging
使用 WndProc检查链接实现了一个事件处理程序,使用它我可以取消事件,如下所示,
private void lstLiveTables_ItemSelectionChanging(object sender, ListViewExItemSelectionChangingEventArgs e)
{
e.Cancel = true;
}
但同样,这将取消该事件,即使对于以编程方式选择的项目也是如此。我的问题是,无论如何要确定选择是手动(由用户)还是以编程方式SelectedIndexChanged
或使用WndProc
Message.
注:如果需要,我会上传CustomListView控件的代码。
更新 1
谢谢埃马特尔。这是个好主意。即使我试图通过仅在选择项目之前订阅事件并在选择后立即将其删除来实现相同的目的。通过这种方式,一旦选择,事件将立即触发并继续。这工作正常。
this.lstTables.SelectedIndexChanged += new System.EventHandler(this.lstTables_SelectedIndexChanged);
item.Selected = true;
this.lstTables.SelectedIndexChanged -= new System.EventHandler(this.lstTables_SelectedIndexChanged);
但是我又遇到了一个问题,如果用户手动选择一个项目,什么都不会发生(不会触发任何事件),但该项目将被突出显示。一旦一个项目被突出显示,并且如果我尝试以编程方式选择相同的项目,则没有发生任何事情,即,该SelectedIndexChanged
项目不会触发该事件,因为它已经被突出显示。
注意:即使我遵循您建议的 Flag 方法,也会有相同的行为。
更新 2
我可以通过拥有自己的方法而不是按照 emartel 的建议处理事件来解决这个问题。但我的问题是,根据我的更新 1,SelectedIndexChanged
当项目被突出显示但未实际选择时,是否有触发事件?