2010-12-22 7 views
5

Algunos antecedentes rápida en lo que estoy trabajando en:Modificación de una colección de regresar de ObjectDataSource

  • Tengo una página con un RadGrid atada a un ObjectDataSource que devuelve una colección de objetos
  • En esa página; También tengo dos listas; uno contiene Id. de objetos que deben fusionarse con la colección devuelta desde ObjectDataSource, y el otro contiene Id. de objetos que deben eliminarse de esa colección
  • El proceso actual para manejar esto es muy pirata; cuando un artículo se agrega a cualquiera de esas dos listas; se llama a un método separado que vuelca los resultados de myDataSource.Select() en una variable y realiza la manipulación. Luego, la cuadrícula tiene su DataSourceId despejado, y la colección se asigna a la propiedad DataSource, y luego se llama a DataBind. (Esencialmente desatar el ObjectDataSource y el uso de enlace de datos manual en lugar)

Mi pregunta es la siguiente: ¿Es posible de alguna manera "interceptar" la colección regresó del ObjectDataSource para que pueda manipular la colección antes de que se pasa a la RadGrid ?

Si esto no es posible; no es un dealbreaker. Creo que puedo modificar el método Select() para aceptar las dos listas; y realizar la manipulación allí. Otra avenida que tengo es implementar el evento NeedDataSource() para la grilla, y manipular allí también.

Idealmente, me gustaría utilizar la primera opción. Alguien ha tenido éxito haciendo esto antes?

Respuesta

2

Usted puede derivar de ObjectDataSource & ObjectDataSourceView, y anular, respectivamente GetView & ExecuteSelect, algo como esto:

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

Niza cosas. ¡Muchas gracias! –

Cuestiones relacionadas