我已经嵌套了一个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>
答案 0 :(得分:1)
我要做的是添加一个CommandArgument
到Button4
的声明,这将允许我找到相关的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
}