簡體   English   中英

獲取datakey嵌套的gridview

[英]Get datakey multinested gridview

我有3個嵌套的gridview,下面是html代碼,第二個gridview中rowdataboun后面的代碼。 在此代碼中,第二個gridview的rowdatabound我想獲取第二個gridview的數據鍵並獲取第一個gridview的數據鍵,該信息對於填充第三個嵌套的gridview是必需的。

<div>
    <table style="width:100%;height:100%;">
        <tr>
            <td>
                <asp:GridView ID="grdOuterGridView" runat="server" AllowPaging="True"
            AutoGenerateColumns="False" DataKeyNames="nitter"
            onrowdatabound="grdOuterGridView_RowDataBound" CellPadding="4"
            ForeColor="#333333" GridLines="None">
            <AlternatingRowStyle BackColor="White" />
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <a href="javascript:switchViews('div<%# Eval("nitter") %>');">
                            <img id='imgdiv<%# Eval("nitter") %>' title="Click to show/hide orders" border="0" src="images/plus.png" width="15px" />
                        </a>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField HeaderText="trazonsocial" DataField="trazonsocial" />
                <asp:BoundField HeaderText="nitter" DataField="nitter"/>
                <asp:TemplateField>
                    <ItemTemplate>
                        </td></tr>
                        <tr>
                          <td colspan="100%">
                            <div id='div<%# Eval("nitter") %>' style="display:none;position:relative;left:25px;" >
                               <asp:GridView ID="grdInnerGridView" runat="server" Width="80%"
                               AutoGenerateColumns="false" DataKeyNames="id1"
                               onrowdatabound="grdInnerGridView_RowDataBound" CellPadding="4"
                               EmptyDataText="No register 2 ..." >
                                  <Columns>
                                     <asp:TemplateField>
                                        <ItemTemplate>
                                           <a href="javascript:switchViews('div<%# Eval("id1") %>');">
                                              <img id='imgdiv<%# Eval("id1") %>' title="Click to show/hide orders" border="0" src="images/plus.png" width="15px" />
                                           </a>
                                        </ItemTemplate>
                                     </asp:TemplateField>
                                     <asp:BoundField HeaderText="tipo1" DataField="tipo1" />
                                     <asp:BoundField HeaderText="tipo" DataField="tipo" />
                                     <asp:BoundField HeaderText="numero" DataField="numero" />
                                     <asp:TemplateField>
                                        <ItemTemplate>
                                           </td></tr>
                                             <tr>
                                               <td colspan="100%">
                                                 <div id='div<%# Eval("id1") %>' style="display:none;position:relative;left:25px;" >
                                                   <asp:GridView ID="grdInnerGridView2" runat="server" Width="80%"
                                                   AutoGenerateColumns="false" DataKeyNames="id1diariop"
                                                   EmptyDataText="No register 3..." >
                                                     <Columns>
                                                       <asp:BoundField HeaderText="tipo1" DataField="tipo1" />
                                                       <asp:BoundField HeaderText="tipo" DataField="tipo" />
                                                       <asp:BoundField HeaderText="Numero" DataField="numero" />
                                                       <asp:BoundField HeaderText="Cuenta" DataField="dcodigo" />
                                                       <asp:BoundField HeaderText="Debito" DataField="dvalordeb" />
                                                       <asp:BoundField HeaderText="Credito" DataField="dvalorcre" />
                                                     </Columns>
                                                   </asp:GridView>
                                                 </div>
                                              </td>
                                            </tr>
                                         </ItemTemplate>
                                     </asp:TemplateField>
                                  </Columns>
                               </asp:GridView>
                            </div>
                          </td>
                        </tr>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
            <EditRowStyle BackColor="#2461BF" />
            <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
            <RowStyle BackColor="#EFF3FB" />
            <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
            <SortedAscendingCellStyle BackColor="#F5F7FB" />
            <SortedAscendingHeaderStyle BackColor="#6D95E1" />
            <SortedDescendingCellStyle BackColor="#E9EBEF" />
            <SortedDescendingHeaderStyle BackColor="#4870BE" />
        </asp:GridView>
            </td>
        </tr>
    </table>
</div>
protected void grdInnerGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{

    if (e.Row.RowType == DataControlRowType.DataRow)
    {

        // this NOT WORKS  ????????? I need get datakey first gridview
        string cID = (string)grdOuterGridView.DataKeys[e.Row.RowIndex].Values["nitter"];

        //this NOT WORK   ?????????? I need get datakey second gridview (this)
        int iID = (int)grdInnerGridView.DataKeys[e.Row.RowIndex].Values["id1"];


        //I need "cID" and "iID" data for fill last gridview 
        GridView innerGridView2 = (GridView)e.Row.FindControl("grdInnerGridView2");
        FillInnerGrid2(cID, iID, innerGridView2);


    }
}

在RowDataBound中獲取子gridview的datakey的方法是:

protected void grdInnerGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{

    //Accessing GridView from Sender object
    GridView childGrid = (GridView)sender;

    if (e.Row.RowType == DataControlRowType.DataRow)
    {

        //Retreiving the GridView DataKey Value
        string cID = childGrid.DataKeys[e.Row.RowIndex].Value.ToString();


    }
}

將數據綁定到gridview時將觸發RowDataBound事件。 DataKeys屬性尚未填充。 如果要檢索當前綁定行上的數據,則可以使用GridViewRowEventArgsDataItem屬性。

要訪問父行的DataItem ,您將必須進入控件樹。 我們可以使用NamingContainer屬性更快地上升。

這種代碼應該可以工作:

protected void grdInnerGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        Control outerRow = e.Row.Parent.NamingContainer;
        while(!(outerRow is IDataItemContainer))
        {
            outerRow = outerRow.NamingContainer; 
        }
        string cID = ((OuterDataType)((IDataItemContainer)outerRow)).nitter;
        int iID = ((InnerDataType)e.DataItem).Id;


        GridView innerGridView2 = (GridView)e.Row.FindControl("grdInnerGridView2");
        FillInnerGrid2(cID, iID, innerGridView2);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM