作为一名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不包含任何网格,但所有这些都是通过编程方式完成的。
最终结果应该像这样。