
vs2010中treeview控件绑定数据winform界面怎么绑定?要求有例子和代码
1个回答
展开全部
官方版本treeview的确比较麻烦,没有提供对应的数据源绑定功能,一般需要递归遍历(WPF下好点有所谓的MVVM,提供了一个treeview专用的数据接口,你ViewModel里实现这个接口就可以直接绑定),非官方的treeview控件一般有数据绑定扩展,比如radtreeview。
我在net4下写了两个扩展,你看着用把
namespace Hycommon
{
public static class TreeViewEx
{
//对已经实现层级组件模式的数据操作
public static void makeTreeView<T, TNode>(this IEnumerable<T> list,//层级数据源
IEnumerable tds, //treeview节点集合,也就是Treeview.nodes
Func<T, IEnumerable<T>> funSource, //因为数据本身具有层级,所以需要知道如何访问下级数据
Func<T, TNode> funConvert, //把T数据绑定到treenode上
Func<TNode, IEnumerable> ChirldFun //如何访问treenode的子节点
)
{
foreach (var item in list)
{
TNode td = funConvert(item);
var source = funSource(item);
dynamic d_tds = tds;
d_tds.Nodes.Add(td);
source.makeTreeView(ChirldFun(td), funSource, funConvert, ChirldFun);
}
}
//对非层级组件数据操作
public static void makeTreeView<TSource, TID, TNode>(
this IEnumerable<TSource> list,//原始数据源
IEnumerable tds, //treeview节点集合
Func<TSource, TID> FunID, //获取数据id
Func<TSource, TID> funParentID,//获取父节点编号
Func<TSource, TNode> funConvert, //转换为treenode
Func<TNode, IEnumerable> ChirldFun,//如何访问treenode的下级节点集合
decimal parentId = 0 //初始访问节点,默认为0
) where TID : struct
{
var tlist = list.Where(c => Convert.ToDecimal(funParentID(c)) == parentId);
foreach (var item in tlist)
{
TNode td = funConvert(item);
dynamic d_tds = tds;
d_tds.Nodes.Add(td);
list.makeTreeView(ChirldFun(td), FunID, funParentID, funConvert, ChirldFun,Convert.ToDecimal(FunID(item)));
}
}
}
}
调用方式
//层级数据调用
List<T> x=new List<T>();
x.makeTreeView<T,TreeNode>(Treeview1.Nodes,p=>p.Chirlds,p=>new TreeNode(){Text=p.name,Tag=p},p=>p.Nodes);
非层级调用
List<T> x=new List<T>();
x.makeTreeView(treeview1.Nodes,p=>p.id,p=>p.parentid,p=>new treenode(){Text=p.name,Tag=p},p=>p.Nodes,0)
我在net4下写了两个扩展,你看着用把
namespace Hycommon
{
public static class TreeViewEx
{
//对已经实现层级组件模式的数据操作
public static void makeTreeView<T, TNode>(this IEnumerable<T> list,//层级数据源
IEnumerable tds, //treeview节点集合,也就是Treeview.nodes
Func<T, IEnumerable<T>> funSource, //因为数据本身具有层级,所以需要知道如何访问下级数据
Func<T, TNode> funConvert, //把T数据绑定到treenode上
Func<TNode, IEnumerable> ChirldFun //如何访问treenode的子节点
)
{
foreach (var item in list)
{
TNode td = funConvert(item);
var source = funSource(item);
dynamic d_tds = tds;
d_tds.Nodes.Add(td);
source.makeTreeView(ChirldFun(td), funSource, funConvert, ChirldFun);
}
}
//对非层级组件数据操作
public static void makeTreeView<TSource, TID, TNode>(
this IEnumerable<TSource> list,//原始数据源
IEnumerable tds, //treeview节点集合
Func<TSource, TID> FunID, //获取数据id
Func<TSource, TID> funParentID,//获取父节点编号
Func<TSource, TNode> funConvert, //转换为treenode
Func<TNode, IEnumerable> ChirldFun,//如何访问treenode的下级节点集合
decimal parentId = 0 //初始访问节点,默认为0
) where TID : struct
{
var tlist = list.Where(c => Convert.ToDecimal(funParentID(c)) == parentId);
foreach (var item in tlist)
{
TNode td = funConvert(item);
dynamic d_tds = tds;
d_tds.Nodes.Add(td);
list.makeTreeView(ChirldFun(td), FunID, funParentID, funConvert, ChirldFun,Convert.ToDecimal(FunID(item)));
}
}
}
}
调用方式
//层级数据调用
List<T> x=new List<T>();
x.makeTreeView<T,TreeNode>(Treeview1.Nodes,p=>p.Chirlds,p=>new TreeNode(){Text=p.name,Tag=p},p=>p.Nodes);
非层级调用
List<T> x=new List<T>();
x.makeTreeView(treeview1.Nodes,p=>p.id,p=>p.parentid,p=>new treenode(){Text=p.name,Tag=p},p=>p.Nodes,0)
追问
老大 我只需要绑定Sql数据库的表就行了 别给我这么麻烦的啊
追答
呵呵,绑定数据库表你就用第二个非层级数据即可
你总有id,和父id两个字段把,按上面的调用改就是
datatable dt=new datatable() //怎么获取数据到dt不用我写把
dt.AsEnumerable().makeTreeView(treeview1.Nodes,p=>Convert.ToInt32(p["id"]),p=>Convert.ToInt32(p.parentid),p=>new treenode(){Text=p["需要显示的字段"],Tag=p},p=>p.Nodes,0)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询