用递推的方法根据给定的OrgID,推出所有的上级单位,将其存入一个ArrayList, 以下是推导的过程:ArrayList a = new ArrayList(); string strSql = string.Format("SELECT OrgID AS id, OrgName AS name, OrgNameUpperOrgID AS upID" + " From mytable WHERE OrgID = '{0}'", orgID); System.Data.DataSet ds = new System.Data.DataSet(); ClearAndFillDataSet(ds, strSql, "org"); //执行strSql,将查询内容填入ds,表格名为“org” string upid = ds.Tables["org"].Rows[0]["upID"].ToString(); int i = 0;
while(upid != "0") { a.Add(ds.Tables["org"].Rows[0]["name"]); strSql = string.Format("SELECT OrgID AS id, OrgName AS name, NameUpperOrgID AS upID" + " From table1 WHERE OrgID = '{0}'", upid); ds = new System.Data.DataSet(); ClearAndFillDataSet(ds, strSql, "org"); upid = ds.Tables["org"].Rows[0]["upID"].ToString(); i++; }
ds = new System.Data.DataSet(); strSql = string.Format("SELECT OrgID AS id, OrgName AS name, OrgNameUpperOrgID AS upID" + " From table1 WHERE OrgNameUpperOrgID = '{0}'", 0); ClearAndFillDataSet(ds, strSql, "org"); a.Add(ds.Tables["org"].Rows[0]["name"]);可以根据a.Count来创建节点,最里层为顶极单位,越往外等级越低,a.Count为多少, 就有几极
我的方法是定义一个继承自treeview的类。有dataview。根据当前的ID生成rowfilter调用一个递归函数。贴个vb的(结点类mytreenode继承自treenode)。 Private Sub FillTree(Optional ByRef pnode As myTreeNode = Nothing, Optional ByVal filter As String = "") mDataView.RowFilter = filter Dim i As Int32 Dim newnode As myTreeNode For i = 0 To mDataView.Count - 1 newnode = New myTreeNode(GetDisplay(i), GetValue(i), GetPid(i), GetCPtr(i)) If newnode.CPtr Then '生成新的rowfilter filltree(newnode,rowfilter) End If If pnode Is Nothing Then Me.Nodes.Add(newnode) Else pnode.Nodes.Add(newnode) End If Next mDataView.RowFilter = "" End Sub
TO zhehui(小慧):哈哈,也有不明需求的情況:)
to zzc205(): 是应该用递推方法,谢谢你提供的方法。 to yaoyaonet(绿洲): 没错,上级是只有一个,下级就可以有多个。treeview上列出的是所有相关连的直接上级,直到顶级,而下级仅列出一层,就是说下级的下级就不再列出了。我试一下你的方法...非常感谢楼上几位兄弟的帮忙,等我试出来了就揭帖,分不够可以再加, 我的可用分还有很多的。
for () /取顶级单位
{
node.text=单位名称
nextclass(单位ID) //递归函数 得到的单位ID 传入递归函数
}
nextclass(string id)
{
for ()
{
取本级单位信息 通过 上级 id
node.text=单位名称
nextclass(单位ID) //递归函数 得到的单位ID 传入递归函数
}
}
参考!!!!!!
假设现在提供的OrgID是对应于【XX大学理学院】,
则列出的树如下:
省教育厅
------XX大学
------XX大学理学院
如果提供的OrgID是对应于【XX大学】,
则列出的树如下:
省教育厅
------XX大学
如果提供的OrgID是对应于【YY大学】,
则列出的树如下:
省教育厅
------YY大学
也就是说只列出此OrgID相关的单位。
不知道如何设计这个取顶级单位的方法,
还有能否稍微详细说一下这个【递归函数】如何设计?
兄弟能否再详细一些,在下真的非常感谢!!!
using System.Windows.Forms;
using System.Data;namespace Ldl.WinTreeView
{
/// <summary>
/// LdlBulidTreeView 的摘要说明。
/// </summary>
public class LdlWinBulidTreeView
{
private TreeView treeView;
private DataTable tb;
private string strSort;
private int intKey;
private int intText; public LdlWinBulidTreeView(TreeView treeView,DataTable tb,string strSort,int intKey,int intText)
{
this.treeView=treeView;
this.tb=tb;
this.strSort=strSort;
this.intKey=intKey;
this.intText=intText;
} public void BulidTopTree()
{
Cursor.Current = new Cursor("L_WAIT01.cur");
treeView.BeginUpdate(); TreeNodeCollection tnParentNodes = treeView.Nodes;
TreeNode tnChildNode;
string strRowFilter; tnParentNodes.Clear();
DataView dvTop=new DataView();
dvTop.Table=tb;
dvTop.RowFilter="nItemPK=nParentItemPK";
dvTop.Sort=strSort;
for (int i=0;i<dvTop.Count;i++)
{
tnChildNode=new TreeNode();
tnChildNode.Tag=dvTop[i][intKey].ToString();
tnChildNode.Text=dvTop[i][intText].ToString();
tnParentNodes.Add(tnChildNode);
strRowFilter="nItemPK <>nParentItemPK and nParentItemPK="+dvTop[i][intKey].ToString();
BulidSubTree(tnChildNode,strRowFilter);
} Cursor.Current = Cursors.Default;
treeView.EndUpdate();
treeView.TopNode.Expand(); }
private void BulidSubTree(TreeNode tnParentNode,string strRowFilter)
{ TreeNode tnChildNode;
string strSubRowFilter;
DataView dvSub=new DataView();
dvSub.Table=tb;
dvSub.RowFilter=strRowFilter;
dvSub.Sort=strSort;
for (int i=0;i<dvSub.Count;i++)
{
tnChildNode=new TreeNode();
tnChildNode.Tag=dvSub[i][intKey].ToString();
tnChildNode.Text=dvSub[i][intText].ToString();
tnParentNode.Nodes.Add(tnChildNode);
strSubRowFilter="nItemPK <>nParentItemPK and nParentItemPK="+tnChildNode.Tag.ToString();
BulidSubTree(tnChildNode,strSubRowFilter);
}
} }
}
private void CreateTree()
{
string sqltxt="Persist Security Info=False;User ID=sa;Initial Catalog=zhongtian;Data Source=ytf;Password=xu;";
SqlConnection sqlcon=new SqlConnection(sqltxt);
SqlCommand sqlcom=new SqlCommand("Select * from product_class where fatherid='0'",sqlcon);
try
{
sqlcon.Open();
SqlDataReader sqlreader=sqlcom.ExecuteReader();
while(sqlreader.Read())
{
TreeNode mynode=new TreeNode();
mynode.Text=sqlreader.GetString(2);
mynode.Tag=sqlreader.GetValue(1).ToString()+'|'+sqlreader.GetValue(2).ToString()+'|'+sqlreader.GetValue(3).ToString()+'|'+sqlreader.GetValue(0).ToString();
treeView1.Nodes.Add(mynode);
NextTree(sqlreader.GetValue(0).ToString(),treeView1.Nodes[0]);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
sqlcon.Close();
}
} private void NextTree(string nodeid,TreeNode parentnode)
{
string sqltxt="Persist Security Info=False;User ID=sa;Initial Catalog=zhongtian;Data Source=ytf;Password=xu;";
SqlConnection sqlcon=new SqlConnection(sqltxt);
SqlCommand sqlcom=new SqlCommand("Select * from product_class where fatherid='"+ nodeid +"'",sqlcon);
try
{
sqlcon.Open();
SqlDataReader sqlreader=sqlcom.ExecuteReader();
while(sqlreader.Read())
{
TreeNode mynode=new TreeNode(sqlreader.GetString(2));
parentnode.Nodes.Add(mynode);
mynode.Tag=sqlreader.GetValue(1).ToString()+'|'+sqlreader.GetValue(2).ToString()+'|'+sqlreader.GetValue(3).ToString()+'|'+sqlreader.GetValue(0).ToString();
NextTree(sqlreader.GetValue(0).ToString(),mynode);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
sqlcon.Close();
}
}
不是列出所有的顶级单位节点,而是根据给定的OrgID,列出有关系的单位,直到最上一级,也就是顶级单位。比如此时OrgID对应的是XX大学理学院,则列出如下的树形图:
省教育厅
------XX大学
------XX大学理学院
如果此时OrgID对应的是YY大学理,则列出如下的树形图:
省教育厅
------YY大学
此时就不列出有关XX大学的情况了。
如果此时OrgID对应的是顶级单位,如省教育厅,则列出如下的树形图:省教育厅
以下是推导的过程:ArrayList a = new ArrayList();
string strSql = string.Format("SELECT OrgID AS id, OrgName AS name, OrgNameUpperOrgID AS upID" + " From mytable WHERE OrgID = '{0}'", orgID);
System.Data.DataSet ds = new System.Data.DataSet();
ClearAndFillDataSet(ds, strSql, "org"); //执行strSql,将查询内容填入ds,表格名为“org”
string upid = ds.Tables["org"].Rows[0]["upID"].ToString();
int i = 0;
while(upid != "0")
{
a.Add(ds.Tables["org"].Rows[0]["name"]);
strSql = string.Format("SELECT OrgID AS id, OrgName AS name,
NameUpperOrgID AS upID" + " From table1 WHERE OrgID = '{0}'", upid);
ds = new System.Data.DataSet();
ClearAndFillDataSet(ds, strSql, "org");
upid = ds.Tables["org"].Rows[0]["upID"].ToString();
i++;
}
ds = new System.Data.DataSet();
strSql = string.Format("SELECT OrgID AS id, OrgName AS name, OrgNameUpperOrgID AS upID" + " From table1 WHERE OrgNameUpperOrgID = '{0}'", 0);
ClearAndFillDataSet(ds, strSql, "org");
a.Add(ds.Tables["org"].Rows[0]["name"]);可以根据a.Count来创建节点,最里层为顶极单位,越往外等级越低,a.Count为多少,
就有几极
你的意思是从下往上查。
那在TreeView中只会出现一条从上到下的记录(对应) 如果是这样那:
string[] str=new string[100]; //足够大
while (true)
{
... select UpperOrgID from mytable where OrgID=提供的OrgID
取得信息写入str //树组中
...
break; //如果 UpperOrgID=0 退出
}
通过取得的信息(如单位名称 在树组str ) 写入 TreeView 参考......
{
如果 UpperOrgID!=0 则 当做 提供的OrgID }
Private Sub FillTree(Optional ByRef pnode As myTreeNode = Nothing, Optional ByVal filter As String = "")
mDataView.RowFilter = filter
Dim i As Int32
Dim newnode As myTreeNode
For i = 0 To mDataView.Count - 1
newnode = New myTreeNode(GetDisplay(i), GetValue(i), GetPid(i), GetCPtr(i)) If newnode.CPtr Then
'生成新的rowfilter
filltree(newnode,rowfilter)
End If
If pnode Is Nothing Then
Me.Nodes.Add(newnode)
Else
pnode.Nodes.Add(newnode)
End If
Next
mDataView.RowFilter = "" End Sub
是应该用递推方法,谢谢你提供的方法。
to yaoyaonet(绿洲):
没错,上级是只有一个,下级就可以有多个。treeview上列出的是所有相关连的直接上级,直到顶级,而下级仅列出一层,就是说下级的下级就不再列出了。我试一下你的方法...非常感谢楼上几位兄弟的帮忙,等我试出来了就揭帖,分不够可以再加,
我的可用分还有很多的。