昨天做了多级栏目用到treeview,用数据库动态填充的.
建树是挺简单的,用递归,只是删除我用了很笨的方法.树节点的删除其实也是应该用递归,判断节点是不是父节点,是的话就删除其下的子节点,树节点的删除用remove就可以了,可是这样的话还没有删掉数据库里数据,重新加载的时候还是原来的,我用了gridview来删除,用details来增加子栏目,看起来实在是笨笨的.
还有在数据库里建了个触发器来删除子节点,这个简单的触发器花了我不少的时间,原因是一个很小的错误一直没有发现,触发器入下:
create trigger nodedel on treetopic
for delete
as
begin
if (select count(*) from treetopic,deleted where treetopic.pid=deleted.id)>0
delete treetopic from treetopic,deleted where treetopic.id=deleted.id
end
之前的错误就是在后面的delete 语句里直接delete from,看半天没有发现错误,实在是short~
建树如下:
private void treebuild()
{
string strcon = ConfigurationSettings.AppSettings["cs"];
SqlConnection cn = new SqlConnection(strcon);
string sqlstr = "select * from treetopic";
SqlDataAdapter da = new SqlDataAdapter(sqlstr ,cn );
DataSet ds = new DataSet();
da.Fill(ds);
ds.Relations.Add("rel", ds.Tables[0].Columns["id"], ds.Tables[0].Columns["pid"]);
foreach (DataRow drow in ds.Tables[0].Rows)
{
if (drow.IsNull("pid"))
{
TreeNode tn = createnode(drow["id"].ToString());
TreeView1.Nodes.Add(tn);
subtree(drow ,tn );
}
}
}
private void subtree(DataRow drow,TreeNode tnd) //子树
{
foreach (DataRow childrow in drow.GetChildRows("rel"))
{ TreeNode tnode = createnode(childrow["id"].ToString () );
tnd.ChildNodes.Add(tnode);
subtree(childrow, tnode);
}
}
private TreeNode createnode(string id)
{
TreeNode node = new TreeNode();
node.Text =id;
return node;
}
这里关键的一句是 ds.Relations.Add("rel", ds.Tables[0].Columns["id"], ds.Tables[0].Columns["pid"]);
以及后面的 foreach (DataRow childrow in drow.GetChildRows("rel"))
用到了relations的方法
另外当我在同一个页面增加子栏目的时候,树里并不会马上就更新的,我又用了个笨办法,就是在增加按钮里加了个 response.redirect 的方法,转回到这个页面,才可以看到树的更新
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步