【问题标题】:set Check to treeView checkbox将检查设置为 treeView 复选框
【发布时间】:2015-06-26 17:10:22
【问题描述】:

我有一个TreeView,每个项目都有不同的代码。
用户可以检查 5 个项目并保存它们。然后我有一个treeView的节点代码列表。
我想向用户显示表单加载中的检查项目。 但是我的代码不起作用。 有人可以帮帮我吗?

这是我的代码:

private void chechTreeViewItems(List<int> remID)
    {
        foreach ( System.Windows.Forms.TreeNode item in this.tvRemark.Nodes)
        {
            for (int i = 0; i < remID.Count; i++)
            {
                if (Convert.ToInt16(item.Tag)== remID[i])
                {
                     item.Checked = true;
                }
            }

        }

    }

我认为这段代码无法追踪子节点。

【问题讨论】:

  • 你是在写WPF还是winform应用?
  • 你的节点列表是扁平树还是层次结构?
  • 分层,但只有一个父母和大约 20 个孩子
  • 如果所有孩子都有相同的父母,那么你所要做的就是在this.tvRemark.Nodes[0].Nodes上运行你的循环,也许还要检查this.tvRemark.Nodes[0]
  • 那么你不能只用一个for循环访问所有的子节点。你必须递归循环。如果您想了解如何递归循环的示例,请询问我。

标签: c# winforms checkbox treeview


【解决方案1】:

做这样的事情:

private void ChechTreeViewItems(List<int> remId)
    {
        foreach (TreeNode item in this.Nodes)
        {
            if (remId.Contains(item.Tag))
            {
                item.IsChecked = true;
            }

            if (item.Children != null)
            {
                this.CheckChildTreeNodes(item.Children, remId);
            }
        }
    }

并调用递归CheckChildTreeNodes 方法来确保相应地检查子节点。

private void CheckChildTreeNodes(IEnumerable<TreeNode> childnodes, ICollection<int> remId)
    {
       if (childnodes==null)
       {
          return;
       }
        foreach (TreeNode node in childnodes)
        {
            if (remId.Contains(node.Tag))
            {
                node.IsChecked = true;
            }
            this.CheckChildTreeNodes(node.Children, remId);
        }
    }

【讨论】:

    【解决方案2】:

    如果只有一个根节点有多个子节点(只有一层),那么这里不需要递归。只需正确设置 foreach 循环中的根节点即可:

    private void chechTreeViewItems(List<int> remID)
    {
        foreach (System.Windows.Forms.TreeNode item in this.tvRemark.Nodes[0].Nodes)
        {
            for (int i = 0; i < remID.Count; i++)
            {
                if (Convert.ToInt16(item.Tag) == remID[i])
                {
                    item.Checked = true;
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      在你的帮助下,我刚刚解决了我的问题。

      private void chechTreeViewItems(List<int> remID)
          {
              for (int i = 0; i < remID.Count; i++)
              {
      
                  foreach (System.Windows.Forms.TreeNode item in this.tvRemark.Nodes[0].Nodes)
                  {
      
                      if (Convert.ToInt16(item.Tag) == remID[i])
                      {
                          item.Checked = true;
                      }
                  }
      
              }
      
          }
      

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 1970-01-01
        • 2019-02-22
        • 2013-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-29
        • 2017-10-14
        相关资源
        最近更新 更多