65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 devexpress gridview 在运行时创建详细网格模板

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2016年8月11日

CPOL

3分钟阅读

viewsIcon

22875

downloadIcon

531

一个简单的示例,展示了如何使用 ASPxGridView 在运行时创建详细网格模板。

编者按

本文出现在第三方产品和工具部分。本部分中的文章仅供会员使用,不得以任何方式推广或宣传产品。请举报任何垃圾邮件或广告。

引言

作为一名 Web 开发人员,我可能会在许多 Web 应用程序中使用 DevExpress 控件。在本文中,我将向您展示一个 aspxgridview(一种在数据驱动应用程序中常用的控件)的示例,以及如何在运行时动态绑定它。我将使用 ASP.NET 控件套件,更具体地说,是 Web Forms。

创建项目

我将创建一个空的 Visual Studio ASP.NET Web 应用程序。我还创建了一个简单的数据库,其中包含一个主表 (Categories) 和另一个明细表 (Products),并且 (Products) 表中的一条记录引用 (Categories) 表中的一条记录,如下图所示。

我使用 SQL Server 2012 创建了数据库,该应用程序是为 .net framework 4.5 编写的,示例是用 C# 编写的,我使用的 devexpress 版本是 Version=15.2.4.0。

使用代码

我创建了一个简单的 DataHelper 类来从数据库检索数据,我将不关注从数据库获取数据的实践,而是关注创建数据并将其绑定到明细模板网格的方式。

创建 DataHelper 类

DataHelper 类包含两个方法,第一个方法 (GetConnection) 用于获取本地服务器上数据库 MasterDetailDB 的数据库连接。

第二个方法 (getDataTable) 用于获取一个 datatable,它接受一个查询作为字符串参数,以便针对数据库执行。

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)
        {
            //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";


           }
      }

}

如您所见,上面的代码创建了主网格和明细网格,并为明细网格注册了 BeforePerformDataSelect 处理程序,以允许在运行时将明细网格与数据源绑定。

创建 DetailGridTemplate

在下一个代码段中,创建一个 DetialGridTemplate 实例,并一步将其分配给 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); // adding the master grid to page form's controls

现在,为了根据主记录绑定明细网格,我们创建处理 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 不包含任何网格,但所有这些都是以编程方式完成的。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MasterDetailPage.aspx.cs" Inherits="MasterDetailTemplateRuntim.MasterDetailPage" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
   </form>
</body>
</html>

 

最终结果应该是这样的。

 

源代码

您可以在这里找到包含数据库脚本的源代码,请先阅读 readme 文件。

 

© . All rights reserved.