如何在winform C#中检查父项时检查所有孩子?

时间:2012-02-01 12:39:55

标签: c# winforms treeview

大家好我在运行时动态创建树视图。我的树视图如下。当我检查Master(Parent)时,Child Register Masters和Class Masters想要自动检查。

但我不能像这样编码Node4.checked = true。因为我在运行时创建了这个树视图。

请提出任何有价值的建议。

enter image description here

更新问题 -

private void MenuRights_Load(object sender, EventArgs e)
        {            
            DataTable dt = new DataTable("data");
            dt.Columns.Add("id", typeof(int));           
            dt.Columns.Add("menu_name");
            dt.Columns.Add("parentid", typeof(int));
            dt.Columns.Add("menu_key");           

            hp.getConnStr();
            MySqlConnection connection = new MySqlConnection(hp.myConnStr);
            MySqlCommand command = new MySqlCommand("select * from mcs_menu_details", connection);
            connection.Open();
            MySqlDataReader Reader = command.ExecuteReader();
            while (Reader.Read())
            {
                //dt.Rows.Add(new string[] { Reader[0].ToString(), Reader[1].ToString(), Reader[2].ToString(), Reader[3].ToString() });
                DataRow row = dt.NewRow();
                row["id"] = Convert.ToInt32(Reader[0].ToString());
                row["menu_name"] = Reader[1].ToString();
                if (Reader[2].ToString() != Convert.ToString(0))
                {
                    row["parentid"] = Convert.ToInt32(Reader[2].ToString());
                }
                else { row["parentid"] = DBNull.Value; }
                row["menu_key"] = Reader[3].ToString();
                dt.Rows.Add(row);             
            }
            connection.Close();

            //Use a DataSet to manage the data
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            //add a relationship
            ds.Relations.Add("rsParentChild", ds.Tables["data"].Columns["id"],ds.Tables["data"].Columns["parentid"]);

            foreach (DataRow dr in ds.Tables["data"].Rows)
            {
                if (dr["parentid"] == DBNull.Value)
                {
                    TreeNode root = new TreeNode(dr["menu_name"].ToString());
                    root.Tag = dr["menu_key"].ToString();
                    treeView1.Nodes.Add(root);
                    PopulateTree(dr, root);
                }
            }
            treeView1.ExpandAll();
        }

        public void PopulateTree(DataRow dr, TreeNode pNode)
        {
            foreach (DataRow row in dr.GetChildRows("rsParentChild"))
            {
                TreeNode cChild = new TreeNode(row["menu_name"].ToString());
                cChild.Tag = row["menu_key"].ToString();
                pNode.Nodes.Add(cChild);
                //Recursively build the tree
                PopulateTree(row, cChild);
            }
        }     

上面的代码帮我创建了树视图。这可能会让您清楚地了解我的问题。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您可以简单地遍历树来检查每个节点

假设节点是树中的TreeNode,我们会检查这个TreeNode

的所有子节点
CheckAllChildren(TreeNode node)
{
    foreach(TreeNode child in node.Nodes)
    {
       child.Checked = true;
       CheckAllChildren(child);
    }
}

答案 1 :(得分:2)

请务必完全理解您在这里要求的内容....

如果您动态创建树视图,我假设您使用Nodes.Add(...)添加节点。只需将Checked指定为true即可检查插入的节点。

private void MainForm2_Load(object sender, EventArgs e)
{
    TreeNode newNode = new TreeNode
    {
        Text = "Mytext",
        Checked = true
    };

    this.treeView1.Nodes.Add(newNode);
}

如果要在运行时检查子节点,只需执行一些这样的递归:

private void button1_Click(object sender, EventArgs e)
{
    if (this.treeView1.SelectedNode != null)
    {
        this.CheckChildrens(this.treeView1.SelectedNode);
    }
}

private void CheckChildrens(TreeNode node)
{
    node.Checked = true;

    foreach (TreeNode child in node.Nodes)
    {
        this.CheckChildrens(child);
    }
}

但是请不要在CheckChildrens(...)事件处理程序中直接调用AfterCheck(如果要将新的已检查节点考虑在内),否则您将有一个很好的StackOverflow异常