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我遗漏了什么设置或者代码有问题吗?请高手施以援手~~谢谢
我创建的是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我遗漏了什么设置或者代码有问题吗?请高手施以援手~~谢谢
试试用一个quene的bfs算法来取节点。这样更加清晰。
这样要不停的读数据库。
用bfs算法,实际上你只需要读一次数据库。仔细看了下你的dfs算法,treeview应该是有node的。
除非你的数据库的数据不正常。
因为你是从0开始作为根节点的moduleid的,看看数据库中其他节点是否存在parentid=0的记录。
2、有的话,就debug下看看程序运行时各个对象的状态。
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); } } }
0 根 -1
1 aaa 0
2 bbb 1
3 ccc 1
4 ddd 2
5 eee 2
把你数据库中parentid和moduleid字段改为整型。bindtree(TreeView1.Nodes, "0"); -> bindtree(TreeView1.Nodes, 0);我怀疑你的foreach (DataRowView dr in dv)这里dr是空的。
debug看看是否为空。问题应该在这里。
当运行到第二次bindtree的时候 bindtree(Nds[Nds.Count - 1].ChildNodes, strID);中的Nds.Count的值为0是不是有问题?
to jiatong1981:我也尝试一下你的算法,谢谢 :)
所以这里出错了。为1才是正常的。
Label1.Text = tn.Value;
页面的label1中显示了结果的
to jiatong1981: TNode.Nodes.Add(tmpNd);
为什么我这里TNode后面没有Nodes这个可选呢。是不是版本的问题,我这里没有tag只有target,同理这里的nodes是不是ChildNodes?再次感谢两位
id 对应moduleid,uname对应displayname?其实我想问的就是tmpNd.Tag和tmpNd.Text中分别存放的是什么
所以这里出错了。为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是指包含几个节点呢?
这中间的parentid是哪个呢?如果说是父节点id那么这个itemid是自己本身的id吗?
盼解
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");
bindtree(Nds[Nds.Count - 1].ChildNodes, strID); -> bindtree(Nds[Nds.Count - 1].Nodes, strID);ok了。
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是?
不是说还有显示为-1的吗,如果真是-1程序就崩溃了,因为数组越界了。所以不知道4,-1是如何得来的?