捕获 ListView 中取消全选的情况 -- SelectedIndexChanged 触发两次

kha*_*les 4 c# 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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

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

        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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

基本上,我不再隐藏该框,但如果是选择了 0 个项目的选择更改事件,则只需更改文本。我发现,对于简单的选择另一个项目,此事件实际上会触发两次(一次是 0 个项目,第二次是选择的新项目)。所以我的盒子总是显示“全部取消选择!” 如果我之前选择了一个项目并更改为另一个项目,则它会加载任何辅助信息。

有没有什么方法可以区分所有未选择项目的实际事件触发与选择另一个项目的情况下初始触发 0 个项目?

Vij*_*iri 5

您可以改为注册 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;
            }
        }
Run Code Online (Sandbox Code Playgroud)