数据库的内容如下:
         ID     ConText  ParentID
1 俊秀楼 0
2 教学楼 0
3 实验楼 0
4 一楼 1
5 二楼 1
6 三楼 1
7 四楼 1
8 一楼 2
9 二楼 2
10 三楼 2
11 四楼 2
12 一楼 3
13 二楼 3
14 三楼 3
15 四楼 3
16 101 4
17 102 4
18 103 4
19 201 5
20 202 5
21 203 5
22 204 5
23 求索楼 0
24 学思楼 0
25 一楼 23
26 二楼 23
27 三楼 23
28 四楼 23
29 101 25
30 102 25
31 103 25
32 104 25
33 201 26
34 202 26
35 203 26
36 204 26
37 205 27
38 一楼 24
43 101 38
44 102 38
287 103 38
288 二楼 24
290 101 288
291 101 28
292 102 28
293 103 28
294 101 12
295 101 13
296 101 14
297 101 15
298 101 8
299 101 9
300 101 10
301 101 11
302 101 6
303 101 7
309 104 38
效果图:

现在我要在101下再加子节点灯。
因为每一栋楼里的每一层楼都可能有101
那么我应该怎么判断它是加在哪一栋,哪一层,哪一间呢?
这里就碰到子节点同名的问题,这样通过查询得到的ParentID就可能有很多种。
怎么解决?

解决方案 »

  1.   

    添加和生成节点时在Tag中存放ParentID信息
    Node1.Nodes.Add(ConText[x]);
    Node1.Nodes[x].Tag = ParentID[x];
    查询和添加时到数据库中找ConText和ParentID两个字段
      

  2.   


    ////Summary
    通过选中的这个节点的内容去查出它的ID
    问题就在于此,ID这时候查出来就有
    29 101 25 
    43 101 38
    290 101 288
    ...
    我该怎么判断啊 !
    ///Summary
                        string str = treeView1.SelectedNode.Text;//右击101,跳出菜单选择,添加子节点
                        string sql1 = "select * from Table2 where ConText ='" + str + "'";//通过选中的这个节点的内容去查出它的ID
                        DataSet ds1 = G_SqlExecute.GetDs(sql1, "T1");//获取选中节点
      

  3.   

    俊秀楼101下再加子节点
    是 ID 子节点 16
    求索楼 101下再加子节点
    是 ID 子节点 25 都是一对一的 跟子节点名字没关系 只要父节点没有重复就可以找到
      

  4.   

    string Parent= treeView1.SelectedNode.Tag
    select * from Table2 where ConText ='" + str + "' and ParentID='"+Parent+"';
      

  5.   


            private void 加入子节点ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                //首先判断是否选定组件中的位置
                if (treeView1.SelectedNode == null)
                {
                    MessageBox.Show("请选择一个节点", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else if (textBox5.Text != "")
                {
                    //创建一个节点对象,并初始化
                    TreeNode tmp;
                    tmp = new TreeNode(textBox5.Text);
                    //在TreeView组件中加入子节点
                    treeView1.SelectedNode.Nodes.Add(tmp);                if (treeView1.SelectedNode.Parent == null)
                    {
                        string str = treeView1.SelectedNode.Text;
                        string sql1 = "select * from Table2 where ConText ='" + str + "'";
                        DataSet ds1 = G_SqlExecute.GetDs(sql1, "T1");
                        AddRecord(textBox5.Text, ds1.Tables[0].Rows[0][0].ToString());
                    }
                    else
                    {
                        string str = treeView1.SelectedNode.Text;
                        string sql = "select * from Table2 where ConText ='" + str + "'";
                        DataSet ds = G_SqlExecute.GetDs(sql, "T");
                        string temp = treeView1.SelectedNode.Text;
                        string sql2 = "select * from Table2 where ConText ='" + temp + "' and ParentID ='" + ds.Tables["T"].Rows[0][0].ToString() + "'";
                        DataSet ds2 = G_SqlExecute.GetDs(sql2, "T2");
                        AddRecord(textBox5.Text, ds2.Tables["T2"].Rows[0][0].ToString());
                    }
                }
                else
                {
                    MessageBox.Show("TextBox组件必须填入节点名称!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
            }
      

  6.   

    需要判断从101多根节点的路上的每个节点是否匹配。
    也就是优秀楼/一楼/101
        还是求索楼/一楼/101。就好像windows的文件系统。
      

  7.   

    原来是这样添加的那看来节点里要存放自身节点ID和父节点ID了
      

  8.   

    ID是唯一的,把ID绑定给节点的value
      

  9.   

    Node1.Tag里放父节点ID,Node1.Name里放自身ID就OK了
      

  10.   

    select * from Table2 where ParentID =( select ParentID from Table2 where ConText ='" + temp + "' and ParentID ='" + ds.Tables["T"].Rows[0][0].ToString() + "')
    多套几个子查询 不行吗?
      

  11.   

    select * from Table2 where ID =( select ParentID from Table2 where ConText ='" + temp + "' and ParentID ='" + ds.Tables["T"].Rows[0][0].ToString() + "') 
      

  12.   


            private void Load_TreeView(int ParentID, TreeNode pNode)
            {
                DataSet ds = new DataSet();
                // 定义数据库连接
                SqlConnection CN = new SqlConnection();
                try
                {
                    //初始化连接字符串
                    CN.ConnectionString = "Data Source=192.168.24.220;Integrated Security=SSPI;" + "Initial Catalog=LightCtrDB";
                    CN.Open();
                    //添加命令,从数据库中得到数据
                    SqlCommand sqlCmd = new SqlCommand();
                    sqlCmd.Connection = CN;
                    sqlCmd.CommandText = "select * from Table2";
                    sqlCmd.CommandType = CommandType.Text;
                    SqlDataAdapter adp = new SqlDataAdapter(sqlCmd);
                    adp.Fill(ds);
                }
                catch (Exception ex)
                {
                    throw (ex);
                }
                finally
                {
                    CN.Close();
                }
                //string sql = "select * from Table2";
                //ds = G_SqlExecute.GetDs(sql,"Table2");
                DataView dvTree = new DataView(ds.Tables[0]);
                //过滤ParentID,得到当前的所有子节点
                dvTree.RowFilter = "[PARENTID] = " + ParentID;
                ArrayList Document = new ArrayList();
                foreach (DataRowView Row in dvTree)
                {
                    if (pNode == null)
                    {
                        TreeNode Node = treeView1.Nodes.Add(Row["ConText"].ToString());
                        Load_TreeView(Int32.Parse(Row["ID"].ToString()), Node);    //再次递归
                    }                else
                    {   //添加当前节点的子节点
                        TreeNode Node = pNode.Nodes.Add(Row["ConText"].ToString());
                        Document.Add(new ListViewItem(Row["ConText"].ToString(), 2));
                        pNode.Tag = Document;
                        Load_TreeView(Int32.Parse(Row["ID"].ToString()), Node);   //再次递归
                    }
                }            treeView1.ImageList = imageList1;
            }
    这是载入树节点的代码
      

  13.   

    总结一下:
    首先感谢大家的帮助,特别是Crennah
    加载树的方法,我换成了另一种,先前那一种用了递归的思想,
    每次程序一运行,那么就会加载数据库里面的数据到树视图上,
    这样既浪费时间又浪费空间,后来经过Crennah提示以及他给的参考代码,
    我换成了另外一种形式的代码,也就是当点击树节点的时候才加载它下面的子节点。
    类似于WINDOWS的目录树。///Summary
    //加载树视图代码如下:
    ///Summary
            private void Load_TreeView()
            {            string sql = "Select * from Table2 where ParentID='0'";//选取最高一层的父节点
                DataSet ds = G_SqlExecute.GetDs(sql, "T");            for (int i = 0; i < ds.Tables["T"].Rows.Count; i++)
                {
                    //加载父节点
                    TreeNode Node = new TreeNode();
                    Node.Text = ds.Tables["T"].Rows[i][1].ToString();
                    TreeView1.Nodes.Add((TreeNode)Node.Clone());//ConText                TreeView1.Nodes[i].Tag = ds.Tables["T"].Rows[i][2].ToString(); //ParentID
                    TreeView1.Nodes[i].Name = ds.Tables["T"].Rows[i][0].ToString(); //ID
                    TreeView1.Nodes[i].Nodes.Add("0"); 
                }            TreeView1.ImageList = imageList1;
            }
    /////Summary
    //展开树节点加载该树节点下的子节点:
    /////Summary
            private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)//在树结点展开之前做一些处理
            {
                e.Node.ImageIndex = 1;
                e.Node.SelectedImageIndex = 1;            TreeNode currentNode = new TreeNode();
                e.Node.Nodes.Clear();
                currentNode = e.Node;
                parent = currentNode.Name;//获取当前选中的节点的ID            string sql = "Select * from Table2 where ParentID='" + parent + "'";
                DataSet ds = G_SqlExecute.GetDs(sql, "T");
                for (int x = 0; x < ds.Tables[0].Rows.Count; x++)
                {
                    currentNode.Nodes.Add(ds.Tables[0].Rows[x][1].ToString());//ConText                currentNode.Nodes[x].Tag = ds.Tables[0].Rows[x][2].ToString();//ParentID
                    currentNode.Nodes[x].Name = ds.Tables[0].Rows[x][0].ToString();//ID
                    currentNode.Nodes[x].Nodes.Add("0");
                }
            }