В рамках управления повторителем, там способ de-привязки определенные объекты, прежде чем страница будет представлена?
В настоящее время у нас есть набор объектов, связываемых с повторителем и если объект не является частью текущего языка, мы скрываем объект.
Я желаю смочь провести подсчет на повторителе и вернуть верный номер. Количество, которое также не включает скрытые объекты.
Действительно ли это возможно к de-bind определенным объектам, возможно, в ItemDataBound
событие?
Обновление
Для каждого объекта в наборе мы связываем, мы проверяем базу данных во время ItemDataBound
для получения дополнительной информации об объекте, таком как язык и т.д. Это в настоящее время мешает нам фильтровать связанные данные прежде, чем связать его.
Я согласен с другими ответами - лучшее решение (как для производительности, так и для ясности кода) - изменить дизайн страницу, чтобы можно было отфильтровать недопустимые записи перед привязкой данных .
Большинство источников данных не позволяют нам удалять их элементы, пока ASP.NET выполняет их итерацию. Например, если вы выполняете привязку к простому универсальному списку List
и удаляете элемент во время его итерации, список выдаст исключение InvalidOperationException
.
В других случаях ASP.NET фактически выполняет итерацию копии источника данных. Если вы выполняете привязку к DataTable
, ASP.NET использует копию содержимого (DataView по умолчанию) вместо повторения самих исходных строк - вы можете удалять элементы из базового источника данных во время итерации, но это не так. не влияет на операцию привязки данных.
Если предварительная фильтрация элементов не подходит, ваше текущее решение подходит: просто спрячьте элементы! Если вам нужно получить правильное количество сверх этого, отследите количество недопустимых элементов в обработчике ItemDataBound и представьте его как свойство уровня страницы:
if (IsInvalid(args.Item.DataItem)) {
this.invalidItemCount++;
// code to hide the current item
}
Без параметра 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();
Так что вся фильтрация применяется заранее
Это также сократит количество обходов базы данных, что играет на повышение производительности
Эта проблема почти всегда связана с количеством объектов GDI, количеством объектов пользователя или количеством дескрипторов, и обычно не из-за нехватки памяти на компьютере.
Когда я отслеживаю одну из этих ошибок, я открываю ProcessExplorer и смотрю следующие столбцы: Дескрипторы, Потоки, Объекты GDI, Объекты USER, Частные байты, Виртуальный размер и Рабочий набор.
(По моему опыту, проблема обычно заключается в утечке объекта из-за того, что обработчик событий удерживает объект и препятствует его удалению.)
-121--970949-Почему бы не отфильтровать источник данных перед привязкой. Поэтому предположим, что вы используете некоторые пользовательские объекты:
myRepeater.DataSource=repository.getItems().Where(item=>item.Language==CurrentLanguage);
Если они вам не нужны, не связывайте их в первую очередь.
Обновить
Если это вообще возможно, необходимо предварительно извлечь эту информацию из БД. Эти списки велики? Если это так, попадание в БД один раз для каждого предмета в списке покажется как проблема с производительностью.