繁体   English   中英

C#:在SelectedIndexChanged上针对listview的bizzare多个事件触发

[英]C#: bizzare multiple event firing for listview on SelectedIndexChanged

如果我将listview组件放入Windows窗体中,并将​​波纹管代码添加到它的SelectedIndexChanged事件中:

MessageBox.Show("Fired!");
foreach (int selectedIndex in listView1.SelectedIndices)
{
    listView1.Items[selectedIndex].Selected = false;
    listView1.Items[selectedIndex].Focused = false;
}

该消息框将显示4次! 这是为什么?

注意 :我使用循环清除列表视图中的选定项目

您不应在SelectedIndexChanged事件中更改选择。 更一般而言, 您不应在属性已更改的通知内更改属性

如果您需要更改属性以响应通知,请查看处理相应的*Changing事件。 并非是某事已更改(在事实之后发生)的通知,而是某事即将发生更改(在事实之前发生)的通知。 SelectedIndexChanging事件中,您有几个不同的选项可以更改事件的过程:

  1. 您可以将e.Cancel属性设置为true ,就像上面所说的那样。 它将取消事件并防止所选索引更改。
  2. 您可以使用e.NewSelectedIndex属性更改选择。 只需将此属性设置为要选择的项目的索引即可。

而且,如果您想响应其他事件( 例如 ,单击不属于ListView的“清除选择”按钮或类似的上下文菜单项)而清除ListView中的选定项目,则不要完全需要一个循环。 只需清除控件的SelectedItems集合: myListView.SelectedItems.Clear() 同样,您不能这样做以响应SelectedIndexChanged事件,否则您将遇到触发大量通知的相同问题。

坦白地说,您在此处编写的代码没有任何意义。 当用户尝试选择一个项目时,为什么要清除所有选中的项目? 如果不想允许选择,请通过将控件的Enabled属性设置为false来禁用该控件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM