【问题标题】:List View Item.Selected = false cause all the checkboxes uncheckedList View Item.Selected = false 导致所有复选框未选中
【发布时间】:2018-08-03 07:42:28
【问题描述】:

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

  • 项目1
  • 项目2
  • 项目3
  • 项目4

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

如果我将多选属性更改为 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;
        }
    }
}

【问题讨论】:

  • "others are beeing unchecked in the same time" 你的意思是其他人都没有被选中?
  • 不,其他复选框未选中。
  • 您不指望的是,取消选中一个框会为所有选定的项目取消选中它。功能,不是错误,但不是你现在喜欢的。没有属性可以覆盖此行为,您将不得不放弃强制选中的项目始终被选中。
  • 感谢您的帮助。那我就放弃了。

标签: c#


【解决方案1】:

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

代码如下:

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 都会调用。首先,我们检查一个框是否未被选中。我们检查您的鼠标光标下的 ListViewItem 是否是我们当前所在的那个项目。如果不是,我们将 NewValue 更改为选中,因此它不会被取消选中。 这样,只有我们点击的项目才会被取消选中。 当您离开复选框的几个像素时,它就不起作用,因为这就是 Listview 中的选择的工作方式。但是有了这个代码,应该很容易理解如何改变它。

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

【讨论】:

    猜你喜欢
    • 2017-02-18
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    相关资源
    最近更新 更多