我应该如何将数据源中的字段绑定到ListView控件?

时间:2011-04-13 21:49:38

标签: asp.net data-binding datasource objectdatasource

我有一个ListView控件,我曾经使用ASP ObjectDataSource控件填充它。这很好。

但是,我想实现一个过滤器,它显示ListView中以字母A,B,C等开头的项目。为此,我删除了ObjectDataSource控件并将其替换为Page_Load事件允许的一些代码我可以更好地控制我作为数据源传入的内容,类似于:

System.Diagnostics.Debug.Print("{0:HH:mm:ss} : GET DATA", DateTime.Now);
List<MyItem> items = GetItems("A"); // Gets a list of items with a description that 
                                    // begins with A
MyListView.Datasource = items;
System.Diagnostics.Debug.Print("{0:HH:mm:ss} : BIND DATA", DateTime.Now);
MyListView.DataBind();
System.Diagnostics.Debug.Print("{0:HH:mm:ss} : DONE", DateTime.Now);

输出(时间代表实际结果):

16:00:00 : GET DATA
16:00:00 : BIND DATA
16:00:20 : DONE

由于这样做,在浏览器中加载页面大约需要20秒,而在使用ObjectDataSource时大约需要1秒。

要将数据加载到ListView行中,我使用标准<%# Eval("Description") %>方法。在对SO和Google进行一些搜索后,some people似乎表示Eval效率低下。

为什么Page_Load事件中的手动绑定会降低所有内容?是因为Eval效率低下吗?如何加快速度,以及正确的方法是什么?

2 个答案:

答案 0 :(得分:2)

似乎我不太可能认为问题是Eval语句或者你在页面加载中进行数据绑定的事实,除非你返回一个非常大的列表。 Eval可能较慢,但不是您看到的数量。可能还有另一个原因。

我会仔细检查GetItems()函数。选择代码更有可能效率低于预期。

要检查的其他事项......

检查Eval正在调用的属性。他们是否做了更多只返回字符串的事情? Eval将运行这些属性/方法中的任何代码,因此请确保它们尽可能快。

答案 1 :(得分:0)

您的数据库中有多少条记录?你有启用分页吗?如果是这样,问题可能是ObjectDataSource使用更有效的方法来仅检索它打算显示的对象的数量,而对GetItems()的调用则返回所有内容,即使它没有显示。鉴于返回时间的巨大差异,这是我对正在发生的事情的猜测。

如果发生了这种情况,可以通过限制返回的记录数来加快速度。这将取决于您对GetItems()的实现。你想写一些像GetItemsPaged(int firstRecord,int pageLength)那样只返回有限数量的数据。