0

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

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

有人可以解释一下如何在单击按钮时获取子 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>
4

1 回答 1

1

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

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

现在,在 Button4_Click 中,您可以将发件人转换为Button

var button4 = (Button)sender;

将 button4 正确转换为 aButton后,您可以访问 CommandArgument 属性。

var id1 = button4.CommandArgument;

一旦你有了 id1,它就像遍历父GridViewGridView1 一样简单。看起来您的第二列也绑定了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()方法中,使用以下内容来处理您的 Button4Click事件:

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
}
于 2013-06-28T14:56:01.757 回答