asdio的学习园地

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

昨天做了多级栏目用到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 的方法,转回到这个页面,才可以看到树的更新

posted on 2006-04-28 08:32  帝之晓  阅读(2742)  评论(2编辑  收藏  举报