创建无限级菜单 能无限创建菜单,比如一个公司下面有N个分公司,分公司又可以有部门,部门又可以分工作组 工作组再分个人... 数据库设计表COMPANY(companyid,parentid,companyname....) 哪位高手写个方法,实现以上的方法! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public TreeNode GetTreeAndBind() { TreeNode o_RootNode = new TreeNode("全部"); o_RootNode.Tag = "0"; GetTreeNode(GetTreeView(m_sTableName), ref o_RootNode); return o_RootNode; } //递归添加树的节点 private void GetTreeNode(DataTable o_aDtTree, ref TreeNode o_aNode) { ///找出子节点 string s_Filter = ""; if (o_aNode.Tag.ToString() == "") s_Filter = "Parent_ID is null"; else if (o_aNode.Tag.ToString()=="0") s_Filter = "Parent_ID='" + o_aNode.Tag.ToString() + "' "; else s_Filter = "Parent_ID='" + o_aNode.Tag.ToString() + "' "; DataRow[] o_drTemp = o_aDtTree.Select(s_Filter); //添加所有子节点 for (int i = 0; i < o_drTemp.Length; i++) { string s_Value = o_drTemp[i]["code"]+"|"+o_drTemp[i]["ID"].ToString(); string s_Name = o_drTemp[i]["Name"].ToString(); string s_Serial = o_drTemp[i]["serial"].ToString(); TreeNode o_ChildNode = new TreeNode(); o_ChildNode.Text = s_Name; o_ChildNode.Name = s_Serial; o_ChildNode.Tag = s_Value; //用递归的方法绑定该节点的子节点 GetTreeNode(o_aDtTree, ref o_ChildNode); o_aNode.Nodes.Add(o_ChildNode); } return; } DataSet ds=new DataSet(); private void Form1_Load(object sender, System.EventArgs e) { // 定义数据库连接 SqlConnection CN = new SqlConnection(); try { //初始化连接字符串 CN.ConnectionString= "data source=pmserver;initial catalog=Bench;persist security info=False;user id=sa;Password=sa;"; CN.Open(); //添加命令,从数据库中得到数据 SqlCommand sqlCmd= new SqlCommand(); sqlCmd.Connection = CN; sqlCmd.CommandText = "select * from COMPANY"; sqlCmd.CommandType = CommandType.Text ; SqlDataAdapter adp = new SqlDataAdapter(sqlCmd); adp.Fill(ds); } catch (Exception ex) { throw (ex); } finally { CN.Close(); } //调用递归函数,完成树形结构的生成 AddTree(0, (TreeNode)null); } // 递归添加树的节点 public void AddTree(int ParentID,TreeNode pNode) { DataView dvTree = new DataView(ds.Tables[0]); //过滤ParentID,得到当前的所有子节点 dvTree.RowFilter = "[PARENTID] = " + ParentID; foreach(DataRowView Row in dvTree) { if(pNode == null) { //'̀添加根节点 TreeNode Node = treeView1.Nodes.Add(Row["ConText"].ToString()); AddTree(Int32.Parse(Row["ID"].ToString()),Node); //再次递归 } else { //添加当前节点的子节点 TreeNode Node = pNode.Nodes.Add(Row["ConText"].ToString()); AddTree(Int32.Parse(Row["ID"].ToString()),Node); //再次递归 } } } 如果你的数据源不是DataSet,是集合的话可以参考我现在用的这个: void BindTree(TreeView tv, DataCollection<PurviewSDO> modules) { DataCollection<PurviewSDO> roots = modules.FindAll(delegate(PurviewSDO obj) { return obj.FPurviewID==obj.PurviewID; }); if (roots != null && roots.Count > 0) { roots.Sort(new Comparison<PurviewSDO>(delegate(PurviewSDO x, PurviewSDO y) { return x.ArrangeNo.CompareTo(y.ArrangeNo); })); TreeNodeCollection nodes = tv.Nodes; tv.BeginUpdate(); nodes.Clear(); foreach (PurviewSDO item in roots) { TreeNode sNode = new TreeNode(); sNode.Text = item.PurviewName; sNode.Tag = item; if (item.FPurviewID == item.PurviewID) { sNode.ImageKey = "folder"; sNode.SelectedImageKey = "folder"; } BindNode(sNode, item); nodes.Add(sNode); } tv.EndUpdate(); if (nodes.Count > 0) { nodes[0].ExpandAll(); } } } void BindNode(TreeNode node,PurviewSDO module) { // Func<PurviewSDO, bool> FindAll = i => i.FPurviewID == module.PurviewID && i.PurviewID != module.PurviewID; //DataCollection<PurviewSDO> subModules = (modules.Where(FindAll)) as DataCollection<PurviewSDO>; DataCollection<PurviewSDO> subModules =modules.FindAll(delegate(PurviewSDO obj) { return obj.FPurviewID == module.PurviewID && obj.PurviewID != module.PurviewID; }); if (subModules != null && subModules.Count > 0) { subModules.Sort(new Comparison<PurviewSDO>(delegate(PurviewSDO x, PurviewSDO y) { return x.ArrangeNo.CompareTo(y.ArrangeNo); })); foreach (PurviewSDO item in subModules) { TreeNode sNode = new TreeNode(); sNode.Text = item.PurviewName; sNode.Tag = item; if (item.FPurviewID == module.PurviewID && item.PurviewID != module.PurviewID) { sNode.ImageKey = "action"; sNode.SelectedImageKey = "action"; } BindNode(sNode, item); node.Nodes.Add(sNode); } } } private void Form1_Load(object sender, EventArgs e) { bindtree(treeView1.Nodes, "0"); } private void bindtree(TreeNodeCollection Nds, string depid) { DbClass dbclass = new DbClass(); DataSet ds = new DataSet(); ds = dbclass.GetDataSet("select * from COMPANY", "COMPANY"); DataView dv = ds.Tables["COMPANY"].DefaultView; dv.RowFilter = "parentid='" + companyid+ "'"; TreeNode tn; string strparentid; foreach (DataRowView dr in dv) { strparentid= dr["companyid"].ToString(); if (strparentid!= "0") { tn = new TreeNode(); tn.Name = dr["companyid"].ToString(); tn.Text = dr["companyname"].ToString(); Nds.Add(tn); bindtree(Nds[Nds.Count - 1].Nodes, strparentid); } } } 先不帖代码了,我一般用两种方法,一个是递归,优点是简单,缺点是数据量大了就速度慢id parentid text1 0 总公司2 1 海南分公司3 1 北京分公司4 2 海南分公司IT部另一个方法是不用递归无深度(用友存货档就是这样做的),这种方法速度快,缺点就是两个表InventoryClass:cInvCCode cInvCName iInvCGrade bInvCEnd 10 原材料 1 1 20 半成品 1 1 30 产成品 1 1 Inventory:cInvCode, cInvName, cInvStd, cInvCCode(与InventoryClass表对应) 1001 贴片SDM4953 SDM4953 10 1002 锗二极管 D21DQ锗二极管 10 2001 RV2.5电源线红黑60cm-A HZ-4P 20 2002 单元板20P压线10cm 20 3001 双色5058 32x80-1(无点阵) M17200R1G1-32X80-V1/16-A1-0 30Inventory表的cInvCode字段的前N位就是它所属上一级类别/2的编码 1007 电阻560欧-1/8W-5 R560欧-1/8W-5 10 1008 二极管IN4148 D1N4148 10 请教高手--form间的值传递问题 c# word中图片处理 winfrom 中让用户自由移动控件 C# 如何给线程函数 传递参数? 如何将查询的结果用label显示 初学者,关于C#写的程序如何在没安装数据库的电脑上存东西 vs2005 cookie Debug时正常,通过虚拟目录浏览时不正常 vb.net转到C#.NET遇到的问题 哪位大虾能提供一些有关OR-MAP的资料!!多谢!!! 想和大家探讨一个问题! winform程序的部署,急 如何将一个datetimepicker的值做为存储过程参数?
{
TreeNode o_RootNode = new TreeNode("全部");
o_RootNode.Tag = "0";
GetTreeNode(GetTreeView(m_sTableName), ref o_RootNode);
return o_RootNode;
} //递归添加树的节点
private void GetTreeNode(DataTable o_aDtTree, ref TreeNode o_aNode)
{
///找出子节点
string s_Filter = "";
if (o_aNode.Tag.ToString() == "")
s_Filter = "Parent_ID is null";
else if (o_aNode.Tag.ToString()=="0")
s_Filter = "Parent_ID='" + o_aNode.Tag.ToString() + "' ";
else
s_Filter = "Parent_ID='" + o_aNode.Tag.ToString() + "' "; DataRow[] o_drTemp = o_aDtTree.Select(s_Filter); //添加所有子节点
for (int i = 0; i < o_drTemp.Length; i++)
{
string s_Value = o_drTemp[i]["code"]+"|"+o_drTemp[i]["ID"].ToString();
string s_Name = o_drTemp[i]["Name"].ToString();
string s_Serial = o_drTemp[i]["serial"].ToString();
TreeNode o_ChildNode = new TreeNode();
o_ChildNode.Text = s_Name;
o_ChildNode.Name = s_Serial;
o_ChildNode.Tag = s_Value;
//用递归的方法绑定该节点的子节点
GetTreeNode(o_aDtTree, ref o_ChildNode);
o_aNode.Nodes.Add(o_ChildNode);
}
return;
}
DataSet ds=new DataSet();
private void Form1_Load(object sender, System.EventArgs e)
{
// 定义数据库连接
SqlConnection CN = new SqlConnection();
try
{
//初始化连接字符串
CN.ConnectionString= "data source=pmserver;initial catalog=Bench;persist security info=False;user id=sa;Password=sa;";
CN.Open();
//添加命令,从数据库中得到数据
SqlCommand sqlCmd= new SqlCommand();
sqlCmd.Connection = CN;
sqlCmd.CommandText = "select * from COMPANY";
sqlCmd.CommandType = CommandType.Text ;
SqlDataAdapter adp = new SqlDataAdapter(sqlCmd);
adp.Fill(ds);
}
catch (Exception ex)
{
throw (ex);
}
finally
{
CN.Close();
}
//调用递归函数,完成树形结构的生成
AddTree(0, (TreeNode)null);
}
// 递归添加树的节点
public void AddTree(int ParentID,TreeNode pNode)
{
DataView dvTree = new DataView(ds.Tables[0]);
//过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "[PARENTID] = " + ParentID;
foreach(DataRowView Row in dvTree)
{
if(pNode == null)
{ //'̀添加根节点
TreeNode Node = treeView1.Nodes.Add(Row["ConText"].ToString());
AddTree(Int32.Parse(Row["ID"].ToString()),Node); //再次递归
}
else
{ //添加当前节点的子节点
TreeNode Node = pNode.Nodes.Add(Row["ConText"].ToString());
AddTree(Int32.Parse(Row["ID"].ToString()),Node); //再次递归
}
}
}
{
DataCollection<PurviewSDO> roots = modules.FindAll(delegate(PurviewSDO obj) { return obj.FPurviewID==obj.PurviewID; });
if (roots != null && roots.Count > 0)
{
roots.Sort(new Comparison<PurviewSDO>(delegate(PurviewSDO x, PurviewSDO y) { return x.ArrangeNo.CompareTo(y.ArrangeNo); }));
TreeNodeCollection nodes = tv.Nodes; tv.BeginUpdate();
nodes.Clear(); foreach (PurviewSDO item in roots)
{
TreeNode sNode = new TreeNode();
sNode.Text = item.PurviewName;
sNode.Tag = item; if (item.FPurviewID == item.PurviewID)
{
sNode.ImageKey = "folder";
sNode.SelectedImageKey = "folder";
} BindNode(sNode, item); nodes.Add(sNode); }
tv.EndUpdate(); if (nodes.Count > 0)
{
nodes[0].ExpandAll();
}
} } void BindNode(TreeNode node,PurviewSDO module)
{
// Func<PurviewSDO, bool> FindAll = i => i.FPurviewID == module.PurviewID && i.PurviewID != module.PurviewID;
//DataCollection<PurviewSDO> subModules = (modules.Where(FindAll)) as DataCollection<PurviewSDO>; DataCollection<PurviewSDO> subModules =modules.FindAll(delegate(PurviewSDO obj) { return obj.FPurviewID == module.PurviewID && obj.PurviewID != module.PurviewID; });
if (subModules != null && subModules.Count > 0)
{
subModules.Sort(new Comparison<PurviewSDO>(delegate(PurviewSDO x, PurviewSDO y) { return x.ArrangeNo.CompareTo(y.ArrangeNo); }));
foreach (PurviewSDO item in subModules)
{
TreeNode sNode = new TreeNode();
sNode.Text = item.PurviewName;
sNode.Tag = item; if (item.FPurviewID == module.PurviewID && item.PurviewID != module.PurviewID)
{
sNode.ImageKey = "action";
sNode.SelectedImageKey = "action";
}
BindNode(sNode, item);
node.Nodes.Add(sNode);
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
bindtree(treeView1.Nodes, "0");
} private void bindtree(TreeNodeCollection Nds, string depid)
{
DbClass dbclass = new DbClass();
DataSet ds = new DataSet();
ds = dbclass.GetDataSet("select * from COMPANY", "COMPANY");
DataView dv = ds.Tables["COMPANY"].DefaultView;
dv.RowFilter = "parentid='" + companyid+ "'";
TreeNode tn;
string strparentid;
foreach (DataRowView dr in dv)
{
strparentid= dr["companyid"].ToString();
if (strparentid!= "0")
{
tn = new TreeNode();
tn.Name = dr["companyid"].ToString();
tn.Text = dr["companyname"].ToString();
Nds.Add(tn);
bindtree(Nds[Nds.Count - 1].Nodes, strparentid);
}
}
}
一个是递归,优点是简单,缺点是数据量大了就速度慢
id parentid text
1 0 总公司
2 1 海南分公司
3 1 北京分公司
4 2 海南分公司IT部
另一个方法是不用递归无深度(用友存货档就是这样做的),这种方法速度快,缺点就是两个表
InventoryClass:
cInvCCode cInvCName iInvCGrade bInvCEnd
10 原材料 1 1
20 半成品 1 1
30 产成品 1 1 Inventory:
cInvCode, cInvName, cInvStd, cInvCCode(与InventoryClass表对应)
1001 贴片SDM4953 SDM4953 10
1002 锗二极管 D21DQ锗二极管 10
2001 RV2.5电源线红黑60cm-A HZ-4P 20
2002 单元板20P压线10cm 20
3001 双色5058 32x80-1(无点阵) M17200R1G1-32X80-V1/16-A1-0 30Inventory表的cInvCode字段的前N位就是它所属上一级类别/2的编码
1007 电阻560欧-1/8W-5 R560欧-1/8W-5 10
1008 二极管IN4148 D1N4148 10