DevExpress ASPXGridView 主从表 master detail 动态绑定数据

来源:互联网 发布:ubuntu新建文件 编辑:程序博客网 时间:2024/05/18 06:16

DevExpress 提供的ASPXGridView的matserdetail主从表的例子是SQLDataSource的,我需要动态绑定数据没法用,在网上找了一下,试验后实现如下

aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="WebForm2.aspx.cs" Inherits="Com.Jesus.Web.WebSite.WebForm2" %>

<%@ Register Assembly="DevExpress.Web.ASPxEditors.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
    Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dx" %>
<%@ Register Assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
    Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <dx:ASPxGridView ID="masterGridView" runat="server">
            <Templates>
                <DetailRow>
                    <dx:ASPxGridView ID="detailGridView" runat="server" AutoGenerateColumns="False" DataSourceID="CarDataSource"
                        OnBeforePerformDataSelect="detailGridView_BeforePerformDataSelect">
                        <Columns>
                            <dx:GridViewDataTextColumn FieldName="ID1" VisibleIndex="0">
                            </dx:GridViewDataTextColumn>
                            <dx:GridViewDataTextColumn FieldName="CarName" VisibleIndex="1">
                            </dx:GridViewDataTextColumn>
                        </Columns>
                        
                    </dx:ASPxGridView>
                </DetailRow>
            </Templates>
            <SettingsDetail AllowOnlyOneMasterRowExpanded="true"/>
            <SettingsDetail ShowDetailRow="true" />
        </dx:ASPxGridView>
    </div>
    <asp:ObjectDataSource ID="CarDataSource" runat="server" SelectMethod="GetMyCar" TypeName="Com.Jesus.Web.WebSite.WebForm2">
        <SelectParameters>
            <asp:SessionParameter Name="id" SessionField="ID123" Type="Int32" />
        </SelectParameters>
    </asp:ObjectDataSource>
    </form>
</body>
</html>

cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DevExpress.Web.ASPxGridView;
using System.Data;
namespace Com.Jesus.Web.WebSite
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            masterGridView.DataSource = GetDriver();
            masterGridView.KeyFieldName = "ID234";
            masterGridView.DataBind();
        }
        //后台查询接口,返回主表数据
        public DataTable GetDriver()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID234");
            dt.Columns.Add("CarName");
            for (int i = 0; i < 10; i++)
            {
                DataRow dr = dt.NewRow();
                dr["ID234"] = i * 10 ;
                dr["CarName"] = Convert.ToString(i * 10 );
                dt.Rows.Add(dr);
            }
            return dt;
        }

        protected void detailGridView_BeforePerformDataSelect(object sender, EventArgs e)
        {
            //降主表的主键写入Session,以便于ObjectDataSource在SELECT时调用
            Session["ID123"] = (sender as ASPxGridView).GetMasterRowKeyValue();
        }
        public  DataTable GetMyCar(int id)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID1");
            dt.Columns.Add("CarName");
            for (int i = 0; i < 10; i++)
            {
                DataRow dr = dt.NewRow();
                dr["ID1"] = i * 10 + id;
                dr["CarName"] = Convert.ToString(i * 10 + id);
                dt.Rows.Add(dr);
            }
            return dt;
        }
    }
    
    
}

这里面有几个对应关系:

   <asp:ObjectDataSource ID="CarDataSource" runat="server" SelectMethod="GetMyCar" TypeName="Com.Jesus.Web.WebSite.WebForm2">
        <SelectParameters>
            <asp:SessionParameter Name="id" SessionField="ID123" Type="Int32" />
        </SelectParameters>
    </asp:ObjectDataSource>

1、SelectMethod="GetMyCar" 与cs中的同名函数名称一致,至于这个方法是否是静态的倒是无所谓。

2、GetMyCar函数的参数名和类型应与 Name="id" Type="Int32" 一致,至于是否与SQL语句中的字段名相同也无所谓。

3、 Session["ID123"] = (sender as ASPxGridView).GetMasterRowKeyValue();     Session名称与SessionField="ID123" 一致

4、原理:将主表的Key值存在session里,然后通过id传递给SelectMethod,将SelectMethod函数的返回值作为数据源付给从表。

还有另外一种做法就是在主表的HTMLRowPrepared事件中逐一绑定每个从表,这样会一次访问多次数据库,除非结合分页才能减少访问量,空间和时间占用率较高。

从主表传递多个参数给SelectMethod从原理上应该不行,但可以根据主表主键select出多个值。