【问题标题】:Unchecking ListViewItems recursively递归取消选中 ListViewItems
【发布时间】:2014-06-09 21:26:44
【问题描述】:

我有一个 ListView,里面有级联复选框。如果未选中父框,我想做的是能够取消选中所有子框(同样,如果选中了父框,我想检查所有子框)。目前,如果我选中或取消选中某个框,父节点和子节点将显示为灰色,但子框上仍然可以看到复选标记。

我认为我必须递归地执行此操作。我已经尝试了以下代码,我认为它应该可以工作,但是由于转换问题,它在运行时会中断。

private void listViewChildNodeModifier(ListViewItem item)
  {
     if (item.SubItems.Equals(null)) return;
     else
     {
        foreach (ListViewItem childItem in item.SubItems)
        {
           listViewChildNodeModifier(childItem);
           if(childItem.Tag is TestingNode)
              ((TestingNode)childItem.Tag).Enabled = item.Checked;
        }
     }
  }

【问题讨论】:

    标签: c# listview user-interface recursion checkbox


    【解决方案1】:

    你不能这样做吗

    foreach (ListViewItem item in this.ListView.Items)
    {            
        for (int i = 0; i < item.SubItems.Count; i++)
        {
            item.SubItems[i].Checked = false; 
            //will something like this work for you let me know
        }
    }
    

    另一种也应该起作用的替代方法如下

    foreach (ListViewItem.ListViewSubItem childItem in item.SubItems)
     {
       if(item.Checked)
       {
         item.Checked = false;
       }
     }
    

    【讨论】:

    • 不,我在 API 中没有看到 SelectedItems 这样的属性:msdn.microsoft.com/en-us/library/…
    • 问题是item.SubItems() 返回ListViewSubItems 的集合而不是ListViewItem。不幸的是,据我所知,没有属性可以让我选中或取消选中 ListViewSubItem(再说一次,我上周刚学 C#,所以很有可能我错了哈哈)
    • 让我知道这是否有助于您需要内部循环通过索引位置访问子项,在这种情况下为i
    • 不确定是否要检查现有的 CheckedState 或者我是否假设您想将它们设置为 false 无论如何.. 更改代码以符合您的条件 :) 祝您好运
    • 还在看这个,明天我回到办公室时可能会更好看。但是对于第二个,除了禁用当前选中的框之外,它还能做什么呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2018-04-13
    • 2022-11-18
    • 2012-07-22
    • 2018-10-28
    相关资源
    最近更新 更多