您的位置:首页 > 编程语言 > C#

[C#]TreeView操作汇总

2016-12-05 11:58 169 查看
用到树,自然而然要想到递归

下面的例子是带CheckBox的TreeView,根据Datasource中的isvisible字段来确定是否勾选

加载,构造树形结构:

private void bindTree()
{
TreeNode RootNode = new TreeNode("总节点");
this.treeView1.Nodes.Add(RootNode);

DataRow[] dr = DataSource.Select("pnt is null");
for (int i = 0; i < dr.Length; i++)
{
TreeNode tn = new TreeNode();
tn.Text = dr[i]["name"].ToString();
tn.Tag = dr[i]["id"].ToString();
if (dr[i]["isvisible"].ToString().Equals("1"))
tn.Checked = true;
else
tn.Checked = false;
FillTree(tn, DataSource);
RootNode.Nodes.Add(tn);
}
}

private void FillTree(TreeNode node, DataTable dt)
{
DataRow[] dr = dt.Select("pnt='" + node.Tag.ToString() + "'");
if (dr.Length > 0)
{
for (int i = 0; i < dr.Length; i++)
{
TreeNode n = new TreeNode();
n.Text = dr[i]["name"].ToString();
n.Tag = dr[i]["id"].ToString();
if (dr[i]["isvisible"].ToString().Equals("1"))
n.Checked = true;
else
n.Checked = false;
if (dr[i]["pnt"].ToString() == node.Tag.ToString())
{
FillTree(n, dt);
}
node.Nodes.Add(tnn);
}
}
}


勾选某个节点CheckBox后的联动处理

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
UpdateAllChildNodesCheck(e.Node);//更新下面的所有子节点
UpdateAllparentNodesCheck(e.Node);//更新上面的所有父节点
btnSave.Enabled = true;
}
void UpdateAllparentNodesCheck(TreeNode treeNode)
{
TreeNode pnt = treeNode.Parent;

if(pnt!=null)
{
if(pnt.Checked&&!treeNode.Checked)//父节点选中,子节点未选中
{
pnt.Checked = false;
UpdateAllparentNodesCheck(pnt);//递归更新父节点的父节点
}
else if(!pnt.Checked&&treeNode.Checked)//父节点未选中,子节点选中
{
bool allCheck = true;//判断该父节点下的所有子节点是否选中
foreach(TreeNode n in pnt.Nodes)
{
if(false==n.Checked)//只要有一个子节点未选中,则父节点是未选中
{
allCheck = false;
break;
}
}
if(allCheck) //该父节点所有子节点都选中了
{
pnt.Checked = true;
UpdateAllparentNodesCheck(pnt);
}
}
}
}

void UpdateAllChildNodesCheck(TreeNode treeNode)
{
//递归更新子节点的Checkbox
foreach (TreeNode n in treeNode.Nodes)
{
n.Checked = treeNode.Checked;
if (n.Nodes.Count > 0)
{
UpdateAllChildNodesCheck(n);
}
}
}


最后对比数据源获取更新了的节点,形成sql:

List<string> sAllSql = new List<string>(255);
private List<string> GetUpdateSql(TreeNode tNode)
{
foreach (TreeNode n in tNode.Nodes)
{
if (n.Tag != null)
{
DataRow[] adr = DataSource.Select(string.Format("funcid='{0}'", n.Tag.ToString()));
if (adr.Length > 0)
{
string sCheck = n.Checked ? "1" : "0";
if (false == sCheck.Equals(adr[0]["isvisible"].ToString()))
{
sAllSql.Add(string.Format("UPDATE {0}.TAB SET isvisible='{1}' WHERE id='{2}'",
sUser, sCheck, n.Tag.ToString()));
if (n.Nodes.Count > 0)
{
GetUpdateSql(n);
}
}
else if (n.Nodes.Count > 0)
GetUpdateSql(n);
}
}
else if (n.Nodes.Count > 0)
GetUpdateSql(n);
}

return sAllSql;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: