帮忙写段代码
数据库是这样的,表名:Company
字段:ID、parentId、name
根节点的index我设为0
表中数据是这样的:
ID parentId name
1 0 综合
2 0 财务
3 1 考勤
4 2 发票
5 3 迟到
6 4 签字
……
……
具体有多少个子节点不确定
在TreeView中显示的效果如下:部门
--综合
----考勤
------迟到
--财务
----发票
------签字 ……
至于有多少级节点还不清楚我只知道这个要用递归,但不知道具体怎么写,哪位根据这个例子帮写段代码参考下,谢谢
数据库是这样的,表名:Company
字段:ID、parentId、name
根节点的index我设为0
表中数据是这样的:
ID parentId name
1 0 综合
2 0 财务
3 1 考勤
4 2 发票
5 3 迟到
6 4 签字
……
……
具体有多少个子节点不确定
在TreeView中显示的效果如下:部门
--综合
----考勤
------迟到
--财务
----发票
------签字 ……
至于有多少级节点还不清楚我只知道这个要用递归,但不知道具体怎么写,哪位根据这个例子帮写段代码参考下,谢谢
{
itemsDv.Sort=pidMember;
FillData(this.tvItems.Nodes,rootId);
} private void FillData(TreeNodeCollection nodes,string nodeId)
{
if(itemsDv.Sort!=pidMember)itemsDv.Sort=pidMember;
DataRowView[] curDrvs=itemsDv.FindRows(nodeId);
foreach(DataRowView curDrv in curDrvs)
{
TreeNode nd=new TreeNode();
nd.Text=curDrv[displayMember].ToString();
int idxChild=itemsDv.Find(curDrv[idMember].ToString());
if(idxChild>=0)
{
nd.ImageIndex=0;
nd.SelectedImageIndex=0;
FillData(nd.Nodes,curDrv[idMember].ToString());
}
else
{
if(idxChild>=0)
{
nd.ImageIndex=0;
nd.SelectedImageIndex=0;
}
else
{
nd.ImageIndex=2;
nd.SelectedImageIndex=2;
}
}
nodes.Add(nd);
}
}
DataSet dsdata=new DataSet();
private void button3_Click(object sender, EventArgs e)
{
string con = "server=localhost;Integrated Security=SSPI;database=Common";
string sqlstr = "Select ID , parentId , name from Company ";
SqlConnection connect = new SqlConnection(con);
SqlCommand cmd = new SqlCommand();
cmd.CommandText = sqlstr;
cmd.Connection = connect;
SqlDataAdapter dap = new SqlDataAdapter();
dap.SelectCommand = cmd;
dap.Fill(dsdata); TreeNode tmnode = new TreeNode("部门");
this.treeView1.Nodes.Add(tmnode);
CreatTreeView2(tmnode, 0);
} private void CreatTreeView2(TreeNode parentNode,int parentid)
{
DataRow[] drs = dsdata.Tables[0].Select("parentId= " + parentid.ToString().Trim()); foreach (DataRow dr in drs)
{
TreeNode tmnode = new TreeNode(dr["name"].ToString().Trim());
parentNode.Nodes.Add(tmnode);
CreatTreeView2(tmnode, Convert.ToInt32(dr["ID"]));
}
}
private void CreatTreeView2(TreeNode parentNode)
{
DataRow[] drs = dsdata.Tables[0].Select("parentId= " + parentNode.Name);
foreach (DataRow dr in drs)
{
TreeNode tmnode = parentNode.Nodes.Add(dr["ID"].ToString, dr["name"]);
CreatTreeView2(tmnode));
}
}
数据表主要结构如下:
表名为: [dbo].[Category]
主要的字段列:
[CategoryID] [int] IDENTITY(1,1) NOT NULL,
[CategoryName] [nvarchar](32) NOT NULL,
[CategoryType] [int] NOT NULL,
[ParentID] [int] NULL,针对数据的加载给出两种实现方式,递归和非递归。以下是C# 代码,对于数据的获取使用其他类,不过最终是查询结果是DataTable,因此看过程中不需要关心。
1.递归方式//递归调用函数
private static void LoadCategoryDataToTreeView()
{
this.treeView1.BeginUpdate();
//this.treeView1.Nodes.Clear();
//生成根节点
CategoryTreeNode rootNode = new CategoryTreeNode(ApplicationGlobal.Instance.ApplicationSettings.CategoryRootNodeName, 0, 0);//技巧分类
rootNode.CategoryData = null;
this.treeView1.Nodes.Add(rootNode);
//添加一级分类
foreach (DataSetSR.CategoriesRow cateRow in DataSettings.Instance.Data.Categories.Select("ParentId = 0"))
{
CategoryTreeNode tnode = new CategoryTreeNode(cateRow.CategoryName, 1, 2);
tnode.CategoryData = cateRow;
rootNode.Nodes.Add(tnode); foreach (DataSetSR.CategoriesRow subcateRow in DataSettings.Instance.Data.Categories.Select("ParentId = " + cateRow.CategoryId))
{
BindSubCategoryTreeNode(tnode, subcateRow);
}
}
this.treeView1.ExpandAll();
this.treeView1.EndUpdate();
}
////递归执行函数
private static void BindSubCategoryTreeNode(TreeNode treeNode, DataSetSR.CategoriesRow cateRow)
{
CategoryTreeNode tnode = new CategoryTreeNode(cateRow.CategoryName, 1, 2);
tnode.CategoryData = cateRow;
treeNode.Nodes.Add(tnode);
foreach (DataSetSR.CategoriesRow subcateRow in DataSettings.Instance.Data.Categories.Select("ParentId = " + cateRow.CategoryId))
{
BindSubCategoryTreeNode(tnode, subcateRow);
}
}
2.非递归方式//非递归加载数据,Stack实现
public static void LoadCategoryData(TreeView treeView/*,DataTable dt*/)
{
DataTable dt = new DataTable();
DocumentController.GetInstance().FillCategories(dt); Stack<TreeNode> stack = new Stack<TreeNode>(); treeView.BeginUpdate();
//add rootNode
TreeNode rootNode = new TreeNode("文档管理", 0, 0);
treeView.Nodes.Add(rootNode);
//add childNodes
//TreeNode parentNode = rootNode;
//添加一级分类
foreach (DataRow cateRow in dt.Select("ParentID IS NULL"))
{
Category category = new Category(cateRow);
TreeNode node = new TreeNode(category.CategoryName, 1, 2);
node.Tag = category;
rootNode.Nodes.Add(node);
stack.Push(node);
}
while (stack.Count > 0)//添加一级分类下面的子分类
{
TreeNode parentNode = stack.Pop();
int id = ((Category)parentNode.Tag).CategoryID;
foreach (DataRow cateRow in dt.Select("ParentID = " + id.ToString()))
{
Category category = new Category(cateRow);
TreeNode childNode = new TreeNode(category.CategoryName, 1, 2);
childNode.Tag = category;
parentNode.Nodes.Add(childNode);
stack.Push(childNode);
}
} treeView.Nodes[0].Expand();
treeView.EndUpdate();
}