使用与绑定不同的数据源动态地将列添加到Gridview

时间:2010-09-08 17:05:52

标签: c# asp.net entity-framework objectdatasource

告诉我这是否可能:

我有一个绑定到ObjectDataSource的gridview,为我提供数据库中的数据。我正在使用Linq-to-entities填充Objectdatasource。我提供列和行的典型设置。

下面我有一个可怕的图形表示。


       x_col    x_col   x_col   
x_row| x_data   x_data  x_data    
x_row| x_data   x_data  x_data  
x_row| x_data   x_data  x_data  
x_row| x_data   x_data  x_data    
x_row| x_data   x_data  x_data   

我想要做的是从数据库中的另一个表向此gridview添加列:原始数据为x;不同的数据是y。


       x_col    x_col   x_col   y_col   y_col   y_col 
x_row| x_data   x_data  x_data  y_data  y_data  y_data
x_row| x_data   x_data  x_data  y_data  y_data  y_data
x_row| x_data   x_data  x_data  y_data  y_data  y_data
x_row| x_data   x_data  x_data  y_data  y_data  y_data  
x_row| x_data   x_data  x_data  y_data  y_data  y_data 

直到运行时我才知道任何y信息,因此动态添加。我不需要将x更新回数据库,但我需要更新y。

看起来数据源只能有一次select方法,所以我不知道怎么做。

我希望我在这里不太抽象。

1 个答案:

答案 0 :(得分:2)

简短的回答是肯定的,您可以动态更改/重新生成GridView的列。最简单的方法是在DataBinding之前以编程方式定义DataSource。 DataSource可以是几乎任何对象的IEnumerable,允许您创建一个自定义GridRow对象,该对象以您希望查看的形式保存数据。

这就是我要做的,在高层次上:

  • 从标记中的GridView中删除静态列定义,并在GridView本身上将属性AutoGenerateColumns设置为true。这将导致GridView基于用作DataSource的对象在DataBinding上创建列。

  • 创建一个简单的POCO类来表示您想要显示的每组数据。如果不同列排列的数量很大,或者在编译时无法知道,那么将数据拉入或推送到DataTable可能是值得的。

  • 准备结果时,将数据传输到适用的POCO类列表或DataTable中。将此List或DataTable设置为DataSource,并调用DataBind()

  • 可以通过编程方式指定自定义标签;系统将默认为其DataSource对象的字段,属性或列名称的ToString()表示形式。您可以通过将处理程序附加到GridView的OnDataBinding事件来覆盖此行为,或者只是在调用DataBind()之后更改列名称。

或者,您可以选择不自动创建列,但仍然可以在页面加载或PreRender上动态创建列。这将允许您自己控制所有细节,而不依赖于默认值。您可以使用它来创建各种动态网格,这些网格都将映射到同一数据对象的字段,从而减少您的类数。

动态网格创建对于搜索页面非常有用,在这些页面中,您可能希望从中搜索一种类型的记录,但不希望为您能够搜索的所有内容预先定义GridView ,也不必规范化搜索结果,使它们都适合类似的网格。