修改从ObjectDataSource返回的集合

Jim*_*m B 5 c# data-binding objectdatasource telerik radgrid

关于我正在做的事情的一些快速背景:

  • 我有一个页面,RadGrid绑定到ObjectDataSource,返回一个对象集合
  • 在那页上; 我也有两个清单; 一个包含需要与从ObjectDataSource返回的集合合并的对象的ID,另一个包含需要从该集合中删除的对象的ID
  • 目前处理这个问题的过程非常糟糕; 当一个项目被添加到这两个列表中的任何一个; 调用一个单独的方法,将myDataSource.Select()的结果转储到变量中,然后执行操作.然后网格清除其DataSourceId,并将该集合分配给DataSource属性,然后调用DataBind.(基本上解开ObjectDataSource并使用手动数据绑定代替)

我的问题如下:是否有可能以某种方式"拦截"从ObjectDataSource返回的集合,以便我可以在将集合传递给RadGrid之前对其进行操作?

如果这是不可能的; 这不是一个破坏者.我相信我可以修改Select()方法来接受这两个列表; 并在那里进行操作.我的另一个途径是为网格实现NeedDataSource()事件,并在那里进行操作.

理想情况下,我想使用第一个选项.有没有人成功这样做过?

Sim*_*ier 2

您可以从 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;
    }
}
Run Code Online (Sandbox Code Playgroud)