修改从ObjectDataSource返回的集合

时间:2010-12-22 20:13:55

标签: c# data-binding telerik radgrid objectdatasource

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

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

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

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

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

1 个答案:

答案 0 :(得分: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;
    }
}