Кто-нибудь знает логику запечатывания DataSourceSelectArguments?
Я реализовал настраиваемый источник данных (и связанные классы) для некоторых настраиваемых бизнес-объектов и настраиваемых элементов управления Web. Обдумывая фильтры (например, сетку), я обнаружил, что DataSourceSelectArguments запечатан. Конечно, я что-то упускаю. (Может быть, логика связана с тем, что бессмысленно снова спрашивать БД, просто для фильтрации? Просто предположение.)





Я предполагаю, потому что класс - это тупой объект передачи данных, который просто используется для передачи аргументов методу.
В самом этом классе нет определенных операций, поэтому какой полиморфизм вы ожидаете? Например, существующие методы будут знать только о свойствах этого класса, которые можно установить, поэтому нет необходимости переопределять свойства. Если вы добавите новые свойства, они будут проигнорированы.
Можете ли вы создать свой собственный класс Arguments для своего собственного метода, который просто имеет все те же свойства?
Извините за задержку, я был в праздничные дни. :)
Проблема в том, что DataBoundControl, например ListView, имеет свойство SortExpression, но не FilterExpression. Можно реализовать сортируемую сетку / список с ListView с помощью IButtonControl WebControl, который запускает PostBack и событие Command. Затем вы используете SortExpression или метод Sort и передаете выражение сортировки, которое заполнит DataSourceSelectArguments.SortExpression, и передайте его в DataSource, который может создать соответствующий оператор SQL (в моем случае) для извлечения данных из БД. Это позволяет разделить данные и WebControl, который их отображает, IMHO.
Следуя этому шаблону, я собирался реализовать фильтр, заполнив дополнительный объект параметра в моем DataSourceSelectArguments запрошенным фильтром, и я вызвал бы Sort, который передал бы этот объект аргументов в DataSource, где я бы создал подходящее предложение select .
Я наконец решил это, "закодировав" информацию о фильтре в SortExpression, но я нахожу это некрасивым (в первую очередь для названия: sort! = Filter), и мне было интересно, есть ли более подходящий способ сделать это или если мне не хватает чего-то более тонкого.
Редактировать:
Возможно, лучшим подходом было бы переопределить метод ListViewPerformSelect и спросить мою собственную реализацию DataSourceView, может ли он фильтровать, а затем вызвать специальный метод ExecuteSelect, который принимает специальный DataSourceSelectArguments с объектом фильтра. Разумеется, будьте осторожны, чтобы не сделать ничего, что может сломаться, когда кто-то использует пользовательский ListView с не расширенным DataSourceView.