列表视图Item.Selected = false导致未选中所有复选框

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列表视图Item.Selected = false导致未选中所有复选框相关的知识,希望对你有一定的参考价值。

c#有问题。我有一个带有复选框的列表视图和4个项目。

  • ITEM1
  • ITEM2
  • 项目3
  • ITEM4

我希望选中该项目,如果用户选中其复选框,则取消选中用户取消选中其复选框。问题是,当我取消选中一个复选框时,其他人同时取消选中。

如果我将multiselect属性更改为false,复选框应该按原样运行,但我想选择多个项目。

private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e)

    foreach(ListViewItem lvi in listView1.Items)
    
        if(lvi.Checked == true)
        
            lvi.Selected = true;
        
        else
        
            lvi.Selected = false;
        
    

答案

我有类似的问题。我同步了行选择和复选框。

这是代码:

private void ListView1_ItemChecked(object sender, ItemCheckedEventArgs e)

   for (int i = 0; i < listView1.Items.Count; i++)
   
      listView1.ItemSelectionChanged -= ListView1_ItemSelectionChanged;
      listView1.ItemCheck -= ListView1_ItemCheck;
      listView1.Items[i].Selected = listView1.Items[i].Checked;
      listView1.ItemSelectionChanged += ListView1_ItemSelectionChanged;
      listView1.ItemCheck += ListView1_ItemCheck;
   
 

private void ListView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)

   for (int i = 0; i < listView1.Items.Count; i++)
   
      listView1.ItemChecked -= ListView1_ItemChecked;
      listView1.ItemCheck -= ListView1_ItemCheck;
      listView1.Items[i].Checked = listView1.Items[i].Selected;
      listView1.ItemChecked += ListView1_ItemChecked;
      listView1.ItemCheck += ListView1_ItemCheck;
   
 

private void ListView1_ItemCheck(object sender, ItemCheckEventArgs e)

   if (e.NewValue != CheckState.Unchecked) return;
   Point locaPoint = listView1.PointToClient(MousePosition);
   ListViewItem prevHoverdItem = listView1.GetItemAt(locaPoint.X, locaPoint.Y);
   if (prevHoverdItem == null) return;
   if (prevHoverdItem != listView1.Items[e.Index]) e.NewValue = CheckState.Checked;

卸载事件非常重要,以防止循环。 ItemCheck事件是在Checkboxes获得更改时调用的事件以及每个Checkbox的事件。首先,我们检查一个框是否未经检查。我们检查Mouse Cursor下的ListViewItem是否是我们当前所在的Item。如果没有,我们将NewValue更改为选中,因此不会取消选中。这样,只有我们点击的项目才会被取消选中。如果你是Checkbox的几个像素,那么它不起作用,因为这就是Listview中的选择是如何工作的。但是使用该代码,应该很容易理解如何改变它。

PS。:我希望我没有弄乱代码,因为我将其复制出一个包含更多代码的项目,并迅速更改了名称。

以上是关于列表视图Item.Selected = false导致未选中所有复选框的主要内容,如果未能解决你的问题,请参考以下文章

WPF 自定义用户控件绑定在列表视图中始终返回 false

在按钮上单击列表视图中列的可见性应设置为 false

创建列表视图后查看持有人警告

QTreeView setStyleSheet无效

使用列表视图项单击反应本机模式

自定义列表视图中的切换开关使列表视图无法点击