IE6,ORACLE数据库,创建与数据库绑定的treeview如何设定,包括在哪些页面?
我创建的是webapplication文件,是在default.aspx里添加了一个treeview1,同时添加了相关refrence,在default.aspx.cs里添加如下代码,:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OracleClient;namespace AJAXEnabledWebApplicationtesttree
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
           if (!IsPostBack)
            {
                TreeView TreeView1 = new TreeView();
                bindtree(TreeView1.Nodes, "0");
            }
        }       private void bindtree(TreeNodeCollection Nds, string depid)
        {
            OracleConnection conn = new OracleConnection("server=kdjcy;user id=dev;password=x123456");
            OracleCommand mycommand = conn.CreateCommand();
            mycommand.CommandText = "select moduleid,displayname,parentid from modules ";
            OracleDataAdapter mydataAdapter = new OracleDataAdapter();
            mydataAdapter.SelectCommand = mycommand;            DataSet ds = new DataSet();
            conn.Open();
            mydataAdapter.Fill(ds);
            conn.Close();            DataTable mydatatable = ds.Tables[0];
            DataView dv = ds.Tables[0].DefaultView;
            string filter = "parentid ='" + depid + "'";
            dv.RowFilter = filter;
            TreeNode tn;
            string strID;
            foreach (DataRowView dr in dv)
            {
                strID = dr["moduleid"].ToString();
                if (strID != "")
                {
                    tn = new TreeNode();
                    tn.Value = dr["displayname"].ToString();
                    tn.Text = dr["moduleid"].ToString();
                    tn.ShowCheckBox = true;
                    tn.Expanded = true;
                    Nds.Add(tn);
                    bindtree(Nds[Nds.Count - 1].ChildNodes, strID);
                }
            }
        }
    }
}
现在的问题是运行后不见报错,但是在页面中不见tree的显示,请问创建我说的treeview我遗漏了什么设置或者代码有问题吗?请高手施以援手~~谢谢

解决方案 »

  1.   

    你这个dfs的算法不大好。我都用bfs来创建treeview。个人感觉是你dfs算法的问题。
    试试用一个quene的bfs算法来取节点。这样更加清晰。
      

  2.   

    你的tree不是通过设计界面拖进来的?
      

  3.   

    这个tree是用dfs创建的。
    这样要不停的读数据库。
    用bfs算法,实际上你只需要读一次数据库。仔细看了下你的dfs算法,treeview应该是有node的。
    除非你的数据库的数据不正常。
    因为你是从0开始作为根节点的moduleid的,看看数据库中其他节点是否存在parentid=0的记录。
      

  4.   

    to jiatong1981:我的tree是设计界面拖进来的,ds里经测试也有数据的to Efcndi:我先研究研究宽度优先与深度优先算法,我看的算法基本都是bfs的……还要研究下
      

  5.   

    1、检查一下数据库有没有parentid=0的记录
    2、有的话,就debug下看看程序运行时各个对象的状态。
      

  6.   

    无论深度优先 还是广度优先 都应该可以读出树只是遍历方式的不同 参考如下代码
    this.intiTree(null, -1);//根节点的父id为-1
    ………………
     private void intiTree(TreeNode TNode, int parentId)
            {            DataView dv = new DataView(ds.Tables[0]);
                TreeNode tmpNd;
                int intId;
                dv.RowFilter = "itemid=" + parentId;
                foreach (DataRowView drv in dv)
                {
                    tmpNd = new TreeNode();
                    if (TNode == null)
                    {
                        tmpNd.Tag = drv["id"].ToString();
                        tmpNd.Text = drv["uname"].ToString();
                        intId = Convert.ToInt32(tmpNd.Tag);
                        intiTree(tmpNd, intId);
                        this.treeView1.Nodes.Add(tmpNd);
                    }
                    else
                    {
                        tmpNd.Tag = drv["id"].ToString();
                        tmpNd.Text = drv["uname"].ToString();
                        intId = Convert.ToInt32(tmpNd.Tag);
                        TNode.Nodes.Add(tmpNd);
                        intiTree(tmpNd, intId);                }            }        }
      

  7.   

    to Efcndi:刚才说错了,我暂时先用dfs实现看看,数据库中存在parentid = 0的节点的,是不是还要对treeview1中的设置进行什么修改呢?
      

  8.   

    id uname ItemID
    0 根 -1
    1 aaa 0
    2 bbb 1
    3 ccc 1
    4 ddd 2
    5 eee 2
      

  9.   

    如jiatong1981的那样,使用整型来读看看。
    把你数据库中parentid和moduleid字段改为整型。bindtree(TreeView1.Nodes, "0"); -> bindtree(TreeView1.Nodes, 0);我怀疑你的foreach (DataRowView dr in dv)这里dr是空的。
    debug看看是否为空。问题应该在这里。
      

  10.   

    to   Efcndi:debug的时候,treeview1.nodes.count =4,我数据库中共5条数据,其中一条的parentid =0,所以count = 4?这里的nodes.count是指什么样的节点数目呢?
    当运行到第二次bindtree的时候               bindtree(Nds[Nds.Count - 1].ChildNodes, strID);中的Nds.Count的值为0是不是有问题?
    to jiatong1981:我也尝试一下你的算法,谢谢 :)
      

  11.   

    treeview1.nodes.count 是根节点的子节点的数目。不包括子节点的子节点。
    所以这里出错了。为1才是正常的。
      

  12.   

    to       Efcndi:dr里的值为{System.Data.DataRowView},不会是这里的问题吧,因为我在foreach循环中加入给label判断的时候是可以,具体是:  if (tn.Value == "根节点")
                                            Label1.Text = tn.Value;
    页面的label1中显示了结果的
    to   jiatong1981: TNode.Nodes.Add(tmpNd);
    为什么我这里TNode后面没有Nodes这个可选呢。是不是版本的问题,我这里没有tag只有target,同理这里的nodes是不是ChildNodes?再次感谢两位
      

  13.   

    to jiatong1981 :我的表里数据分别是 moduleid displayname parentid,哪个能够对应你代码中的itemid呢?
    id 对应moduleid,uname对应displayname?其实我想问的就是tmpNd.Tag和tmpNd.Text中分别存放的是什么
      

  14.   

    to Efcndi:“treeview1.nodes.count   是根节点的子节点的数目。不包括子节点的子节点。 
    所以这里出错了。为1才是正常的。”
    我的表中数据是这样的:
    MODULEID      DISPLAYNAME PARENTID
    AAAAAAA_AAAC  二层节点2    AAAAAAA_AAAA
    AAAAAAA_AAAB  二层节点1    AAAAAAA_AAAA
    AAAAAAA_AAAA  一层节点      0
    AAAAAAA_AAba  三层节点11   AAAAAAA_AAAB
    AAAAAAA_AAca  三层节点21   AAAAAAA_AAAC为什么开始的时候的treeview1.nodes.count是4呢,4是指包含几个节点呢?
      

  15.   

    眼神不大好,没看到jiaTong1981的说明但是我还是不明白             dv.RowFilter = "itemid=" + parentId;
    这中间的parentid是哪个呢?如果说是父节点id那么这个itemid是自己本身的id吗?
    盼解
      

  16.   

    我写的是winform下的treeview控件有所不同 但是思想是一样的领会精神~~
      

  17.   

    lz你的dfs的算法是正确的。我在本地已经做了测试了。产生问题在于
    protected void Page_Load(object sender, EventArgs e)
    {
       if (!IsPostBack)
       {
           //
           //note: 这个treeview1没有显示到界面上?!?!!!
            //
           TreeView TreeView1 = new TreeView(); 
           bindtree(TreeView1.Nodes, "0");
       }
    }解决: 拖一个treeview到你的页面。TreeView TreeView1 = new TreeView(); 
    bindtree(TreeView1.Nodes, "0");改为 bindtree(treeView1.Nodes, "0");
      

  18.   

    lz这里也要改:TreeNode tn; -> TreeNodeCollection tn;
    bindtree(Nds[Nds.Count - 1].ChildNodes, strID); -> bindtree(Nds[Nds.Count - 1].Nodes, strID);ok了。
      

  19.   

    谢谢了……其实我是拖了一个treeview在页面上的,结果这里没注意又搞了一个treeview,画蛇添足了……我就说jiatong1981的代码可以,为什么我的不可以,看起来一样的啊……原来就是这个问题……谢谢efcndi和jiatong1981了,问题解决~
      

  20.   

    谢谢efcndi了,我们的vs可能版本不同,我这里不需要修改的,再次感谢,还有点问题:
    treeview1.nodes.count       是根节点的子节点的数目。不包括子节点的子节点。   
    所以这里出错了。为1才是正常的。” 
    我的表中数据是这样的: 
    MODULEID             DISPLAYNAME   PARENTID 
    AAAAAAA_AAAC     二层节点2         AAAAAAA_AAAA 
    AAAAAAA_AAAB     二层节点1         AAAAAAA_AAAA 
    AAAAAAA_AAAA     一层节点             0 
    AAAAAAA_AAba     三层节点11       AAAAAAA_AAAB 
    AAAAAAA_AAca     三层节点21       AAAAAAA_AAAC 为什么开始的时候的treeview1.nodes.count是4呢,4是指包含几个节点呢?
    这个4是?
      

  21.   

    这个4是debug的时候显示为“4”?不会的。
    不是说还有显示为-1的吗,如果真是-1程序就崩溃了,因为数组越界了。所以不知道4,-1是如何得来的?
      

  22.   

    算了,先不管这个了,呵呵,先不求甚解一次吧,应该是开始的treeview1没删除的原因,现在初始nodes。count是1了,结帖了