首页 > 解决方案 > 指数超出范围。必须是非负数且小于集合的大小。参数名称:VB.Net中的索引

问题描述

我有一个 GridView,它已经填充了一个选择按钮来查看所选项目。

但是,一旦调用该方法,我就会收到以下消息,我似乎可以弄清楚

System.ArgumentOutOfRangeException: '索引超出范围。必须是非负数且小于集合的大小。

这假设Dim cusName As String = Report.SelectedRow.Cells(0).Text在索引 0中选择

这是我的桌子的样本

<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

标签: asp.netvb.netgridviewwebforms

解决方案


为您编写了一个快速测试,以展示您应该能够实现所需目标的两种不同方式。

前端

<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(0).Text, 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 可能是一个问题,但不应该是
  • 通过按钮或其他事件动态绑定的数据可能需要重新绑定,但它应该在页面的生命之旅中继续存在。

推荐阅读