请高手作答,关于C# TreeView 绑定 DataTable 的效率问题
我的代码是从数据库中读取数据,动态生成了一个DataTable(数据量及层级关系大概有五组),其中的字段中有父子节点关系,只是生成DataTable的话,在页面中显示是非...
我的代码是从数据库中读取数据,动态生成了一个DataTable(数据量及层级关系大概有五组),其中的字段中有父子节点关系,只是生成DataTable的话,在页面中显示是非常快的,但是一绑定TreeView就变得非常慢,我用的方法是在网上最常见的递归,想请教是否有更高效的方法,请高手帮忙作答,多谢,区区30分奉上。下面贴出TreeView绑定的代码:
public void Bind_Tv(DataTable dt, TreeNodeCollection tnc, string pid_val, string id, string pid, string text)
{
DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据
TreeNode tn;//建立TreeView的节点(TreeNode),以便将取出的数据添加到节点中
//以下为三元运算符,如果父id为空,则为构建“父id字段 is null”的查询条件,否则构建“父id字段=父id字段值”的查询条件
string filter = string.IsNullOrEmpty(pid_val) ? pid + " is null" : string.Format(pid + "='{0}'", pid_val);
dv.RowFilter = filter;//利用DataView将数据进行筛选,选出相同 父id值 的数据
foreach (DataRowView drv in dv)
{
tn = new TreeNode();//建立一个新节点(学名叫:一个实例)
tn.Value = drv[id].ToString();//节点的Value值,一般为数据库的id值
tn.Text = drv[text].ToString();//节点的Text,节点的文本显示
//tn.NavigateUrl = "xitongguanli/" + drv["url"].ToString();
//tn.Target = "lower_right";
tnc.Add(tn);//将该节点加入到TreeNodeCollection(节点集合)中
Bind_Tv(dt, tn.ChildNodes, tn.Value, id, pid, text);//递归(反复调用这个方法,直到把数据取完为止)
}
} 展开
public void Bind_Tv(DataTable dt, TreeNodeCollection tnc, string pid_val, string id, string pid, string text)
{
DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据
TreeNode tn;//建立TreeView的节点(TreeNode),以便将取出的数据添加到节点中
//以下为三元运算符,如果父id为空,则为构建“父id字段 is null”的查询条件,否则构建“父id字段=父id字段值”的查询条件
string filter = string.IsNullOrEmpty(pid_val) ? pid + " is null" : string.Format(pid + "='{0}'", pid_val);
dv.RowFilter = filter;//利用DataView将数据进行筛选,选出相同 父id值 的数据
foreach (DataRowView drv in dv)
{
tn = new TreeNode();//建立一个新节点(学名叫:一个实例)
tn.Value = drv[id].ToString();//节点的Value值,一般为数据库的id值
tn.Text = drv[text].ToString();//节点的Text,节点的文本显示
//tn.NavigateUrl = "xitongguanli/" + drv["url"].ToString();
//tn.Target = "lower_right";
tnc.Add(tn);//将该节点加入到TreeNodeCollection(节点集合)中
Bind_Tv(dt, tn.ChildNodes, tn.Value, id, pid, text);//递归(反复调用这个方法,直到把数据取完为止)
}
} 展开
3个回答
展开全部
我曾经做过一个类似的树型结构,但是因为数据量太大,层级也多,生成树确实会很慢。
目前生成树只能是递归,没有别的好办法,但想提高显示效率,至少视觉上看越来很快,我的办法是把每个递归拆开来执行,如下:
1:只绑定根结点并显示出来,并在结点名称后面显示出该结点的下级结点个数
2:给下级结点个数大于零的结点添加鼠标单击事件,单击后显示该结点的下级结点及下级结点对应的下级结点个数(与第一步相似)
3:如上两步,递归到叶子结点
这样,因为把绑定过程拆分了,每次只生成一层,速度会非常快,而且基本符合树的操作习惯,用户操作时如同一开始只看到了一颗全部闭合的树,然后一步步的展开,不会注意它与一次生成的树有什么区别。
目前生成树只能是递归,没有别的好办法,但想提高显示效率,至少视觉上看越来很快,我的办法是把每个递归拆开来执行,如下:
1:只绑定根结点并显示出来,并在结点名称后面显示出该结点的下级结点个数
2:给下级结点个数大于零的结点添加鼠标单击事件,单击后显示该结点的下级结点及下级结点对应的下级结点个数(与第一步相似)
3:如上两步,递归到叶子结点
这样,因为把绑定过程拆分了,每次只生成一层,速度会非常快,而且基本符合树的操作习惯,用户操作时如同一开始只看到了一颗全部闭合的树,然后一步步的展开,不会注意它与一次生成的树有什么区别。
追问
能帮忙把代码贴出来吗?多谢。
追答
这只是我曾经做过的一个项目中的其中一个小模块,时间很久了,这两年我基本已经不再使用asp.net的服务器控件,代码早没有了,只能告诉你思路,其实只要能写得出绑定树的方法,多写个事件也差不多的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
威孚半导体技术
2024-08-19 广告
2024-08-19 广告
威孚(苏州)半导体技术有限公司是一家专注生产、研发、销售晶圆传输设备整机模块(EFEM/SORTER)及核心零部件的高科技半导体公司。公司核心团队均拥有多年半导体行业从业经验,其中技术团队成员博士、硕士学历占比80%以上,依托丰富的软件底层...
点击进入详情页
本回答由威孚半导体技术提供
展开全部
你调用这个bind_tv的时候,第二个参数TreeNodeCollectio是怎么传值的,如果你直接用的页面上的控件的childnodes传它的,那就改成一个普通的TreeNodeCollection变量传进去,等bind_tv执行完了再赋值给页面的treeview
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有没有demo来测试一下,包括数据库?另外
dt没必要做参数,dv可以作为全局变量一次性生成,应该可以提高一定速度。
其他有些参数似乎也没必要,自己分析下。
怎么没看到关联父子节点关系的语句?
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询