写了个简单的树形结构,想获取每个节点的值,但是点击父节点使用TreeView的SelectedNode可以获取选中的节点,而点击子节点的时候SelectedNode的值为null,什么原因呢?也在网上查了一些资料,但是,基本上都是通过各种方法使用SelectedNode获取,有什么可能的原因导致点击选中子节点而SelectedNode的值为null呢?

解决方案 »

  1.   

    可以是可以,不过还要自己写样式和js事件,太麻烦,不如treeview现成的来的方便啊
      

  2.   

    是不是因为你点击node的时候postback了,页面刷新了回到初始状态
    这个时候selectednode就是没有选中的加载树的时候,判断下postback
      

  3.   

    判断了postback了,postback的时候也只是父节点选中有值,而点击子节点没有值
      

  4.   

    没有什么前台代码,就
    <div style="float:left;">
                    <asp:TreeView ID="CategoryView" runat="server">
                    </asp:TreeView>
                </div>
    这么简单
      

  5.   


    看到的,点击拿不到值,那么问题肯定出在后台绑定父节点和子节点的问题上了,LZ上TREEVIEW绑定数据时的代码吧
      

  6.   

    private void CategoryNodeBind()
            {
                string sqlCommand = "SELECT * FROM DBO.Category WHERE ID=PARENTID";
                DataTable parentData = GetCategories(sqlCommand);
                for (int i = 0; i < parentData.Rows.Count; i++)
                {
                    TreeNode parentNode = new TreeNode();
                    parentNode.Text = parentData.Rows[i]["Name"].ToString();
                    parentNode.Value = parentData.Rows[i]["Id"].ToString();
                    parentNode.NavigateUrl = parentData.Rows[i]["CatalogEditUrl"].ToString();
                    this.CategoryView.Nodes.Add(parentNode);
                    SubCategoryNodeBind(parentNode);
                }
            }        private void SubCategoryNodeBind(TreeNode parentNode)
            {
                string sqlCommand = "SELECT * FROM DBO.CATEGORY WHERE PARENTID='" + parentNode.Value + "'";
                DataTable childData = GetCategories(sqlCommand);
                for (int i = 0; i < childData.Rows.Count; i++)
                {
                    TreeNode childNode = new TreeNode();
                    childNode.Text = childData.Rows[i]["Name"].ToString();
                    childNode.Value = childData.Rows[i]["Id"].ToString();
                    childNode.NavigateUrl = childData.Rows[i]["CatalogEditUrl"].ToString();
                    parentNode.ChildNodes.Add(childNode);
                }
            }父节点和子节点的绑定方式是一样的,如果出问题那父节点怎么不出问题啊
      

  7.   


    特地试了下,代码没什么问题嘛至少我这里好的,感觉问题应该出在LZ的datatable上,看看子节点的datatable的ROWS.COUNT和里面的数据是否正确吧。
    另外你2个SELECT语句查的都是一张表,一个是ID=PARENTID,一个是PARENTID=‘’,ID怎么会=字符的
      

  8.   

    刚刚点错了,真是不好意思
    数据也是有的,米有问题的,如果datatable有问题,是什么问题影响点击子节点取值呢?
      

  9.   

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;namespace WebApplication1
    {
        public partial class WebForm3 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    CategoryNodeBind();
                }
            }        private void CategoryNodeBind()
            {
                //string sqlCommand = "SELECT * FROM DBO.Category WHERE ID=PARENTID";
                DataTable parentData = createdb();//GetCategories(sqlCommand);
                for (int i = 0; i < parentData.Rows.Count; i++)
                {
                    TreeNode parentNode = new TreeNode();
                    parentNode.Text = parentData.Rows[i]["Name"].ToString();
                    parentNode.Value = parentData.Rows[i]["Id"].ToString();
                    //parentNode.NavigateUrl = parentData.Rows[i]["CatalogEditUrl"].ToString();
                    this.TreeView1.Nodes.Add(parentNode);
                    SubCategoryNodeBind(parentNode);
                }
            }        private void SubCategoryNodeBind(TreeNode parentNode)
            {
                //string sqlCommand = "SELECT * FROM DBO.CATEGORY WHERE PARENTID='" + parentNode.Value + "'";
                DataTable childData = createsubdb();//GetCategories(sqlCommand);
                for (int i = 0; i < childData.Rows.Count; i++)
                {
                    TreeNode childNode = new TreeNode();
                    childNode.Text = childData.Rows[i]["Name"].ToString();
                    childNode.Value = childData.Rows[i]["Id"].ToString();
                    //childNode.NavigateUrl = childData.Rows[i]["CatalogEditUrl"].ToString();
                    parentNode.ChildNodes.Add(childNode);
                }
            }        public DataTable createdb()
            {
                DataTable db = new DataTable();
                DataColumn dc;
                dc = new DataColumn("Name", System.Type.GetType("System.String"));
                db.Columns.Add(dc);
                dc = new DataColumn("Id", System.Type.GetType("System.Int32"));
                db.Columns.Add(dc);
                DataRow dr;
                for (int i = 0; i < 3; i++)
                {
                    dr = db.NewRow();
                    dr[0] = "name" + i;
                    dr[1] = 1 + i;
                    db.Rows.Add(dr);
                }
                
                return db;
            }
            public DataTable createsubdb()
            {
                DataTable db = new DataTable();
                DataColumn dc;
                dc = new DataColumn("Name", System.Type.GetType("System.String"));
                db.Columns.Add(dc);
                dc = new DataColumn("Id", System.Type.GetType("System.Int32"));
                db.Columns.Add(dc);
                DataRow dr;
                for (int i = 0; i < 3; i++)
                {
                    dr = db.NewRow();
                    dr[0] = "sub"+ i;
                    dr[1] = 1+i;
                    db.Rows.Add(dr);
                }            return db;
            }        protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
            {
                TreeNode aaa = TreeView1.SelectedNode;
                string aa = aaa.Value;
            }
        }
    }照LZ改的,完全OK通过
      

  10.   

    我去~~~果然粗心大意害死人啊,楼上的你看出来问题出在哪儿了吗?就毁在我那个NavigateUrl 上了,父节点的NavigateUrl 属性赋值的语句被我屏蔽了,而子节点的忽略了,没有屏蔽,所以……苍天啊~~~谢谢啦!