Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在winform C中检查父项时如何检查所有子项?_C#_Winforms_Treeview - Fatal编程技术网

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

C# 在winform C中检查父项时如何检查所有子项?,c#,winforms,treeview,C#,Winforms,Treeview,大家好,我正在运行时动态创建树视图。我的树视图在下面。当我检查主(父)项时,子注册主和类主要自动检查 但是我不能像这样编码Node4.checked=true。因为我在运行时创建了这个树视图 请提出任何有价值的建议 更新的问题- private void MenuRights_Load(object sender, EventArgs e) { DataTable dt = new DataTable("data");

大家好,我正在运行时动态创建树视图。我的树视图在下面。当我检查主(父)项时,子注册主和类主要自动检查

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

请提出任何有价值的建议

更新的问题-

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);
            }
        }     
上面的代码帮助我创建树视图。这可能使你对我的问题有一个清晰的看法


提前感谢。

您只需遍历树即可检查每个节点

让我们假设节点是树中被选中的
TreeNode
,您希望检查该
TreeNode

CheckAllChildren(TreeNode node)
{
    foreach(TreeNode child in node.Nodes)
    {
       child.Checked = true;
       CheckAllChildren(child);
    }
}

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

让我们假设节点是树中被选中的
TreeNode
,您希望检查该
TreeNode

CheckAllChildren(TreeNode node)
{
    foreach(TreeNode child in node.Nodes)
    {
       child.Checked = true;
       CheckAllChildren(child);
    }
}

请注意,一定要完全理解您在这里提出的问题

如果您动态创建treeview,我假设您正在使用
节点添加节点。添加(…)
。只需将
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
异常。

注意,一定要完全理解您在这里提出的问题

如果您动态创建treeview,我假设您正在使用
节点添加节点。添加(…)
。只需将
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
异常。

此方法将调用自身。可以吗?可以,只要这个方法称自己为有限的,它就是完美的times@HarisHasan我尝试过这个方法,但该方法必须出现返回类型错误。我可以在这个中添加私有的void吗?哦,它可以工作,但是我想在按钮点击事件中调用这个CheckAllChildren函数。当treeview父对象单击自身时,我是如何做的。任何想法。这个方法会调用自己。它可以吗?是的,只要这个方法调用自己有限,它就完全可以times@HarisHasan我尝试过这个方法,但该方法必须出现返回类型错误。我可以在这个中添加私有的void吗?哦,它可以工作,但是我想在按钮点击事件中调用这个CheckAllChildren函数。当treeview父对象单击自身时,我是如何做的。任何想法。你需要重新思考这个用户界面。检查“系统”可能做什么?摩擦在“帮助”中最为明显。你需要重新思考这个UI。检查“系统”可能做什么?摩擦在“帮助”中最为明显。谢谢ken2k,请查看我的最新问题。这可能会给你一个明确的方式。谢谢ken2k,请查看我的更新问题。这可能会给你一个明确的方法。