注:在从表的aspxgridview中的(OnDataBinding()事件中绑定数据)-----代码如下
//绑定属性值表
protected void grid2_sonTable_DataBinding(object sender, EventArgs e)
{
ASPxGridView songrid = (ASPxGridView)sender; //实例化从表表
object _faterid = songrid.GetMasterRowKeyValue(); //获取主表行id(模板grid中的id值)
DataTable dt = new DataTable();
dt = goodsmanagebll.Get_GetAttributeValueListByAttrId(int.Parse(_faterid.ToString())).Tables[0];
songrid.DataSource = dt;
}
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