大家好我在运行时动态创建树视图。我的树视图如下。当我检查Master(Parent)时,Child Register Masters和Class Masters想要自动检查。
但我不能像这样编码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);
}
}
上面的代码帮我创建了树视图。这可能会让您清楚地了解我的问题。
提前致谢。
答案 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
异常