我在RowDataBound中以编程方式添加了按钮:
else if (e.Row.RowType == DataControlRowType.Footer)
{
e.Row.Cells[1].Text = "Total: ";
e.Row.Cells[2].Text = totalStaff.ToString();
Button showStaff = new Button();
showStaff.CommandName = "ShowAll";
showStaff.Text = e.Row.Cells[2].Text.ToString();
e.Row.Cells[2].Controls.Add(showStaff);
e.Row.Cells[1].HorizontalAlign = HorizontalAlign.Right;
showStaff.Click += new EventHandler(showStaff_Click);
}
现在我想处理showStaff_Click以将数据绑定到嵌套的gridview。我在RowCommand中编写了bwlow代码,但索引为null:
if(e.CommandName == "ShowAll")
{
int index = Convert.ToInt32(e.CommandArgument.ToString());
GridViewRow row = Staff.Rows[index];
GridView StaffInfo = (GridView)Staff.Rows[index].FindControl("StaffInfo");
int TeamID = 0;
int cityID = 3699;
StaffInfo.DataSource = GetStaff(cityID, TeamID);
StaffInfo.DataBind();
}
我将非常感谢您的帮助。
编辑:
我已经做了一些改变:
protected void Staff_RowCommand(object sender, GridViewCommandEventArgs e)
{
try
{
//Checking for command name which command/button is pressed
if (e.CommandName == "ShowDetails")
{
GridView Staff = (GridView)sender;
int index = Convert.ToInt32(e.CommandArgument);
GridViewRow row = Staff.Rows[index];
GridView StaffInfo = (GridView)Staff.Rows[index].FindControl("StaffInfo");
int TeamID = Convert.ToInt16(Staff.DataKeys[index].Values[0].ToString());
int cityID = Convert.ToInt16(Staff.DataKeys[index].Values[1].ToString());
StaffInfo.DataSource = GetStaff(cityID, TeamID);
StaffInfo.DataBind();
StaffInfo.Visible = true;
}
else if(e.CommandName == "ShowAll")
{
int index = Convert.ToInt32(e.CommandArgument);
GridView StaffInfo = (GridView)Staff.Rows[index].FindControl("StaffInfo");
int TeamID = 0;
int cityID = 3699;
StaffInfo.DataSource = GetStaff(cityID, TeamID);
StaffInfo.DataBind();
StaffInfo.Visible = true;
}
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
<asp:GridView ID="Staff" runat="server" AutoGenerateColumns="false"
OnRowCommand="Staff_RowCommand"
DataKeyNames="TeamID,CityID" ShowFooter="True" HorizontalAlign="Center">
<Columns>
<asp:TemplateField HeaderText=" Function">
<ItemTemplate>
<asp:Label Width="150px" ID="Function" ItemStyle-HorizontalAlign="Center" runat="server" Text='<%# Bind("Function") %>'></asp:Label>
<asp:GridView ID="StaffInfo" AutoGenerateColumns="false" runat="server">
<Columns>
<asp:BoundField ItemStyle-Width="150px" DataField="FirstName" HeaderText="First Name" />
<asp:BoundField ItemStyle-Width="150px" DataField="LastName" HeaderText="Last Name" />
<asp:BoundField ItemStyle-Width="150px" DataField="SOEID" HeaderText="SOEID" />
</Columns>
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText=" Team">
<ItemTemplate>
<asp:Label Width="150px" ID="Team" ItemStyle-HorizontalAlign="Center" runat="server" Text='<%# Bind("Team") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Staff Count">
<ItemTemplate>
<asp:Button Width="40px" ID="StaffCount" ItemStyle-HorizontalAlign="Center" runat="server" Text='<%# Bind("StaffCount") %>' CommandName="ShowDetails" CommandArgument="<%# ((GridViewRow)Container).RowIndex %>" CausesValidation="True" UseSubmitBehavior="False" />
</ItemTemplate>
<FooterTemplate>
<asp:Button id="TotalStaff" runat="server" Text="Button1" CommandName="ShowAll" CommandArgument="<%# ((GridViewRow) Container).RowIndex %>" CausesValidation="True" UseSubmitBehavior="False" />
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField Visible ="false">
<ItemTemplate>
<asp:Label runat="server" Width="150px" DataField="TeamID" HeaderText="TeamID" ></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField Visible ="false">
<ItemTemplate>
<asp:Label runat="server" ItemStyle-Width="150px" DataField="CityID" HeaderText="CityID"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
当我尝试单击ShowAll按钮时,ite返回索引超出范围。我创建了Response.Write(intex.ToString())并返回-1。正确返回case或row中的索引号。问题在于页脚按钮。请你帮助我好吗?
答案 0 :(得分:1)
您在创建按钮时没有设置CommandArgument
。
Button showStaff = new Button();
showStaff.CommandName = "ShowAll";
showStaff.CommandArgument = e.Row.RowIndex.ToString();
showStaff.Text = e.Row.Cells[2].Text.ToString();