GridView更新时提示索引超出范围。必须为非负值并小于集合大小。
//更新protectedvoidGridView1_RowUpdating(objectsender,GridViewUpdateEventArgse){stringd...
//更新
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
string dId = ((Label)(this.GridView1.Rows[e.RowIndex].Cells[0].Controls[1])).Text.ToString();//id 这行报错
string dName = ((TextBox)(this.GridView1.Rows[e.RowIndex].Cells[1].Controls[1])).Text.ToString();//名称
Disease d = new Disease();
d.DId = int.Parse(dId);
d.DName = dName;
DiseaseManager.UpdateDisease(d);
Page.Server.Transfer("Disease_List.aspx");
}
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
OnRowCommand="GridView1_RowCommand" onrowdatabound="GridView1_RowDataBound"
PageSize="15" Width="100%" onrowcancelingedit="GridView1_RowCancelingEdit"
onrowediting="GridView1_RowEditing" onrowupdating="GridView1_RowUpdating"
DataKeyNames="dId">
<Columns>
<asp:TemplateField HeaderText="编号" SortExpression="dId">
<EditItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("dId") %>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("dId") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="科目名" SortExpression="dName">
<EditItemTemplate>
<asp:TextBox ID="txtdName" runat="server" Text='<%# Bind("dName") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lbldName" runat="server" Text='<%# Bind("dName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowEditButton="True" HeaderText="编辑">
<ItemStyle HorizontalAlign="Center" Width="80px" />
</asp:CommandField>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="lnkbtnDelete" runat="server"
CommandArgument='<%# Eval("dId") %>' CommandName="De"
OnClientClick="return confirm('是否删除?')">删除</asp:LinkButton>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" Width="50px" />
</asp:TemplateField>
</Columns>
</asp:GridView>
断点测试过,发现DataKeyNames是有值的。但DataKeys为0。什么设置DataKeyNames和设置主键什么的都没用。还是那句出错。e也是有正确值的。 展开
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
string dId = ((Label)(this.GridView1.Rows[e.RowIndex].Cells[0].Controls[1])).Text.ToString();//id 这行报错
string dName = ((TextBox)(this.GridView1.Rows[e.RowIndex].Cells[1].Controls[1])).Text.ToString();//名称
Disease d = new Disease();
d.DId = int.Parse(dId);
d.DName = dName;
DiseaseManager.UpdateDisease(d);
Page.Server.Transfer("Disease_List.aspx");
}
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
OnRowCommand="GridView1_RowCommand" onrowdatabound="GridView1_RowDataBound"
PageSize="15" Width="100%" onrowcancelingedit="GridView1_RowCancelingEdit"
onrowediting="GridView1_RowEditing" onrowupdating="GridView1_RowUpdating"
DataKeyNames="dId">
<Columns>
<asp:TemplateField HeaderText="编号" SortExpression="dId">
<EditItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("dId") %>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("dId") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="科目名" SortExpression="dName">
<EditItemTemplate>
<asp:TextBox ID="txtdName" runat="server" Text='<%# Bind("dName") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lbldName" runat="server" Text='<%# Bind("dName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowEditButton="True" HeaderText="编辑">
<ItemStyle HorizontalAlign="Center" Width="80px" />
</asp:CommandField>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="lnkbtnDelete" runat="server"
CommandArgument='<%# Eval("dId") %>' CommandName="De"
OnClientClick="return confirm('是否删除?')">删除</asp:LinkButton>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" Width="50px" />
</asp:TemplateField>
</Columns>
</asp:GridView>
断点测试过,发现DataKeyNames是有值的。但DataKeys为0。什么设置DataKeyNames和设置主键什么的都没用。还是那句出错。e也是有正确值的。 展开
3个回答
展开全部
textbox text=this.GridView1.ItemIndex.fincontrol("文本框的id") as textbox;
要这样找控件,你那要找的话,有时肯定找不到控件的,会报超出索引范围的错误。
要这样找控件,你那要找的话,有时肯定找不到控件的,会报超出索引范围的错误。
追问
这个方法我也试过。还是报同样的错误
追答
//当按钮的CommandName为Update时将触发该事件
TextBox txtUserName = gdvUsers.Rows[e.RowIndex].Cells[1].FindControl("txtUserName") as TextBox;
TextBox txtNickName = gdvUsers.Rows[gdvUsers.EditIndex].Cells[2].FindControl("txtNickName") as TextBox;
TextBox txtEmail = gdvUsers.Rows[e.RowIndex].Cells[3].FindControl("txtEmail") as TextBox;
DropDownList dropQuestion = gdvUsers.Rows[e.RowIndex].Cells[4].FindControl("dropQuestion") as DropDownList;
TextBox txtAnswer = gdvUsers.Rows[e.RowIndex].Cells[5].FindControl("txtAnswer") as TextBox;
这是我之前写的,绝对没错的,你可以参考下。看你的语法好像也没有错,那你就是前台的控件id注意下别写错了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
string dId = ((Label)(this.GridView1.Rows[e.RowIndex].Cells[0].Controls[0])).Text.ToString();
Controls[0]是第一个控件
Controls[0]是第一个控件
更多追问追答
追问
追答
string dId = GridView1.DataKeys[e.RowIndex].Value.ToString();
DataKeyNames要设置才能取到
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
e.rowindex里没东西。用debug走自己就明白乐。
更多追问追答
追问
e.rowindex 里取到值了。取到要编辑的行的索引
追答
你是不是隐藏了第一列?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询