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

发布于 2024-09-17 21:15:49 字数 932 浏览 3 评论 0原文

告诉我这是否可能:

我有一个绑定到 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。

看起来数据源只能有一次选择方法,所以我不知道如何做到这一点。

我希望我在这里没有太抽象。

Tell me if this is even possible:

I have a gridview bound to an ObjectDataSource providing me with data from a database. I'm filling the Objectdatasource using Linq-to-entities. Typical setup where I'm supplying the columns and rows.

Below I have a horrible graphical representation.


       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   

What I would like to do is add columns to this gridview from another table in the database: orginal data being x; different data being 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 

I don't know any of the y info until runtime, so that is added dynamically. I don't need to update x back to the database, but I do need to update y.

It looks like the datasource can only have once select method, so I don't know how I can do this.

I hope I'm not being too abstract here.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

私藏温柔 2024-09-24 21:15:49

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

下面是我将在较高级别上执行的操作:

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

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

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

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

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

动态网格创建对于搜索页面之类的内容非常有用,您可能希望从多种记录中查找一种类型的记录,但不希望为您能够搜索的所有内容提供预定义的 GridView,也没有标准化搜索结果,使它们都适合相似的网格。

The short answer is yes, you can dynamically change/regenerate the columns of a GridView. The easiest way to do so is to programatically define the DataSource before DataBinding. The DataSource can be an IEnumerable of practically any object, allowing you to create a custom GridRow object that holds the data in the form you wish to view it.

Here's what I would do, at a high level:

  • Remove the static column definitions from your GridView in the markup, and set the property AutoGenerateColumns to true on the GridView itself. This will cause the GridView to create columns on DataBinding based on the object used as the DataSource.

  • Create a simple, POCO class to represent each set of data you want to show. If the number of different column arrangements is going to be large, or cannot be known at compile-time, it may be worth the overhead to pull or push the data into a DataTable.

  • When preparing your results, transfer the data into a list of the applicable POCO class, or into the DataTable. Set this List or DataTable as the DataSource, and call DataBind()

  • Custom labels can be specified programmatically; the system will default to the ToString() representation of the field, property or column name of its DataSource object. You can override this behavior by attaching a handler to the OnDataBinding event of the GridView, or simply changing column names after calling DataBind().

Alternately, you can choose to not create columns automatically, but still do so dynamically on page load or PreRender. This will allow you to control all the specifics yourself, without relying on defaults. You can use this to create various dynamic grids that will all map to fields of the same data object, reducing your class count somewhat.

Dynamic grid creation is useful for things like search pages, where you may want to look for one type of record out of many, but don't want to have a pre-defined GridView for everything you're able to search for, nor have to normalize the search results so they all fit in a similar grid.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文