郁闷了一天 本来递归是很easy的!!
可是C#中的对象是 引用传递的 实在不明白错误再哪里
贴出代码
大家可以自己生成一个DataView
外部调用InitTreeView("0");private void InitTreeView(string orgId)
{
DataView DvOrgTree=new DataView();
DvOrgTree =DTable.Tables[0].DefaultView;
DvOrgTree.RowFilter = "UpOrgID =" + orgId;
foreach(DataRowView drv in DvOrgTree)
{
TreeNode tmpTn=new TreeNode();
tmpTn.ID=drv["OrgId"].ToString();
tmpTn.Text=drv["OrgName"].ToString();
//判断是否存在子节点
InitTreeView(tmpTn.ID);
}
}
问题是当循环到空节点的时候 返回上一级的时候 出问题了!
大家帮看看!!
可是C#中的对象是 引用传递的 实在不明白错误再哪里
贴出代码
大家可以自己生成一个DataView
外部调用InitTreeView("0");private void InitTreeView(string orgId)
{
DataView DvOrgTree=new DataView();
DvOrgTree =DTable.Tables[0].DefaultView;
DvOrgTree.RowFilter = "UpOrgID =" + orgId;
foreach(DataRowView drv in DvOrgTree)
{
TreeNode tmpTn=new TreeNode();
tmpTn.ID=drv["OrgId"].ToString();
tmpTn.Text=drv["OrgName"].ToString();
//判断是否存在子节点
InitTreeView(tmpTn.ID);
}
}
问题是当循环到空节点的时候 返回上一级的时候 出问题了!
大家帮看看!!
是用DataView 数据筛选
这样 用于不是太大得数据集 这样就可以减少访问数据库的次数 一次就可以了
private void InitTree(TreeNodeCollection Nds,string parentId)
{
DataView dv=new DataView
TreeNode tmpNd;
string intId;
dv.Table=ds.Tables["tree"];
dv.RowFilter="ParentId='" + parentId + "'";
foreach(DataRowView drv in dv)
{
tmpNd=new TreeNode();
tmpNd.ID=drv["NodeId"].ToString();
tmpNd.Text=drv["NodeName"].ToString();
tmpNd.ImageUrl="images/"+drv["Icon"].ToString();
rConn=new OracleConnection(cn);
string strCounts1="select count(*) from bresource where ParentId="+drv["NodeId"];
OracleCommand Comm = new OracleCommand(strCounts1, rConn);
rConn.Open();
int nCount = Convert.ToInt32(Comm.ExecuteScalar());
rConn.Close();
if (nCount==0)
tmpNd.NavigateUrl=drv["Address"].ToString();
else
{
tmpNd.NavigateUrl=drv["Address"].ToString()+"?id="+drv["NodeId"].ToString();
}
Nds.Add(tmpNd);
intId=drv["ParentId"].ToString();
InitTree(tmpNd.Nodes,tmpNd.ID);
}
}
我就是不想 每次都走数据库
才考虑采用DataView
id就有用了。
不过我认为应该没有关系吧
递归中 每个DataView是过程级的 所以的内存空间 肯定是不一样的!
但是当执行到空子集中 再返回回去的时候 就发现DataView 居然是空子集的DataView