您的位置:首页 > 其它

如何显示主细表,使用GridView DataGrid和 DataList

2006-06-09 09:39 429 查看

如何显示主细表,使用GridView DataGrid和 DataList

一般的数据绑定就不多说了,但如果要显示主细表时就需要我们运用一些技巧。其中的关键是,如何动态制定细表的DataSource。我现在知道有2种方法,和大家交流一下,一种是用
DataSource='<%# ((System.Data.DataRowView)Container.DataItem).CreateChildView("tableRelation")
一种是用 Session 控制。说到这里高手都知道怎么会事,我还是为和我一样的菜鸟多说两句。

先说一下GirdView和DataGrid,GridView好像是ASP.net 2.0里面的新东西,可以看作是以前DataGrid的增强版,编辑起来更加方便。它们都可以嵌套在自身的模版或DataList的模版中,我就使用嵌套来显示细表。

下面说第一种 DataSource='<%# ((System.Data.DataRowView)Container.DataItem).CreateChildView("tableRelation")

第一种要求我们在数据源中创建出主细表的约束关系("tableRelation"),然后用上式指定细表的DataSource。
废话不说,看例子:

protected void Page_Load(object sender, EventArgs e)
{
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=|DataDirectory|/MyDemo.mdb");
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM 表1", conn);
DataSet ds = new DataSet();
da.Fill(ds, "t1");
da.SelectCommand.CommandText = "SELECT * FROM 表2";
da.Fill(ds, "t2");
DataColumn Parent = ds.Tables["t1"].Columns["凭单号"]; //外键
DataColumn Child = ds.Tables["t2"].Columns["凭单号"];
DataRelation tableRelation = new DataRelation("tableRelation", Parent, Child, false);
ds.Relations.Add(tableRelation);
this.dgMaster.DataSource = ds.Tables["t1"].DefaultView; //dgMaster 是GridView
this.dgMaster.DataBind();
}

指定DataSource:
<asp:GridView id="dgMaster" runat="server" AutoGenerateColumns="False" ShowHeader="False" Width="60%" >
<Columns>
<asp:TemplateField >
<ItemTemplate>
<B>凭单号:<%# DataBinder.Eval(Container.DataItem, "凭单号") %>
制单人:<%# DataBinder.Eval(Container.DataItem, "制单人")%>
</B>
<asp:GridView id="dgDetail" runat="server" AutoGenerateColumns="False" DataSource='<%# ((System.Data.DataRowView)Container.DataItem).CreateChildView("tableRelation") %>' DataKeyField="凭单号" Width ="100%">
<Columns>
<asp:BoundField DataField="摘要" HeaderText="摘要" ></asp:BoundField>
<asp:BoundField DataField="科目" HeaderText="科目"></asp:BoundField>
<asp:BoundField DataField="贷方金额" HeaderText="贷方金额" ></asp:BoundField>
<asp:BoundField DataField="凭单号" HeaderText="借方金额"></asp:BoundField>
</Columns>
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

DataSet中的数据表刚填充之后是没有数据库中的各种约束的,需要自己在里面添加“外键约束”,这样主表的DataItem在绑定的时候才能根据创建的Relation创建细表的Source。方法就是CreateChildView。还要注意DataKeyField="凭单号" 和保证显示效果的AutoGenerateColumns="False"。
如果使用DataGrid,记得把上面Field的地方换成Column,小问题就不多说了。

下面说第2种,大家应该知道绑定控件在每次绑定数据的时候都会触发DataBound事件,DataList是ItemDataBound。GridView是RowDataBound。
所以我们在PageLoad里可以创建一个Session["Key"]=第一个数据的主键值,以后每次DataBound事件都让Session["Key"]递加,再把细表的DataSource中的参数指定为Session["Key"]就可以了。这样主表在显示的时候,每次绑定细表都会跟着Session的递加而改变。
如:
<asp:AccessDataSource ID="AccessDataSource1" runat="server" DataFile="~/App_Data/MyPrintDemo.mdb"
SelectCommand="SELECT [凭单号], [摘要], [科目], [借方金额], [贷方金额] FROM [表2] WHERE ([凭单号] = ?)">
<SelectParameters>
<asp:SessionParameter Name="凭单号" SessionField="Pingdanhao" Type="Int32" />
</SelectParameters>
</asp:AccessDataSource>

绑定事件中Session++:

protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
{
Session["Pingdanhao"] = (int)(Session["Pingdanhao"]) + 1;
}

比较而言,第一种更严谨直接,第2种也是一种解决思路。其实在DataBound事件中我们还可以做很多事情。希望能给大家一些启发。就说到这里吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐