动态数据绑定示例

作为一名Web开发者,经常在许多Web应用程序中使用DevExpress控件。在本文中,将展示一个示例,说明如何在运行时动态绑定数据到ASPxGridView(这是一个在数据驱动应用程序中常用的控件)。将使用ASP.NET控件套件,更具体地说是Web Forms

首先,将创建一个空的Visual StudioASP.NETWeb应用程序。还创建了一个简单的数据库,其中包含一个主表(Categories)和另一个详细表(Products),以及一个在(Products)表中的记录引用(Categories)表中的记录,如下所示的图像。

使用的是SQL Server 2012创建数据库,应用程序是为.NET Framework 4.5编写的,示例是用C#编写的,使用的DevExpress版本是Version=15.2.4.0。

为了实现数据绑定,创建了一个简单的DataHelper类来从数据库中检索数据。将不会专注于从数据库获取数据的实践,而是关注如何创建数据并将其绑定到详细模板网格。

以下是DataHelper类的代码:

using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Web; namespace MasterDetailTemplateRuntim.AppCode { public class DataHelper { public SqlConnection GetConnection() { string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["MasterDetailDBConnectionString"].ConnectionString; SqlConnection conn = new SqlConnection(connStr); return conn; } public DataTable getDataTable(string query) { DataTable table = new DataTable("Table"); SqlCommand cmd = new SqlCommand(query, GetConnection()); SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(table); return table; } } }

getDataTable方法用于绑定主网格和详细网格,这取决于传递的查询。

接下来,添加了DetailGridTemplate类。DetailGridTemplate类实现了ITemplate接口,因此它必须实现InstantiateIn方法,该方法确定在模板中实例化哪个控件。

using DevExpress.Web; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; namespace MasterDetailTemplateRuntim.AppCode { public class DetailGridTemplate : ITemplate { Control parent; object masterKey; ASPxGridView detailGrid; public DetailGridTemplate(ASPxGridView grid) { this.detailGrid = grid; } public void InstantiateIn(Control container) { parent = container; masterKey = ((GridViewDetailRowTemplateContainer)parent).KeyValue; parent.Controls.Add(detailGrid); } } }

如前所述,DetailGridTemplate类有一个公共构造函数,它接受detailgrid作为参数以将其添加到模板中。

现在添加一个webform(MasterDetailPage.aspx),并在Page_Load事件处理程序中创建一个ASPxGridView对象。

using DevExpress.Web; using MasterDetailTemplateRuntim.AppCode; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace MasterDetailTemplateRuntim { public partial class MasterDetailPage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // 创建主网格 ASPxGridView MasterGrid = new ASPxGridView(); ASPxGridView dGrid = new ASPxGridView(); dGrid.BeforePerformDataSelect += dGrid_BeforePerformDataSelect; MasterGrid.AutoGenerateColumns = true; MasterGrid.SettingsDetail.ShowDetailRow = true; MasterGrid.KeyFieldName = "ID"; // 创建详细网格并将其添加到详细模板 MasterGrid.Templates.DetailRow = new DetailGridTemplate(dGrid); DataHelper dh = new DataHelper(); MasterGrid.DataSource = dh.getDataTable("select * from categories"); MasterGrid.DataBind(); Page.Form.Controls.Add(MasterGrid); // 将模板添加到网格 } } }

如上代码所示,创建了主网格和详细网格,并为详细网格注册了BeforePerformDataSelect处理程序,以便在运行时绑定详细网格的数据源。

在接下来的代码段中,创建了一个DetailGridTemplate实例,并将其分配给mastergrid的详细行模板,一步到位。注意,详细网格作为参数传递给构造函数。

MasterGrid.Templates.DetailRow = new DetailGridTemplate(dGrid);

绑定主网格的数据源:

DataHelper dh = new DataHelper(); MasterGrid.DataSource = dh.getDataTable("select * from categories"); MasterGrid.DataBind(); Page.Form.Controls.Add(MasterGrid); // 将主网格添加到页面表单的控件

现在,为了根据主记录绑定详细网格,创建了一个处理BeforePerformDataSelect事件的处理程序方法。

void dGrid_BeforePerformDataSelect(object sender, EventArgs e) { ASPxGridView grid = sender as ASPxGridView; grid.AutoGenerateColumns = true; DataHelper dh = new DataHelper(); grid.DataSource = dh.getDataTable("select * from products where categoryID=" + grid.GetMasterRowKeyValue().ToString()); }

如前所述,ASPxGridView类提供了一个方法来获取主网格的主行的键值(GetMasterRowKeyValue),它用于获取与主行相关的所有详细行。

最终,MasterDetailPage.aspx.cs看起来像这样:

using DevExpress.Web; using MasterDetailTemplateRuntim.AppCode; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace MasterDetailTemplateRuntim { public partial class MasterDetailPage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //create master grid ASPxGridView MasterGrid = new ASPxGridView(); ASPxGridView dGrid = new ASPxGridView(); dGrid.BeforePerformDataSelect += dGrid_BeforePerformDataSelect; MasterGrid.AutoGenerateColumns = true; MasterGrid.SettingsDetail.ShowDetailRow = true; MasterGrid.KeyFieldName = "ID"; //create detail grid and add it to the detail tamplate MasterGrid.Templates.DetailRow = new DetailGridTemplate(dGrid); DataHelper dh = new DataHelper(); MasterGrid.DataSource = dh.getDataTable("select * from categories"); MasterGrid.DataBind(); Page.Form.Controls.Add(MasterGrid); //add the template to grid } void dGrid_BeforePerformDataSelect(object sender, EventArgs e) { ASPxGridView grid = sender as ASPxGridView; grid.AutoGenerateColumns = true; DataHelper dh = new DataHelper(); grid.DataSource = dh.getDataTable("select * from products where categoryID=" + grid.GetMasterRowKeyValue().ToString()); } } }

MasterDetailPage.aspx不包含任何网格,但所有这些都是通过编程方式完成的。

最终结果应该像这样。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485