Как связать поля из источника данных с элементом управления ListView? - PullRequest
1 голос
/ 14 апреля 2011

У меня есть элемент управления 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 секунд, а не около 1 секунды, когда я использовал ObjectDataSource.

Для загрузки данных в строки моего ListView я использую стандартную<%# Eval("Description") %> метод.После некоторых поисков в SO и google некоторые люди , похоже, говорят, что Eval неэффективно.

Почему ручное связывание в событии Page_Load все замедляет?Это потому, что Eval неэффективен?Как я могу ускорить его и как правильно это сделать?

Ответы [ 2 ]

2 голосов
/ 14 апреля 2011

Мне кажется маловероятным, что проблема заключается в утверждении Eval или в том, что вы привязываете данные при загрузке страницы, если только вы не возвращаете очень очень большой список. Eval может быть медленнее, но не на сумму, которую вы видите. Вероятно, есть другая причина.

Я бы дважды проверил функцию GetItems (). Скорее всего, код выбора как-то менее эффективен, чем мог бы быть.

Дополнительные вещи для проверки ...

Проверьте свойства, которые Eval вызывает. Они делают что-то большее, что просто возвращает строку? Eval будет запускать любой код в этих свойствах / методах, поэтому убедитесь, что они работают как можно быстрее

0 голосов
/ 14 апреля 2011

Сколько записей в вашей базе данных? У вас включен пейджинг? Если это так, проблема может заключаться в том, что ObjectDataSource использует более эффективный метод для получения только количества объектов, которые он намеревается отобразить, тогда как ваш вызов GetItems () возвращает все, даже если он не отображается. Учитывая огромное неравенство во времени возвращения, это мое предположение относительно того, что происходит.

Если это то, что происходит, вы ускоряете его, ограничивая количество возвращаемых записей. Это будет зависеть от вашей реализации GetItems (). Вы хотели бы написать что-то вроде GetItemsPaged (int firstRecord, int pageLength), которое возвращает только ограниченный объем данных.

...