Изменение коллекции, возвращенной из ObjectDataSource - PullRequest
5 голосов
/ 22 декабря 2010

Краткий обзор того, над чем я работаю:

  • У меня есть страница с RadGrid, привязанной к ObjectDataSource, которая возвращает коллекцию объектов
  • .страница;У меня также есть два списка;один содержит идентификаторы объектов, которые необходимо объединить с коллекцией, возвращенной из ObjectDataSource, а другой содержит идентификаторы объектов, которые необходимо удалить из этой коллекции
  • Текущий процесс для обработки этого очень хакерский;когда элемент добавляется в один из этих двух списков;вызывается отдельный метод, который выгружает результаты myDataSource.Select () в переменную и выполняет манипуляцию.Затем сетка очищает свой DataSourceId, и коллекция назначается свойству DataSource, а затем вызывается DataBind.(по существу, удаляя ObjectDataSource и используя вместо этого ручную привязку данных)

Мой вопрос заключается в следующем: возможно ли как-то «перехватить» коллекцию, возвращенную из ObjectDataSource, чтобы я мог манипулировать коллекцией до ее передачив RadGrid?

Если это невозможно;это не торговец.Я полагаю, что могу изменить метод Select (), чтобы принять два списка;и выполнить манипуляцию там.У меня есть еще один способ - реализовать событие NeedDataSource () для сетки, а также управлять им.

В идеале я хотел бы использовать первый вариант.Кто-нибудь раньше делал это успешно?

1 Ответ

2 голосов
/ 26 декабря 2010

Вы можете получить из ObjectDataSource & ObjectDataSourceView и, соответственно, переопределить GetView & ExecuteSelect, примерно так:

public class MyObjectDataSource : ObjectDataSource
{
    private MyObjectDataSourceView _view;
    private MyObjectDataSourceView GetView()
    {
        if (_view == null)
        {
            _view = new MyObjectDataSourceView(this, "DefaultView", Context);
            if (IsTrackingViewState)
            {
                ((IStateManager)_view).TrackViewState();
            }
        }
        return _view;
    }

    protected override DataSourceView GetView(string viewName)
    {
        return GetView();
    }
}

public class MyObjectDataSourceView : ObjectDataSourceView
{
    public MyObjectDataSourceView(MyObjectDataSource owner, string name, HttpContext context)
        : base(owner, name, context)
    {
    }

    protected override IEnumerable ExecuteSelect(DataSourceSelectArguments arguments)
    {
        IEnumerable dataSource = base.ExecuteSelect(arguments);
        // TODO: do your stuff here
        return dataSource;
    }
}
...