treeview控件的使用 如何无限极地动态添加节点。比如:表里面有两个字段 nodes ,parenodes。 1 2 , 2 3 , 3 4 , 4 5 这样如何建立一个树添加进去,找我会。如何添加就是TREENODE.NODES.ADD 这个方法。。麻烦 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一:设置表的级别和编码规则 用case 二:递归 必须要先用递归,找到你想添加结点的父结点,再调用这个父结点的add方法,把子结点的对象添加上去~ /// <summary> /// 菜单加载 /// </summary> public void BindTree(string strAdminName, string strRoleName) { DataTable dtParent = tools.ConvertDataReaderToDataTable(bmdb.getParentMenu()); //父菜单表 DataTable dtRolePower = null; if (strRoleName == "") {//如果角色名为空,则以用户名查询角色权限 dtRolePower = tools.ConvertDataReaderToDataTable(bmdb.getPowerMenu(strAdminName, ""));//根据登录用户获取其所属角色拥有权限表 } else { dtRolePower = tools.ConvertDataReaderToDataTable(bmdb.getPowerMenu("", strRoleName));//根据登录用户获取其所属角色拥有权限表 } TreeView tvMenu = (TreeView)this.FindControl("tvMenu"); TreeNode PNode = null; TreeNode CNode = null; foreach (DataRow dr in dtParent.Rows) { PNode = new TreeNode(); PNode.Text = dr["MODULE_NAME"].ToString(); //父菜单名称 PNode.Value = dr["MODULEID"].ToString(); //父菜单值 PNode.SelectAction = TreeNodeSelectAction.Expand; PNode.ExpandAll(); this.tvMenu.Nodes.Add(PNode); //PNode.NavigateUrl = "javascript:return false;"; DataTable dtChild = tools.ConvertDataReaderToDataTable(bmdb.getChildMenu(Convert.ToInt32(PNode.Value))); for (int i = 0; i < dtChild.Rows.Count; i++) { CNode = new TreeNode(); //必须声明 CNode.Text = dtChild.Rows[i]["MODULE_NAME"].ToString(); CNode.Value = dtChild.Rows[i]["MODULEID"].ToString(); //CNode.NavigateUrl = dtChild.Rows[i]["MODULE_URL"].ToString(); //具体导航到的页面 foreach (DataRow dr2 in dtRolePower.Rows) { if (Convert.ToInt32(CNode.Value) == Convert.ToInt32(dr2[0].ToString())) { CNode.Checked = true; } } PNode.ChildNodes.Add(CNode); } } }然后在Page_Load里面调用 我再说下另一个方法定义: public void addtee(int nodes, string parenodes) { TreeNode node = new TreeNode(nodes.ToString()); node.Name = nodes.ToString(); node.Text = parenodes.ToString(); treeView1.Nodes.Add(node); }调用:addtee(re["nodes"].ToString(), re["parenodes"].ToString()); http://topic.csdn.net/u/20081222/17/ffd859b9-39dd-420f-be6d-1891b51c1491.html http://www.cnblogs.com/mushroom_lb/archive/2008/08/26/1276449.html请参考一下 //----表结构CREATE TABLE T_Dept( DeptIndex numeric(18, 0) IDENTITY(1,1) NOT NULL, DeptID nvarchar(20) NOT NULL,--部门ID,节点 DeptTreeParent nvarchar(20) NOT NULL,--所属部门,父节点 DeptTreeDepth numeric(18, 0) NOT NULL,--所在树深度 DeptPresiderID nvarchar(20) NULL,--主负责人ID(副总、经理、队长) DeptAssistantID nvarchar(20) NULL,--副负责人ID DeptRe ntext NULL,--备注 DepMoney numeric(18, 0) DEFAULT 500 NULL,--允许领用货品的总金额 CONSTRAINT PK_T_Dept PRIMARY KEY (DeptID) ) int iDepth = this.treeView1.SelectedNode.FullPath.Split('\\').Length - 1; //----------------------------------------------#region 刷新/加载TreeView /// <summary> /// 刷新TreeView(根节点名及Text值相同) /// </summary> private void RefTreeView() { this.treeView1.Nodes[0].Nodes.Clear(); string strSQL = "SELECT * FROM T_Dept Order By DeptTreeDepth,DeptIndex"; DataSet ds = DBUtility.DbHelperSQL.Query(strSQL); DataTable dt = ds.Tables[0]; TreeNode tred = treeView1.Nodes[0];// Pub.AddTree(tred.Name, tred, treeView1, dt); } #endregion #region 遍历TreeView的方法 /// <summary> /// 根据数据库创建TreeView的方法 /// </summary> /// <param name="ParentID">父节点</param> /// <param name="pNode">节点</param> /// <param name="treeView">控件</param> /// <param name="dt">数据库表结构</param> public static void AddTree(string ParentID, TreeNode pNode, TreeView treeView, DataTable dt) { DataView dvTree = new DataView(dt); //过滤ParentID,得到当前的所有子节点 dvTree.RowFilter = "[DeptTreeParent]='" + ParentID + "'"; foreach (DataRowView Row in dvTree) { TreeNode Node = new TreeNode(); //?添加当前节点的子节点 Node.Text = Row["DeptID"].ToString(); pNode.Nodes.Add(Node); //Node.Expanded = true; AddTree(Row["DeptID"].ToString(), Node, treeView, dt);//递归 } } #endregion呵呵,资源共享,希望对你有所帮助 呵呵 我正在写这方面的一个小论文 递归算法!//以下为关于树的操作//////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// 递归算法生成树型结构 /// </summary> /// <param name="strcdid"></param> /// <returns></returns> public void InitTree(TreeNodeCollection Nds, string parentID) // 方法输入值(结点集合,父节点的ID) { TreeNode NewNode; DataTable dtTree = new DataTable(); ReadWriteDB dbTree = new ReadWriteDB(); dtTree = dbTree.GetTreeInfo(dbTree.companyID); //根据xml文件中的companyID获取树型信息表 DataRow[] rows = dtTree.Select("SUPERIORORG='" + parentID + "'"); foreach (DataRow row in rows) { NewNode = new TreeNode(row["ORGNAME"].ToString()); NewNode.Tag = row["ORGID"].ToString(); Nds.Add(NewNode); if (parentID == "1") { NewNode.ImageIndex = 0; } else { NewNode.ImageIndex = 1; NewNode.SelectedImageIndex = 2; } InitTree(NewNode.Nodes, row["ORGID"].ToString()); //InitTree(Nds(Nds.Count-1), row["ORGID"].ToString()); //else if (NewNode.Nodes.Count == 0) //{ // NewNode.ImageIndex = 3; // NewNode.SelectedImageIndex = 4; //} } } /// <summary> /// 生成树结构后,在车队后添加线路列表(遍历节点,只在叶节点添加线路列表) /// </summary> private void AddLinesForTeam(TreeNode Node) { TreeNode NewNode; ReadWriteDB rwDB = new ReadWriteDB(); DataTable dtLines = new DataTable(); ArrayList index = new ArrayList(); //查找满足条件的结点 foreach (TreeNode tn in Node.Nodes) { if (tn.Nodes.Count == 0) //叶节点才进行判断 { dtLines = rwDB.GetLineList(tn.Text.ToString()); if (dtLines.Rows.Count > 0) //若有记录 { foreach (DataRow dtrow in dtLines.Rows) { NewNode = new TreeNode(dtrow["xlmc"].ToString()); NewNode.Tag = dtrow["xlid"].ToString(); tn.Nodes.Add(NewNode); NewNode.ImageIndex = 3; NewNode.SelectedImageIndex = 4; } } else //若该车队没有下属线路,则删除该节点(没有对客7 16队进行判断 有待进一步解决) { //先记录下没有下属线路的索引号 然后 将其都删除 index.Add(tn.Index); //MessageBox.Show(tn.Text + "没有下属线路。"); //Node.Nodes.Remove(tn); //将索引号加一 } } } //可否用泛型 //再对相应的索引节点进行删除操作 for (int i = index.Count-1; i >=0; i--) { //Node.Nodes.RemoveAt(Convert.ToInt32(index[i])); Node.Nodes[Convert.ToInt32(index[i])].Remove(); } } 如何声明标量变量 WPF,空白、换行是怎么处理的哦 一个C#的项目 c#,.net,sqlserver,物流系统,物流软件 看到的两道面试题 求C#实现文本TXT文件导入SQL 为什么.net2005制作安装文件时没有主输出 帮忙解释一下在global.asax中的几条语句!在线立结 请问有谁用过Codesmith啊?有个问题我一直解决不了,是我错了吗? 从存储过程中去返回值,请各位高手帮忙 怎样把一个软件项目 打包成 安装文件包 winform遍历80个目录.一万多个图片.报错了
二:递归
/// <summary>
/// 菜单加载
/// </summary>
public void BindTree(string strAdminName, string strRoleName)
{
DataTable dtParent = tools.ConvertDataReaderToDataTable(bmdb.getParentMenu()); //父菜单表
DataTable dtRolePower = null;
if (strRoleName == "")
{//如果角色名为空,则以用户名查询角色权限
dtRolePower = tools.ConvertDataReaderToDataTable(bmdb.getPowerMenu(strAdminName, ""));//根据登录用户获取其所属角色拥有权限表
}
else
{
dtRolePower = tools.ConvertDataReaderToDataTable(bmdb.getPowerMenu("", strRoleName));//根据登录用户获取其所属角色拥有权限表
}
TreeView tvMenu = (TreeView)this.FindControl("tvMenu");
TreeNode PNode = null;
TreeNode CNode = null;
foreach (DataRow dr in dtParent.Rows)
{
PNode = new TreeNode();
PNode.Text = dr["MODULE_NAME"].ToString(); //父菜单名称
PNode.Value = dr["MODULEID"].ToString(); //父菜单值
PNode.SelectAction = TreeNodeSelectAction.Expand;
PNode.ExpandAll();
this.tvMenu.Nodes.Add(PNode); //PNode.NavigateUrl = "javascript:return false;"; DataTable dtChild = tools.ConvertDataReaderToDataTable(bmdb.getChildMenu(Convert.ToInt32(PNode.Value)));
for (int i = 0; i < dtChild.Rows.Count; i++)
{
CNode = new TreeNode(); //必须声明
CNode.Text = dtChild.Rows[i]["MODULE_NAME"].ToString();
CNode.Value = dtChild.Rows[i]["MODULEID"].ToString(); //CNode.NavigateUrl = dtChild.Rows[i]["MODULE_URL"].ToString(); //具体导航到的页面
foreach (DataRow dr2 in dtRolePower.Rows)
{
if (Convert.ToInt32(CNode.Value) == Convert.ToInt32(dr2[0].ToString()))
{
CNode.Checked = true;
}
}
PNode.ChildNodes.Add(CNode);
}
}
}
然后在Page_Load里面调用
{
TreeNode node = new TreeNode(nodes.ToString());
node.Name = nodes.ToString();
node.Text = parenodes.ToString();
treeView1.Nodes.Add(node);
}调用:addtee(re["nodes"].ToString(), re["parenodes"].ToString());
请参考一下
DeptIndex numeric(18, 0) IDENTITY(1,1) NOT NULL,
DeptID nvarchar(20) NOT NULL,--部门ID,节点
DeptTreeParent nvarchar(20) NOT NULL,--所属部门,父节点
DeptTreeDepth numeric(18, 0) NOT NULL,--所在树深度
DeptPresiderID nvarchar(20) NULL,--主负责人ID(副总、经理、队长)
DeptAssistantID nvarchar(20) NULL,--副负责人ID
DeptRe ntext NULL,--备注
DepMoney numeric(18, 0) DEFAULT 500 NULL,--允许领用货品的总金额
CONSTRAINT PK_T_Dept PRIMARY KEY (DeptID)
) int iDepth = this.treeView1.SelectedNode.FullPath.Split('\\').Length - 1;
//----------------------------------------------
#region 刷新/加载TreeView
/// <summary>
/// 刷新TreeView(根节点名及Text值相同)
/// </summary>
private void RefTreeView()
{
this.treeView1.Nodes[0].Nodes.Clear();
string strSQL = "SELECT * FROM T_Dept Order By DeptTreeDepth,DeptIndex";
DataSet ds = DBUtility.DbHelperSQL.Query(strSQL);
DataTable dt = ds.Tables[0];
TreeNode tred = treeView1.Nodes[0];//
Pub.AddTree(tred.Name, tred, treeView1, dt);
}
#endregion
#region 遍历TreeView的方法
/// <summary>
/// 根据数据库创建TreeView的方法
/// </summary>
/// <param name="ParentID">父节点</param>
/// <param name="pNode">节点</param>
/// <param name="treeView">控件</param>
/// <param name="dt">数据库表结构</param>
public static void AddTree(string ParentID, TreeNode pNode, TreeView treeView, DataTable dt)
{
DataView dvTree = new DataView(dt);
//过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "[DeptTreeParent]='" + ParentID + "'";
foreach (DataRowView Row in dvTree)
{
TreeNode Node = new TreeNode();
//?添加当前节点的子节点
Node.Text = Row["DeptID"].ToString();
pNode.Nodes.Add(Node);
//Node.Expanded = true;
AddTree(Row["DeptID"].ToString(), Node, treeView, dt);//递归
}
}
#endregion
呵呵,资源共享,希望对你有所帮助
//以下为关于树的操作////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// 递归算法生成树型结构
/// </summary>
/// <param name="strcdid"></param>
/// <returns></returns>
public void InitTree(TreeNodeCollection Nds, string parentID) // 方法输入值(结点集合,父节点的ID)
{
TreeNode NewNode;
DataTable dtTree = new DataTable();
ReadWriteDB dbTree = new ReadWriteDB();
dtTree = dbTree.GetTreeInfo(dbTree.companyID); //根据xml文件中的companyID获取树型信息表 DataRow[] rows = dtTree.Select("SUPERIORORG='" + parentID + "'");
foreach (DataRow row in rows)
{ NewNode = new TreeNode(row["ORGNAME"].ToString());
NewNode.Tag = row["ORGID"].ToString();
Nds.Add(NewNode);
if (parentID == "1")
{
NewNode.ImageIndex = 0;
}
else
{
NewNode.ImageIndex = 1;
NewNode.SelectedImageIndex = 2;
}
InitTree(NewNode.Nodes, row["ORGID"].ToString());
//InitTree(Nds(Nds.Count-1), row["ORGID"].ToString());
//else if (NewNode.Nodes.Count == 0)
//{
// NewNode.ImageIndex = 3;
// NewNode.SelectedImageIndex = 4;
//}
} } /// <summary>
/// 生成树结构后,在车队后添加线路列表(遍历节点,只在叶节点添加线路列表)
/// </summary>
private void AddLinesForTeam(TreeNode Node)
{ TreeNode NewNode;
ReadWriteDB rwDB = new ReadWriteDB();
DataTable dtLines = new DataTable();
ArrayList index = new ArrayList();
//查找满足条件的结点
foreach (TreeNode tn in Node.Nodes)
{
if (tn.Nodes.Count == 0) //叶节点才进行判断
{
dtLines = rwDB.GetLineList(tn.Text.ToString());
if (dtLines.Rows.Count > 0) //若有记录
{
foreach (DataRow dtrow in dtLines.Rows)
{
NewNode = new TreeNode(dtrow["xlmc"].ToString());
NewNode.Tag = dtrow["xlid"].ToString();
tn.Nodes.Add(NewNode);
NewNode.ImageIndex = 3;
NewNode.SelectedImageIndex = 4;
}
}
else //若该车队没有下属线路,则删除该节点(没有对客7 16队进行判断 有待进一步解决)
{
//先记录下没有下属线路的索引号 然后 将其都删除
index.Add(tn.Index);
//MessageBox.Show(tn.Text + "没有下属线路。");
//Node.Nodes.Remove(tn);
//将索引号加一
}
}
} //可否用泛型
//再对相应的索引节点进行删除操作
for (int i = index.Count-1; i >=0; i--)
{
//Node.Nodes.RemoveAt(Convert.ToInt32(index[i]));
Node.Nodes[Convert.ToInt32(index[i])].Remove(); } }