在按钮单击时获取嵌套Gridview的已检查行

时间:2013-06-28 14:32:22

标签: asp.net gridview nested

我已经嵌套了一个Gridview2(子),我想在点击按钮时获取选中的行。

当我尝试从按钮点击事件访问Gridview2时,我无法做到这一点。但是,我可以访问父Gridview1。

有人可以解释一下如何在点击按钮时获取Child Gridview的选中行。

此外,Button是子Gridview的列标题。

这是我的代码。

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
    BackColor="White" BorderColor="#E7E7FF" BorderStyle="None" BorderWidth="1px" 
    CellPadding="3" GridLines="Horizontal" 
    onrowdatabound="GridView1_RowDataBound" DataKeyNames="id1">
    <AlternatingRowStyle BackColor="#F7F7F7" />
    <Columns>

        <asp:TemplateField>
         <ItemTemplate>
                    <a href="javascript:collapseExpand('id1_<%# Eval("id1") %>');">
                        <img id="imageSubId_<%# Eval("id1") %>" alt="Click to show/hide orders" border="0"
                            src="Images/bullet_toggle_plus.jpg" /></a>
                </ItemTemplate>
            </asp:TemplateField>
        <asp:BoundField DataField="id1" HeaderText="ID" />
        <asp:TemplateField>
            <ItemTemplate>
            <tr>
            <td colspan="100%">
               <div id="rid1_<%# Eval("id1") %>" style="display: none; position: relative; left: 25px;">
                <asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="false" CellPadding="4" ForeColor="#333333" 
                    GridLines="None" OnRowCommand="Gridview2_RowCommand">
                    <Columns>

                    <asp:BoundField DataField="fname" HeaderText="First Name" />
                    <asp:BoundField DataField="mname" HeaderText="Middle Name" />
                    <asp:BoundField DataField="lname" HeaderText="Last Name" />
                    <asp:TemplateField>
                    <ItemTemplate>

                    <asp:CheckBox ID="checkselect" runat="server" />

                    </ItemTemplate>
                    <HeaderTemplate>
                        <asp:Button ID="Button4" runat="server" Text="Remove" CommandName="Split" OnClick="Button4_Click" />
                         <ajaxToolkit:ModalPopupExtender ID="ModalPopupExtender1" runat="server" TargetControlID="Button4" PopupControlID="Panel1" CancelControlID="Button1">
                        </ajaxToolkit:ModalPopupExtender>

                        </HeaderTemplate>

                    </asp:TemplateField> </Columns></asp:GridView>
                </div>
                </td>
                </tr>
            </ItemTemplate>
        </asp:TemplateField>
        </Columns>
       </asp:GridView>

1 个答案:

答案 0 :(得分:1)

我要做的是添加一个CommandArgumentButton4的声明,这将允许我找到相关的GridView2。

所以,我会使用你在其他地方使用的内容id1。将CommandArgument='<%# Eval("id1") %>'添加到您的Button4声明中。

现在,在Button4_Click中,您可以将发件人转换为Button,如下所示:

var button4 = (Button)sender;

将button4正确投放到Button后,您可以访问CommandArgument属性。

var id1 = button4.CommandArgument;

一旦你有了id1,它就像迭代父GridView,GridView1一样简单。看起来您的第二列也绑定到id1,因此您需要执行以下操作:

GridView foundGridView2;
foreach(GridViewRow gvr in GridView1.Rows)
{
    if(gvr.RowType == DataControlRowType.DataRow && gvr.Cells[1].Text == id1)
    {
        foundGridView2 = gvr.FindControl("GridView2");
        break; // Once we've found it, no need to iterate through other items
    }
}

此时,您现在可以访问找到的GridView2,并且可以遍历GridView2的行并选中复选框。如果您需要帮助,请告诉我。

添加答案,因为我认为父GridView1可能会吞下Button4的点击:

为GridView1的OnRowCommand事件创建一个事件处理程序。

在生成的GridView1_RowCommand()方法中,使用以下方法处理您的Button4 Click事件:

if(e.CommandName == "Split")
{
    // At this point I would refactor out the code you put in Button4_Click 
    // into a separate method.  I'll give you an example:
    HandleButton4Click(e.CommandArgument); // e.CommandArgument will contain the id1
}