2010-12-22 62 views
5

返回什麼我工作的一些背景知識:修改收集從ObjectDataSource控件

  • 我得綁到一個ObjectDataSource一個radgrid控件返回對象的集合
  • 在一個頁面頁;我也有兩個名單;一個包含需要與從ObjectDataSource返回的集合合併的對象的Ids,另一個包含需要從該集合中移除的對象的Ids
  • 當前處理此操作的過程非常駭人,當一個項目被添加到這兩個列表中的任何一個時;調用一個單獨的方法,將myDataSource.Select()的結果轉儲到變量中,並執行操作。網格然後清除其DataSourceId,並將集合分配給DataSource屬性,然後調用DataBind。 (本質上解開ObjectDataSource控件和使用手動綁定代替)

我的問題是:是否有可能以某種方式「攔截」集合ObjectDataSource返回所以它被傳遞到radgrid控件之前,我可以操作集合?

如果這是不可能的;這不是一個破壞者。我相信我可以修改Select()方法來接受這兩個列表;並在那裏執行操作。我擁有的另一個途徑是爲網格實現NeedDataSource()事件,並在那裏操作。

理想情況下,我想使用第一個選項。有沒有人成功做過這件事?

回答

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; 
    } 
} 
+0

不錯的東西。非常感謝! – 2010-12-27 13:21:03