datagrid分页出现“指定的参数已超出有效值的范围。参数名: index ”错误?

dallascen 2004-12-10 08:45:42
我得部分代码如下:
Imports System.Data.OracleClient
Public Class hj_oa_swlb
Inherits System.Web.UI.Page
Protected cpt As New ClassConnection

#Region " Web 窗体设计器生成的代码 "

'该调用是 Web 窗体设计器所必需的。
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
'##################################绑定datagrid##############################
Dim dv As DataView
Dim dap_oa_swlb As New OracleDataAdapter("select * from hj_xt_swlb", cpt.conn)
Dim dst_oa_swlb As New DataSet
dap_oa_swlb.Fill(dst_oa_swlb, "hj_xt_swlb")
dg_oa_swlb.DataSource = dst_oa_swlb.Tables(0).DefaultView
dg_oa_swlb.DataBind()
dv = dst_oa_swlb.Tables(0).DefaultView

End If
End Sub

Private Sub dg_oa_swlb_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles dg_oa_swlb.ItemCommand
Panelmain.Visible = True
Dim tb As TableCell
tb_swdl.Visible = True
tb_swxl.Visible = True

tb = e.Item.Cells(1)
tb_ls.Text = Trim(tb.Text)

tb = e.Item.Cells(2)
tb_swdl.Text = tb.Text


tb = e.Item.Cells(3)
tb_swxl.Text = tb.Text

End Sub

Private Sub dg_oa_swlb_PageIndexChanged(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles dg_oa_swlb.PageIndexChanged
dg_oa_swlb.CurrentPageIndex = e.NewPageIndex
Dim dap_oa_swlb As New OracleDataAdapter("select * from hj_xt_swlb", cpt.conn)
Dim dst_oa_swlb As New DataSet
dap_oa_swlb.Fill(dst_oa_swlb, "hj_xt_swlb")
dg_oa_swlb.DataSource = dst_oa_swlb.Tables(0).DefaultView
dg_oa_swlb.DataBind()
End Sub
End Class

运行后DATAGRID第一页显示正常,但是当点击第二页的时候,出现错误,提示指定的参数已超出有效值的范围。参数名: index ”,我把datagrid的itemcommand事件注释后,分页能正常显现,请问这是什么原因呢?请各位帮忙指正。。
...全文
324 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
penning 2004-12-21
  • 打赏
  • 举报
回复
注意空格和回车也算一个CELL,datagrid本身算不准
dyh1234 2004-12-21
  • 打赏
  • 举报
回复
请问楼主问题解决了没有,强烈建议采用 flcandclf(怪手大分)和fisher12345(fisher)的方法:
“在相应的编辑列中设置CommandName="name",在itemcommand事件中判断一下。

if(e.CommandName == "name")
{

}
我刚才解决了同样的问题!
xuandme000 2004-12-10
  • 打赏
  • 举报
回复
同意思归大哥的,如果你数据库中的字段是不是只有3个,那么你应该是0-2而不是1-3
flcandclf 2004-12-10
  • 打赏
  • 举报
回复
在相应的编辑列中设置CommandName="name",在itemcommand事件中判断一下。

if(e.CommandName == "name")
{

}
赳赳老陈 2004-12-10
  • 打赏
  • 举报
回复
同意思归大哥
e.Item.Cells(0)
fisher12345 2004-12-10
  • 打赏
  • 举报
回复
我觉得问题在这:
tb = e.Item.Cells(1)
tb_ls.Text = Trim(tb.Text)

tb = e.Item.Cells(2)
tb_swdl.Text = tb.Text


tb = e.Item.Cells(3)
tb_swxl.Text = tb.Text
在执行分页之前会执行ItemCommand,而此时e.Item.Cells(1)、e.Item.Cells(2)等没有明确地被告知是指向哪,所以我想这个index出错是指Cells(1),Cells(2)中1,2出错,正确的方法是在ItemCommand函数里加上一个if条件判断,将tb = e.Item.Cells(1)
tb_ls.Text = Trim(tb.Text)

tb = e.Item.Cells(2)
tb_swdl.Text = tb.Text


tb = e.Item.Cells(3)
放到判断里。比如你ItemCommand是执行某个模板列的任务,那就判断一下,模板列有没有被点击,这样分页里就不会去执行Cells(1、Cells(1)这样的语句,应该就不会错了!
listhome 2004-12-10
  • 打赏
  • 举报
回复
Bind()
{
...
try
{
dg.DataBind();
}
catch
{
dg.CurrentPageIndex = dg.CurrentPageIndex-1;
dg.DataBind();
}
这样判断一下就好了
caiyi000 2004-12-10
  • 打赏
  • 举报
回复
我一般不这样写。我是把
Dim dap_oa_swlb As New OracleDataAdapter("select * from hj_xt_swlb", cpt.conn)
Dim dst_oa_swlb As New DataSet
dap_oa_swlb.Fill(dst_oa_swlb, "hj_xt_swlb")
dg_oa_swlb.DataSource = dst_oa_swlb.Tables(0).DefaultView
dg_oa_swlb.DataBind()
写成一个SUB,然后PAGE_LOAD的时候调用,,PageIndexChanged的时候掉用,这样一般不会出错
goody9807 2004-12-10
  • 打赏
  • 举报
回复
<form id="Form1" method="post" runat="server">
<asp:datagrid id="dgOrder" runat="server" Height="515px" Width="718px" AutoGenerateColumns="False" AllowSorting="True" CellPadding="4" BorderWidth="1px" BorderColor="#A0ABEB" PageSize="15" BorderStyle="Solid" BackColor="White" GridLines="Vertical" ForeColor="Black" AllowPaging="True" ShowFooter="True">
<SelectedItemStyle ForeColor="White" BackColor="Black"></SelectedItemStyle>
<AlternatingItemStyle BackColor="#EEEEEE"></AlternatingItemStyle>
<HeaderStyle HorizontalAlign="Center" ForeColor="White" BorderColor="#6876C5" BackColor="#6876C5"></HeaderStyle>
<FooterStyle ForeColor="White" BackColor="#6876C5"></FooterStyle>
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<FONT face="">
<asp:CheckBox id="Cb" runat="server"></asp:CheckBox></FONT>
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="orderid" SortExpression="orderid" HeaderText="ID">
<HeaderStyle Width="180px"></HeaderStyle>
</asp:BoundColumn>
<asp:BoundColumn DataField="ShipCountry" SortExpression="ShipCountry" HeaderText="ShipCountry">
<HeaderStyle Width="180px"></HeaderStyle>
</asp:BoundColumn>
<asp:BoundColumn DataField="ShippedDate" SortExpression="ShippedDate" HeaderText="ShippedDate" DataFormatString="{0:d}">
<HeaderStyle Width="180px"></HeaderStyle>
</asp:BoundColumn>
<asp:BoundColumn DataField="Freight" SortExpression="Freight" HeaderText="Freight">
<HeaderStyle Width="180px"></HeaderStyle>
</asp:BoundColumn>
<asp:BoundColumn DataField="ShipAddress" SortExpression="ShipAddress" HeaderText="ShipAddress">
<HeaderStyle Width="480px"></HeaderStyle>
</asp:BoundColumn>
</Columns>
<PagerStyle HorizontalAlign="Center" ForeColor="Black" Position="TopAndBottom" BackColor="White" Mode="NumericPages"></PagerStyle>
</asp:datagrid>
</form>



'得到数据视图,参数为要排序的列
Private Function GetDv(ByVal strSort As String) As DataView
'定义数据库连接
Dim dv As DataView
Dim CN As New SqlConnection()
Try
'初始化连接字符串
CN.ConnectionString = "data source=pmserver;
initial catalog=Northwind;persist security info=False;user id=sa;Password=sa;"
CN.Open()
'从NorthWind得到orders表的数据
Dim adp As SqlDataAdapter = New SqlDataAdapter("select * from orders", CN)
Dim ds As New DataSet()
adp.Fill(ds)
'得到数据视图
dv = ds.Tables(0).DefaultView
Catch ex As Exception
#If DEBUG Then
Session("Error") = ex.ToString()
Response.Redirect("../error.aspx") '跳转程序的公共错误处理页面
#End If
Finally
'关闭连接
CN.Close()
End Try
'排序
dv.Sort = strSort
Return dv
End Function

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
If Not IsPostBack Then
ViewState("strSort") = "orderid"
dgOrder.DataSource = GetDv(ViewState("strSort").ToString())
dgOrder.DataBind()
End If
End Sub
'排序
Private Sub dgOrder_SortCommand(ByVal source As Object,
ByVal e As System.Web.UI.WebControls.DataGridSortCommandEventArgs) Handles dgOrder.SortCommand
dgOrder.CurrentPageIndex = 0
'得到排序的列
ViewState("strSort") = e.SortExpression.ToString()
dgOrder.DataSource = GetDv(ViewState("strSort").ToString())
dgOrder.DataBind()
End Sub

'分页
Private Sub dgOrder_PageIndexChanged(ByVal source As Object,
ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles dgOrder.PageIndexChanged
'得到分页的页号
dgOrder.CurrentPageIndex = e.NewPageIndex
dgOrder.DataSource = GetDv(ViewState("strSort").ToString())
dgOrder.DataBind()
End Sub

conquersky 2004-12-10
  • 打赏
  • 举报
回复
指数? 老大何解?
saucer 2004-12-10
  • 打赏
  • 举报
回复
哪句出错?记住,在.NET里,指数是从0开始的
constantine 2004-12-10
  • 打赏
  • 举报
回复
up
zpisgod 2004-12-10
  • 打赏
  • 举报
回复
itemcommand 会截获所有在datagrid中的控件事件,
你在itemcommand中下一个判断
if(e.CommandName=="你的按钮列的时间名称") //如果你有多个按钮列的话也是如此区分的
{
Panelmain.Visible = True
Dim tb As TableCell
tb_swdl.Visible = True
tb_swxl.Visible = True

tb = e.Item.Cells(1)
tb_ls.Text = Trim(tb.Text)

tb = e.Item.Cells(2)
tb_swdl.Text = tb.Text


tb = e.Item.Cells(3)
tb_swxl.Text = tb.Text

}
zhy0101 2004-12-10
  • 打赏
  • 举报
回复
我也遇到过,不知道怎么回事,不过重新做一个DataGrid就好了,莫名其妙。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧