Управление повторителем - Отмена связывает для определенного объекта

В рамках управления повторителем, там способ de-привязки определенные объекты, прежде чем страница будет представлена?

В настоящее время у нас есть набор объектов, связываемых с повторителем и если объект не является частью текущего языка, мы скрываем объект.

Я желаю смочь провести подсчет на повторителе и вернуть верный номер. Количество, которое также не включает скрытые объекты.

Действительно ли это возможно к de-bind определенным объектам, возможно, в ItemDataBound событие?

Обновление

Для каждого объекта в наборе мы связываем, мы проверяем базу данных во время ItemDataBound для получения дополнительной информации об объекте, таком как язык и т.д. Это в настоящее время мешает нам фильтровать связанные данные прежде, чем связать его.

7
задан Jamie Dixon 8 February 2010 в 14:39
поделиться

3 ответа

Я согласен с другими ответами - лучшее решение (как для производительности, так и для ясности кода) - изменить дизайн страницу, чтобы можно было отфильтровать недопустимые записи перед привязкой данных .

Большинство источников данных не позволяют нам удалять их элементы, пока ASP.NET выполняет их итерацию. Например, если вы выполняете привязку к простому универсальному списку List и удаляете элемент во время его итерации, список выдаст исключение InvalidOperationException .

В других случаях ASP.NET фактически выполняет итерацию копии источника данных. Если вы выполняете привязку к DataTable , ASP.NET использует копию содержимого (DataView по умолчанию) вместо повторения самих исходных строк - вы можете удалять элементы из базового источника данных во время итерации, но это не так. не влияет на операцию привязки данных.

Если предварительная фильтрация элементов не подходит, ваше текущее решение подходит: просто спрячьте элементы! Если вам нужно получить правильное количество сверх этого, отследите количество недопустимых элементов в обработчике ItemDataBound и представьте его как свойство уровня страницы:

if (IsInvalid(args.Item.DataItem)) {
    this.invalidItemCount++;
    // code to hide the current item
}
2
ответ дан 7 December 2019 в 03:15
поделиться

Без параметра Strict On VB.NET с удовольствием неявно преобразует Boolean в Integer . Я настоятельно рекомендую (особенно из фона C #) сделать Option Strict On значением по умолчанию для VB.NET работы.

Это можно сделать в Visual Studio в меню Сервис | Параметры | Проекты и решения | Значения VB по умолчанию .

отредактировать для получения дополнительной информации о VB (классическом) «расслабленном» отношении к преобразованию типа, google 'Evil Type Concurrition'. Те из нас, кто стремился сделать хорошую работу в VB (классика), должны были бороться с этим демоном на какое-то время...

-121--4222902-

Посмотрите на модуль проверки .

Попробуйте:

>>> import inspect
>>> def foo():
...     print inspect.getframeinfo(inspect.currentframe())[2]
...
>>> foo()
foo

или:

>>> def foo2():
...     print inspect.stack()[0][3]
...
>>> foo2()
foo2
-121--3572391-

Более подходящим решением может быть фильтрация связанной коллекции, если нет особой необходимости в этих скрытых предметах. Что-то вроде

items.Where(i => i.IsInLanguage(currentLanguage));

Обновить:

Что касается меня, я бы использовал такой подход:

var items = db.
      Where(i => i.IsInLanguage(currentLanguage)).
      Where(i => i.SomeField == anotherFilterParameter);

repeater.DataSource = items;
repeater.DataBind();

Так что вся фильтрация применяется заранее

Это также сократит количество обходов базы данных, что играет на повышение производительности

3
ответ дан 7 December 2019 в 03:15
поделиться

Эта проблема почти всегда связана с количеством объектов GDI, количеством объектов пользователя или количеством дескрипторов, и обычно не из-за нехватки памяти на компьютере.

Когда я отслеживаю одну из этих ошибок, я открываю ProcessExplorer и смотрю следующие столбцы: Дескрипторы, Потоки, Объекты GDI, Объекты USER, Частные байты, Виртуальный размер и Рабочий набор.

(По моему опыту, проблема обычно заключается в утечке объекта из-за того, что обработчик событий удерживает объект и препятствует его удалению.)

-121--970949-

Почему бы не отфильтровать источник данных перед привязкой. Поэтому предположим, что вы используете некоторые пользовательские объекты:

myRepeater.DataSource=repository.getItems().Where(item=>item.Language==CurrentLanguage);

Если они вам не нужны, не связывайте их в первую очередь.

Обновить

Если это вообще возможно, необходимо предварительно извлечь эту информацию из БД. Эти списки велики? Если это так, попадание в БД один раз для каждого предмета в списке покажется как проблема с производительностью.

2
ответ дан 7 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: