您的位置:首页 > 编程语言 > ASP

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

2011-10-14 15:46 375 查看
2011-09-09 10:32
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出多个值。

http://www.jinghuazhi.com

浓缩精华 而成志

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: