public void builderTree(ModelItem modelItem)
{
if (modelItem.Children == null) //没有孩子直接加节点
{
TreeNode newnode = new TreeNode(modelItem.DisplayName); //节点文字
treeView1.SelectedNode.Nodes.Add(newnode);
}
else //有孩子,把它加上然后选中它,开始递归
{
TreeNode newnode2 = new TreeNode(modelItem.DisplayName); //节点名称
treeView1.SelectedNode.Nodes.Add(newnode2);
treeView1.SelectedNode = newnode2; //它有孩子就把它做为当前选中 foreach (var ModelItem2 in modelItem.Children)
{
builderTree(ModelItem2); //然后递归搞
}
//treeView1.SelectedNode = newnode2; //估计问题在这里,就是递归完了之后 当前选中节点被改变了,不知道如何选回去
}
}
现在的样子是~~~
/// <summary>
/// 递归查询绑定到treeview
/// </summary>
/// <param name="prevNode"></param>
protected void ForEachTree(TreeNode prevNode)
{
try
{
DataView dv = getDt().DefaultView;
dv.RowFilter = prevNode == null ? "ParentId is null" : "ParentId = '" + prevNode.Value + "'";//根节点
foreach (DataRowView item in dv)//循环节点集合
{
TreeNode tn = new TreeNode();
tn.Text = item["FolderName"].ToString(); //存放节点名称
tn.Value = item["FolderId"].ToString();//存放节点ID
if (prevNode == null)
{
tn.ImageUrl = "../img/base.gif";
tn.Target = "RightFrame";
tn.SelectAction = TreeNodeSelectAction.SelectExpand;
tn.PopulateOnDemand = true;
TreeView1.Nodes.Add(tn);//添加至根节点
}
else
{
tn.ImageUrl = "../img/folder.gif";
tn.SelectAction = TreeNodeSelectAction.SelectExpand;
prevNode.ChildNodes.Add(tn);//添加至子结点
}
ForEachTree(tn);
}
}
catch (Exception ex)
{
NR.Error.Log.LogType(ex.ToString());
}
}
//得到数据列表
protected DataTable getDt()
{
DataTable dt = new DataTable();
NRBLL.Folder folder = new Asiastar.NRBLL.Folder();
dt = folder.FN_GetByFolderId().Tables[0];
return dt;
}
public void builderTree(ModelItem modelItem)
{
treeView1.Nodes.Clear();//你错误的地方 没有写这个
if (modelItem.Children == null) //没有孩子直接加节点
{
TreeNode newnode = new TreeNode(modelItem.DisplayName); //节点文字
treeView1.SelectedNode.Nodes.Add(newnode);
}
else //有孩子,把它加上然后选中它,开始递归
{
TreeNode newnode2 = new TreeNode(modelItem.DisplayName); //节点名称
treeView1.SelectedNode.Nodes.Add(newnode2);
treeView1.SelectedNode = newnode2; //它有孩子就把它做为当前选中 foreach (var ModelItem2 in modelItem.Children)
{
builderTree(ModelItem2); //然后递归搞
}
//treeView1.SelectedNode = newnode2; //估计问题在这里,就是递归完了之后 当前选中节点被改变了,不知道如何选回去
}
}
不行啊~~提示treeView1.SelectedNode 为空。所以treeView1.SelectedNode.Nodes.Add(newnode);就报错
//这是我以前写的你拿去参考下
this.tvwBookType.Nodes.Clear();
//创建根节点
TreeNode node = this.tvwBookType.Nodes.Add("AllBook"); //查询所有的图书类型
booktypelist = booktypebll.SelectBookType();//获取数据源
foreach (BookType type in booktypelist)
{
TreeNode rootnode = node.Nodes.Add(type.BookTypeName);
//添加跟节点
this.tvwBookType.SelectedNode = node;
//鼠标停留在节点上显示的节点的文本值
node.ToolTipText = type.Re;
rootnode.Tag = type.BookTypeId;
}
this.tvwBookType.ExpandAll();
咱当年也山寨过,现在主流啦。当文档微软会告诉你treeview支持的数据源要派生自HierarchicalDataSourceControl, 实现IHierarchicalDataSource接口。
实现这个接口就得了。
using System;
using System.Data;
using System.Web.UI;
using System.Collections;namespace ITCOA_CMS.DAL
{
/// <summary>
/// HierarchicalDataSet 一个实现了IHierarchicalDataSource接口的类
/// </summary>
public class HierarchicalDataSet : HierarchicalDataSourceControl, IHierarchicalDataSource
{
DataSet dataSet;
string idColumnName;
string parentIdColumnName;
/// <summary>
/// 构造函数
/// dataset是放数据的容器
/// idColumnName是指定做为主键的数据表列名
/// parentIdColumnName是指定下做为外键的 父id 的数据表列名,用来明确结点的父子关系
/// </summary>
/// <param name="dataSet"></param>
/// <param name="idColumnName"></param>
/// <param name="parentIdColumnName"></param>
public HierarchicalDataSet(DataSet dataSet, string idColumnName, string parentIdColumnName)
{
this.dataSet = dataSet.Copy();
this.idColumnName = idColumnName;
this.parentIdColumnName = parentIdColumnName;
} /// <summary>
/// 从未使用过的事件,由于treeview的数据源更新后,要做的工作太多,不使用此事件了
/// 有变化就完全重新绑定treeview数据源
/// </summary>
public event EventHandler DataSourceChanged; /// <summary>
/// 完成 GetHierarchicalView 方法
/// 实现 对数据源的子结点过滤
/// </summary>
/// <param name="viewPath"></param>
/// <returns></returns>
protected override HierarchicalDataSourceView GetHierarchicalView(string viewPath)
{
return new DataSourceView(this, viewPath);
} #region 支持的一些方法
/// <summary>
/// 得到父结点
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
public DataRowView GetParentRow(DataRowView row)
{
dataSet.Tables[0].DefaultView.RowFilter = String.Format("{0} = {1}", idColumnName, row[parentIdColumnName].ToString());
DataRowView parentRow = dataSet.Tables[0].DefaultView[0];
//dataSet.Tables[0].DefaultView.RowFilter = "";
return parentRow;
} /// <summary>
/// 得到某子结点的viewPath
/// </summary>
/// <param name="viewPath"></param>
/// <param name="row"></param>
/// <returns></returns>
string GetChildrenViewPath(string viewPath, DataRowView row)
{
return viewPath + "\\" + row[idColumnName].ToString();
} /// <summary>
/// 是否有子结点
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
bool HasChildren(DataRowView row)
{
dataSet.Tables[0].DefaultView.RowFilter = String.Format("{0} = '{1}'", parentIdColumnName, row[idColumnName]);
bool hasChildren = dataSet.Tables[0].DefaultView.Count > 0;
//dataSet.Tables[0].DefaultView.RowFilter = "";
return hasChildren;
} /// <summary>
/// 得到父结点的viewPath
/// </summary>
/// <param name="viewPath"></param>
/// <returns></returns>
string GetParentViewPath(string viewPath)
{
return viewPath.Substring(0, viewPath.LastIndexOf("\\"));
}
#endregion #region 私有类,实现进一步的接口
/// <summary>
/// 实现一个HierarchicalDataSet 类中的 GetHierarchicalView 方法要求的 HierarchicalDataSourceView 类的实现
/// </summary>
class DataSourceView : HierarchicalDataSourceView
{
HierarchicalDataSet hDataSet;
string viewPath; /// <summary>
/// 生成一个DataSourceView
/// </summary>
/// <param name="hDataSet"></param>
/// <param name="viewPath"></param>
public DataSourceView(HierarchicalDataSet hDataSet, string viewPath)
{
this.hDataSet = new HierarchicalDataSet(hDataSet.dataSet, hDataSet.idColumnName, hDataSet.parentIdColumnName);
this.viewPath = viewPath;
} /// <summary>
/// 完成HierarchicalDataSourceView 类的 Select方法
/// </summary>
/// <returns></returns>
public override IHierarchicalEnumerable Select()
{
return new HierarchicalEnumerable(hDataSet, viewPath);
}
} /// <summary>
/// 实现 HierarchicalDataSourceView 类中派生出的类 DataSourceView 中必须要满足的 Select 方法的返回值接口IHierarchicalEnumerable
/// 也就是迭代的方法要在这里实现
/// </summary>
class HierarchicalEnumerable : IHierarchicalEnumerable
{
/// <summary>
/// 传入的HierarchicalDataSet
/// </summary>
HierarchicalDataSet hDataSet;
/// <summary>
/// 传入的viewPath
/// </summary>
string viewPath; /// <summary>
/// 生成一个HierarchicalEnumerable
/// </summary>
/// <param name="hDataSet"></param>
/// <param name="viewPath"></param>
public HierarchicalEnumerable(HierarchicalDataSet hDataSet, string viewPath)
{
this.hDataSet = new HierarchicalDataSet(hDataSet.dataSet, hDataSet.idColumnName, hDataSet.parentIdColumnName);
this.viewPath = viewPath;
} public IHierarchyData GetHierarchyData(object enumeratedItem)
{
DataRowView row = (DataRowView)enumeratedItem;
return new HierarchyData(hDataSet, viewPath, row);
} /// <summary>
/// 对数据源做过滤
/// 实现迭代
/// </summary>
/// <returns></returns>
public IEnumerator GetEnumerator()
{
if (viewPath == "")
hDataSet.dataSet.Tables[0].DefaultView.RowFilter = String.Format("{0} is null", hDataSet.parentIdColumnName);
else
{
string lastID = viewPath.Substring(viewPath.LastIndexOf("\\") + 1);
hDataSet.dataSet.Tables[0].DefaultView.RowFilter = String.Format("{0} = '{1}'", hDataSet.parentIdColumnName, lastID);
} IEnumerator i = hDataSet.dataSet.Tables[0].DefaultView.GetEnumerator();
//hDataSet.dataSet.Tables[0].DefaultView.RowFilter = "";
return i;
}
} /// <summary>
/// 实现IHierarchyData接口的HierarchyData类
/// 一个结点
/// 对于数据库来说
/// 相当于一个纪录集中的行
/// </summary>
class HierarchyData : IHierarchyData
{
HierarchicalDataSet hDataSet;
DataRowView row;
string viewPath; public HierarchyData(HierarchicalDataSet hDataSet, string viewPath, DataRowView row)
{
this.hDataSet = new HierarchicalDataSet(hDataSet.dataSet, hDataSet.idColumnName, hDataSet.parentIdColumnName);
this.viewPath = viewPath;
this.row = row;
} /// <summary>
/// 得到某行(结点)的所有子结点的迭代集
/// </summary>
/// <returns></returns>
public IHierarchicalEnumerable GetChildren()
{
return new HierarchicalEnumerable(hDataSet, hDataSet.GetChildrenViewPath(viewPath, row));
} /// <summary>
/// 得到父结点
/// </summary>
/// <returns></returns>
public IHierarchyData GetParent()
{
return new HierarchyData(hDataSet, hDataSet.GetParentViewPath(viewPath), hDataSet.GetParentRow(row));
} /// <summary>
/// 当前结点是否有孩子
/// </summary>
public bool HasChildren
{
get
{
return hDataSet.HasChildren(row);
}
} /// <summary>
/// 对成员的包装
/// </summary>
public object Item
{
get
{
return row;
}
} public string Path
{
get
{
return viewPath;
}
} public string Type
{
get
{
return typeof(DataRowView).ToString();
}
}
}
#endregion
}
}
DataSet theAllAClass = 得到的树状表;
DAL.HierarchicalDataSet dataSource = new DAL.HierarchicalDataSet(theAllAClass,"ID", "PARENT_ID");
this.TreeView1.DataSource = dataSource;
this.TreeView1.DataBind();
SqlConnection Conn = new SqlConnection(connectionString);
string sql = "select * from DeviceInfoSheet where ID='" + Class1.ID + "'";
SqlCommand Comm = new SqlCommand(sql, Conn);
SqlDataAdapter sda = new SqlDataAdapter(Comm);
DataTable dt = new DataTable();
sda.Fill(dt); List<string> root = new List<string>();// 不重复的根节点集合
foreach (DataRow row in dt.Rows)
{
string sTemp = row["DeviceAddress"].ToString();
if (!root.Contains(sTemp))
{
root.Add(sTemp);
}
} foreach (string sTemp in root)
{
treeView1.Nodes.Add(sTemp, sTemp);
DataRow[] rows = dt.Select("DeviceAddress = '" + sTemp + "'");
foreach (DataRow row in rows)
{
treeView1.Nodes[sTemp].Nodes.Add(row[2].ToString());//添加子节点
}
}
根据登录用户的ID动态加载
/// <summary>
/// 递归方法构建树形
/// </summary>
/// <param name="nono"></param>
/// <returns></returns>
public TreeNode CreateNodes(TreeNode nono)
{
//表示根节点
if (string.IsNullOrEmpty(nono.Text))
{
List<NodeClass> tmplist = (from b in nodes
select b).OrderBy(b => b.ParentID).ToList<NodeClass>(); nono.Text = tmplist[0].ID.ToString(); CreateNodes(nono);
}
else
{
List<NodeClass> list = (from a in nodes
where a.ParentID.ToString() == nono.Text
select a).ToList<NodeClass>(); foreach (var item in list)
{
if (item.ParentID == 0)
{
continue;
} TreeNode node = new TreeNode();
node.Text = item.ID.ToString();
nono.Nodes.Add(node); List<NodeClass> a = (from b in nodes
where b.ParentID.ToString() == node.Text
select b).ToList<NodeClass>(); //如果还有子集则继续构建树形
if (a.Count > 0)
{
CreateNodes(node);
}
}
} return nono;
} }
我写的,你可以参考
{
if(modeItem == null) return;
var node = new TreeNode(modelItem.DisplayName);
rootNode.Nodes.Add(node);
if (modelItem.Children != null) //没有孩子直接加节点
{
foreach (var ModelItem2 in modelItem.Children)
{
builderTree(ModelItem2,node); //然后递归搞
}
}
}
TreeNode root = new TreeNode("根结点");
builderTree(modelItem, root);