Don't think you are, know you are

博客园 首页 新随笔 管理

如何显示主细表,使用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事件中我们还可以做很多事情。希望能给大家一些启发。就说到这里吧。

posted on 2006-06-09 09:39  炭炭  阅读(1841)  评论(0编辑  收藏  举报