C#:在SelectedIndexChanged上为列表视图触发多个事件bizzare

时间:2016-05-28 09:54:34

标签: c# listview

如果我将listview组件放入windows窗体并向其添加以下代码SelectedIndexChanged事件:

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

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

注意:我使用循环清除listview中的所选项目

1 个答案:

答案 0 :(得分:1)

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

如果您需要更改属性以响应通知,请查看相应的*Changing事件。不是通知事情已发生变化(事后发生),而是通知事情即将发生变化(事先发生)。在SelectedIndexChanging事件中,您有几种不同的选项可以改变事件的过程:

  1. 您可以将e.Cancel属性设置为true,这样就可以了。它将取消该事件并阻止所选索引的更改。
  2. 您可以使用e.NewSelectedIndex属性更改选择。只需将此属性设置为您要选择的项目的索引即可。
  3. 如果你想清除ListView中的选定项目以响应其他一些事件(例如,点击"清除选择"按钮不属于在ListView或类似的上下文菜单项中,您根本不需要循环。只需清除控件的SelectedItems集合:myListView.SelectedItems.Clear()即可。同样,您无法在响应SelectedIndexChanged事件时执行此操作,或者您会遇到触发大量通知的相同问题。

    老实说,你在这里写的代码毫无意义。当用户尝试选择项目时,您为什么要清除所有选定的项目?如果您不想允许选择,请通过将其Enabled属性设置为false来停用该控件。