追求新生活 名字2008

活着的意义

treeview学习2之体验报告:绑定数据(递归算法),增加节点,删除节点

在网上google了几天,虽然和我的思路有不同,但也有些启示,其中递归算法是借鉴了"hm86"博友
费话不多讲,先设计数据库简单点:
id,menu_name,parent_id,level,menu_link,其中parent_id是基于父节点menu_name的子节点,所以看parent-id对照menu-name就知道父节点了,后有应用例子
cs代码:
Page_Load(object sender, EventArgs e)
{
 if(!IsPostBack)
          {                   
         TreeView_root_load();        
         TreeView1.ShowCheckBoxes = TreeNodeTypes.All;
         TreeView1.Attributes.Add("onclick", "postBackByObject()"); //注册客户端事件
          }
}
当然要声明函数啦,有些人取数据用dataview,我暂时还不很习惯,我用DataTable

 private void  TreeView_root_load()//根入先
    {
        DataTable get_site_menu = dbcenter.accessGetDataSet("select * from menu_site where level='0'").Tables[0];//得到表的数据集
        for (int i = 0; i <= get_site_menu.Rows.Count - 1; i++)
        {
            TreeNode node = new TreeNode();
            node.Text = get_site_menu.Rows[i]["menu_name"].ToString();
             TreeView1.Nodes.Add(node);
             node.SelectAction = TreeNodeSelectAction.Expand;//不导航
              AddChildNodes(node);//递归入
             }

    }
    private void AddChildNodes(TreeNode ChildNode)
    {
        string  parent_id = ChildNode.Value.ToString();
        DataTable get_site_menu_child = dbcenter.accessGetDataSet("select * from menu_site where parent_id='" + parent_id + "'").Tables[0];//得到子的数据集       

        for (int j = 0; j <= get_site_menu_child.Rows.Count - 1; j++)
        {
            TreeNode node = new TreeNode();
              node.Text = get_site_menu_child.Rows[j]["menu_name"].ToString();
                ChildNode.ChildNodes.Add(node);
                node.SelectAction = TreeNodeSelectAction.Expand;
                AddChildNodes(node);
             }      

    }

//在数据库中删除,先删根,再删子节点,目前支持两级,可以开发为递归删除子节点
开始时候定义好
public static string tmp_node_text ;
而且在选定节点时候回发,接收到选定的tmp_node ,参考上一篇blog,tmp_node为选定的节点
TreeView1_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
    {
        tmp_node_text = e.Node.Text;
        tmp_node = e.Node;
}
tmp_node_text 为选定的节点的属性在这里用到了
protected void Button10_Click(object sender, EventArgs e)//在数据库中删除
    {   
        string sql_check_node = "select * from menu_site where menu_name='" + tmp_node .Text  + "'";
        if (tmp_node.Text != "" && dbcenter.accessGetDataSet(sql_check_node).Tables[0].Rows.Count > 0)
        {
            string sql_del_node="delete * from menu_site where menu_name='" + tmp_node .Text  + "'";
            string sql_del_node_2 = "delete * from menu_site where parent_id='" + dbcenter .accessGetDataSet (sql_check_node ).Tables [0].Rows[0]["menu_name"].ToString() + "'";
            OleDbConnection conn = dbcenter.Acce_Conn();
            conn.Open();
            OleDbCommand cmd = new OleDbCommand(sql_del_node, conn);//删根
            cmd.ExecuteNonQuery();
            OleDbCommand cmd2 = new OleDbCommand(sql_del_node_2 , conn);//删子
            cmd2.ExecuteNonQuery();
            conn.Close();           
        }

        Response.Redirect("site_install_01.aspx");//一定要本页刷新,否则不出效果
    }

到增加节点的环节了
 protected void Button8_Click(object sender, EventArgs e)
    {
        string sql_check_node = "select * from menu_site where menu_name='"+TextBox46 .Text +"'";
        if (TextBox46.Text != "" && dbcenter.accessGetDataSet(sql_check_node).Tables[0].Rows.Count ==0)//如果数据库中没有该节点,则增加
        {
            TreeNode tm_node = new TreeNode();
            tm_node.Text = TextBox46.Text;
            TreeView1.Nodes.Add(tm_node);
            //写入库代码省略...
        }
        else
        {
            Response.Write("<script language=javascript>alert('节点不能为空或者不能与已有节点冲突')</script>");
         }
      
    }
好了,总结一下,原来treeview这么多东西要研究,真是不简单啊。我有两天研究没有一点进展,总是闷闷不乐,不过幸好有研究的兴趣,又终于有小小突破啦.快学习啊。要不,真是很落后噶啦.!!!

posted on 2009-08-21 23:24  pyman  阅读(499)  评论(0编辑  收藏  举报

导航