如何解决指数超出范围必须是非负的并且小于集合的大小参数名称:VB.Net中的索引
我有一个 GridView,它已经填充了一个选择按钮来查看所选项目。
但是一旦调用该方法,我就会收到以下消息,我似乎可以弄清楚
System.ArgumentOutOfRangeException: '索引超出范围。必须是非负数且小于集合的大小。'
假设在索引 0 中选择 Dim cusName As String = Report.SelectedRow.Cells(0).Text
这是我的表的样本
<div class="row">
<div class="col-lg-12 col-md-12 col-xs-12">
<cc1:TabContainer ID="TabContainer1" CssClass="Tab" runat="server" ActiveTabIndex="0" Width="100%">
<cc1:TabPanel ID="tsaTabPanel" runat="server" HeaderText="Report" EnableViewState="False">
<ContentTemplate>
<div>
<asp:GridView CssClass="table table-bordered table-striped" ID="RCReport" runat="server" AutoGenerateColumns="False" AllowPaging="True" OnPageIndexChanging="OnPageIndexChanging" PageSize="100" OnSelectedIndexChanged="OnSelectedIndexChanged">
<Columns>
<asp:BoundField DataField="id" HeaderText="Id" SortExpression="id"></asp:BoundField>
<asp:BoundField DataField="customerName" HeaderText="Customer Name" SortExpression="customerName" ></asp:BoundField>
<asp:BoundField DataField="customerEmail" HeaderText="Email" SortExpression="customerEmail"></asp:BoundField>
<asp:BoundField DataField="fee" HeaderText="Fee" SortExpression="fee"></asp:BoundField>
<asp:ButtonField Text="Select" CommandName="Select" ItemStyle-Width="150" />
</Columns>
</asp:GridView>
</div>
</ContentTemplate>
</cc1:TabPanel>
</cc1:TabContainer>
</div>
</div>
背后的代码
Protected Sub OnSelectedIndexChanged(sender As Object,e As EventArgs)
Dim cusName As String = RCReport.SelectedRow.Cells(0).Text
Dim id As String = RCReport.SelectedRow.Cells(1).Text
ClientScript.RegisterStartupScript(Me.GetType(),"alert","alert('Id: " & id & "\nCustomer Name: " & cusName + "');",True)
End Sub
解决方法
为您编写了一个快速测试,以展示您应该能够实现所需的两种不同方式。
前端
<form id="form1" runat="server">
<asp:GridView ID="gvTest" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" />
<asp:BoundField DataField="City" HeaderText="City" />
<asp:CommandField ShowSelectButton="true" SelectText="Select Me" SelectImageUrl="~/images/green.png" />
</Columns>
</asp:GridView>
</form>
代码隐藏
Imports System.Collections.Generic
Partial Class _testVBNet
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object,ByVal e As EventArgs) Handles Me.Load
' only setting the value once on initial load.
If Not Page.IsPostBack Then
Dim myData As New List(Of SimpleObject)
Dim obj As SimpleObject = New SimpleObject() With {.Name = "Bob",.City = "New York"}
myData.Add(obj)
Dim obj2 As SimpleObject = New SimpleObject() With {.Name = "Aaron",.City = "Denver"}
myData.Add(obj2)
Dim obj3 As SimpleObject = New SimpleObject() With {.Name = "Shawn",.City = "Seattle"}
myData.Add(obj3)
Me.gvTest.DataSource = myData
Me.gvTest.DataBind()
End If
End Sub
Protected Sub gvTest_SelectedIndexChanging(ByVal sender As Object,ByVal e As GridViewSelectEventArgs) Handles gvTest.SelectedIndexChanging
Dim row As GridViewRow = Me.gvTest.Rows(e.NewSelectedIndex)
Dim output As String = String.Format("{0} - {1}",row.Cells(0).Text,row.Cells(1).Text) ' no .Net error
End Sub
Protected Sub gvTest_SelectedIndexChanged(ByVal sender As Object,ByVal e As EventArgs) Handles gvTest.SelectedIndexChanged
Dim row As GridViewRow = Me.gvTest.SelectedRow
Dim output As String = String.Format("{0} - {1}",row.Cells(1).Text) ' no .Net error
End Sub
Protected Class SimpleObject
Sub New()
End Sub
Public Property Name As String
Public Property City As String
End Class
End Class
一些想法:
- EnableViewState = false 可能是一个问题,但不应该
- 通过按钮或其他事件动态绑定的数据可能需要重新绑定,但它应该在页面的生命周期中仍然存在。
您没有正确创建索引更改事件。
你有这个:
Protected Sub OnSelectedIndexChanged(sender As Object,e As EventArgs)
如果您的网络表单上有 2 个网格 - 以上属于哪个网格????
这样做: 在表单视图设计器中 - 单击网格 - 显示属性表。然后点击闪电(事件),然后双击事件
所以就像 VB6,甚至 MS-Access 一样?您必须单击正确的事件存根。然后你会得到这个:
Protected Sub GridView1_SelectedIndexChanged(sender As Object,e As EventArgs) Handles GridView1.SelectedIndexChanged
End Sub
现在 SelectIndexChanged 事件是如何使用实际控件进行前缀的。我的意思是,您可以在 Web 表单上有多个网格 - 您的代码将引用哪一个?
现在,在您的情况下,假设网格视图是“gvTest”,那么如上所述双击索引更改事件应该会给您:
Protected Sub gvTest_SelectedIndexChanged(sender As Object,e As EventArgs) Handles GridView1.SelectedIndexChanged
End Sub
所以,现在在上面的事件中尝试您的代码 - 您的 cell() 集合是空的,因为代码存根是错误的,并且索引更改事件没有正确触发。
因此,在您双击之后 - 如果您返回到属性表,您会看到事件名称如下:
因此,无论哪种方式 - 您拥有的事件存根是错误的,因此不会发生索引更改事件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。