在ListView中捕获全部取消选择 - SelectedIndexChanged两次射击

时间:2011-04-21 07:10:56

标签: c# listview

基本上,我有一个ListView的项目。选择一个文本框后,右侧会显示一个文本框,以显示该项目的更多详细信息(需要一点时间来抓取项目数据)。我想要的行为是在所有项目都未被选中时隐藏此文本框。

        private void listView1_SelectedIndexChanged(object sender, EventArgs e) {

            // should only be 1 item selected, it's not a multi-select listview
            ListView.SelectedListViewItemCollection collection = this.listView1.SelectedItems;

            if (collection.Count == 0) {
                this.label2.Visible = false;
            }    
            foreach (ListViewItem item in collection) {
                this.label2.Visible = true;
                getSideInformation(item.Text);
            }
        }

当我只是选择另一个项目时,我注意到盒子的闪烁。我通过将代码更改为:

进行了一些挖掘
        private void listView1_SelectedIndexChanged(object sender, EventArgs e) {

            // should only be 1 item selected, it's not a multi-select listview
            ListView.SelectedListViewItemCollection collection = this.listView1.SelectedItems;

            if (collection.Count == 0) {
                this.label2.Text = "Unselected all!"    
            }
            foreach (ListViewItem item in collection) {
                getSideInformation(item.Text);
            }
        }

基本上,我不再隐藏该框,但只是更改文本,如果它是选择了0项的选择更改事件。我发现这个事件实际上是为一个简单的选择另一个项目(一次是0项,第二次选择了新项目)触发TWICE。所以我的盒子总是会显示“Unselected all!”如果我之前选择了一个项目并且正在更改为另一个项目,那么它正在加载任何辅助信息。

有没有办法区分未选中的所有项目的实际事件触发与选择其他项目案例的0项目的初始触发?

5 个答案:

答案 0 :(得分:4)

您可以改为注册ListView的ItemSelectionChangedEvent。

        this.listView1.ItemSelectionChanged += this.HandleOnListViewItemSelectionChanged;

        private void HandleOnListViewItemSelectionChanged(Object sender, ListViewItemSelectionChangedEventArgs e)
        {
            if (e.IsSelected)
            {
                this.detailsLabel.Text = this.GetDetails(e.Item);
            }
            else
            {
                this.detailsLabel.Text = String.Empty;
            }
        }

答案 1 :(得分:1)

在任何可以选择多个项目的控件中,SelectedIndexChanged事件会触发两次。一,删除取消选择的项目,然后添加所选项目。当您第一次单击时,所选项目集合为空,因此它会触发一次。下次它会发射两次。

答案 2 :(得分:1)

我发现的最佳解决方案是暂时将事件处理程序设置为Application.Idle并从那里进行检查,如下所示:

bool handled;
private void listView1_SelectedIndexChanged(object sender, EventArgs e) {
    if (!handled)
    {   handled = true;
        Application.Idle += SelectionChangeDone;   }
}

private void SelectionChangeDone(object sender, EventArgs e) {
    Application.Idle -= SelectionChangeDone;
    handled = false;

    ListView.SelectedListViewItemCollection collection = this.listView1.SelectedItems;

    if (collection.Count == 0)
        this.label2.Text = "Unselected all!"

    foreach (ListViewItem item in collection)
        getSideInformation(item.Text);
}

使用ItemSelectionChanged还是SelectedIndexChanged并不重要。在这种情况下,两者都可以正常工作。

非常感谢Grammarian在这里回答了基本相同的问题:https://stackoverflow.com/a/26393234/2532220

答案 3 :(得分:0)

你可以在事件块里面使用下面的代码检查一下 SelectedIndexChange事件由于控件或由于而直接触发 来自其他一些用户控件/页面的一些回发事件

std::string

答案 4 :(得分:-1)

您可以这样做:

         private bool isInitialized = false;
         private void listView1_SelectedIndexChanged(object sender, EventArgs e) {
             if (isInitialized) {
                 ListView.SelectedListViewItemCollection collection = this.listView1.SelectedItems;

                 if (collection.Count == 0) {
                     this.label2.Text = "Unselected all!";
                 }
                 foreach (ListViewItem item in collection) {
                     getSideInformation(item.Text);
                 }
             }
             isInitialized = true;
        }

这将确保忽略第一次射击。