在尝试向gridview添加空行时,我得到一个超出范围异常的索引。 这是背后的代码。 有更多列,我只是删除它们来缩短代码。
Private Sub AddNewGridRow() Dim rowIndex As Integer = 0 If ViewState("CurrentData") IsNot Nothing Then Dim dtCurrentData As DataTable = DirectCast(ViewState("CurrentData"), DataTable) Dim drCurrentRow As DataRow = Nothing If dtCurrentData.Rows.Count > 0 Then For i As Integer = 1 To dtCurrentData.Rows.Count Dim lblVoucher As Label = DirectCast(GridView1.Rows(rowIndex).Cells(1).FindControl("lblVoucher"), Label) drCurrentRow = dtCurrentData.NewRow() drCurrentRow("RecID") = i + 1 dtCurrentData.Rows(i - 1)("RecID") = lblVoucher rowIndex += 1 Next dtCurrentData.Rows.Add(drCurrentRow) ViewState("CurrentData") = dtCurrentData GridView1.DataBind() End If Else Response.Write("ViewState is null") End If SetPreviousData() End Sub Private Sub SetPreviousData() Dim rowIndex As Integer = 0 If ViewState("CurrentData") IsNot Nothing Then Dim dt As DataTable = DirectCast(ViewState("CurrentData"), DataTable) If dt.Rows.Count > 0 Then For i As Integer = 0 To dt.Rows.Count - 1 'Out of range exception happens here when trying to fill the previous data. Dim lblVoucher As Label = DirectCast(GridView1.Rows(rowIndex).Cells(1).FindControl("lblVoucher"), Label) lblVoucher.Text = dt.Rows(i)("Voucher").ToString() rowIndex += 1 Next End If End If End Sub这是该专栏的aspx。
<asp:TemplateField HeaderText="Voucher" SortExpression="RecID"> <HeaderStyle HorizontalAlign="Center" Width="100px" /> <ItemStyle HorizontalAlign="Center" /> <ItemTemplate> <asp:Label ID="lblVoucher" runat="server" Text='<%#Eval("RecID") %>'></asp:Label> </ItemTemplate> </asp:TemplateField>I'm getting an index out of range exception while trying to add an empty row to a gridview. This is the code behind. There are more columns, I just removed them to shorten the code.
Private Sub AddNewGridRow() Dim rowIndex As Integer = 0 If ViewState("CurrentData") IsNot Nothing Then Dim dtCurrentData As DataTable = DirectCast(ViewState("CurrentData"), DataTable) Dim drCurrentRow As DataRow = Nothing If dtCurrentData.Rows.Count > 0 Then For i As Integer = 1 To dtCurrentData.Rows.Count Dim lblVoucher As Label = DirectCast(GridView1.Rows(rowIndex).Cells(1).FindControl("lblVoucher"), Label) drCurrentRow = dtCurrentData.NewRow() drCurrentRow("RecID") = i + 1 dtCurrentData.Rows(i - 1)("RecID") = lblVoucher rowIndex += 1 Next dtCurrentData.Rows.Add(drCurrentRow) ViewState("CurrentData") = dtCurrentData GridView1.DataBind() End If Else Response.Write("ViewState is null") End If SetPreviousData() End Sub Private Sub SetPreviousData() Dim rowIndex As Integer = 0 If ViewState("CurrentData") IsNot Nothing Then Dim dt As DataTable = DirectCast(ViewState("CurrentData"), DataTable) If dt.Rows.Count > 0 Then For i As Integer = 0 To dt.Rows.Count - 1 'Out of range exception happens here when trying to fill the previous data. Dim lblVoucher As Label = DirectCast(GridView1.Rows(rowIndex).Cells(1).FindControl("lblVoucher"), Label) lblVoucher.Text = dt.Rows(i)("Voucher").ToString() rowIndex += 1 Next End If End If End SubAnd this is the aspx for that column.
<asp:TemplateField HeaderText="Voucher" SortExpression="RecID"> <HeaderStyle HorizontalAlign="Center" Width="100px" /> <ItemStyle HorizontalAlign="Center" /> <ItemTemplate> <asp:Label ID="lblVoucher" runat="server" Text='<%#Eval("RecID") %>'></asp:Label> </ItemTemplate> </asp:TemplateField>最满意答案
您需要将代码放入调试中,并查看该语句的哪个部分导致异常。
您有两个可能的问题:
您没有足够的行来满足rowIndex要求。
您没有足够的单元来满足单元格(1)的要求。
我会尝试重写问题行,如下所示:
Dim lblVoucher As Label = Nothing If GridView1.Rows.Count < rowIndex Then Dim oRow As DataGridViewRow oRow = GridView1.Rows(rowIndex) If oRow.Cells.Count > 1 Then lblVoucher = TryCast(oRow.Cells(1).FindControl("lblVoucher"), Label) Else ' Do something here when you don't have cells End If Else ' Do something here when you don't have a row End If当您没有预期的内容时,可以在else子句中设置断点或抛出异常或适用于您的应用程序的任何内容。
You need to put the code into debug and see which portion of the statement is causing the exception.
You have two possible problems:
You do not have enough rows to meet the rowIndex requirement.
You do not have enough cells to meet the cells(1) requirement.
I would try rewriting the problem line as follows:
Dim lblVoucher As Label = Nothing If GridView1.Rows.Count < rowIndex Then Dim oRow As DataGridViewRow oRow = GridView1.Rows(rowIndex) If oRow.Cells.Count > 1 Then lblVoucher = TryCast(oRow.Cells(1).FindControl("lblVoucher"), Label) Else ' Do something here when you don't have cells End If Else ' Do something here when you don't have a row End IfYou can set breakpoints or throw exceptions or whatever is appropriate for your application in the else clauses when you don't have what you are expecting.
更多推荐
发布评论