.NET中使用GridView控件输入数据时出现“ Index was out of range. Must be non-negative and less than the size of the...

2023-05-16

在.NET中使用GridView控件的在线编辑数据时,出现了“ Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index"的关于数据索引值错误的问题,在网上查了许多,感觉都没有什么文章是直接指出解决问题的方法,先就总结下吧

其实,这个问题在操作时是需要非常注意的,它并不在GridView控件的RowEditing或者RowUpdating方法中,而是需要在获取数据的类中指定GridView控件的主键,后台代码如部分如下:

 


  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5 using System.Web.UI;
  6 using System.Web.UI.WebControls;
  7 using System.Data;
  8 using System.Data.SqlClient;
  9 using System.Configuration;
 10 
 11 namespace UI
 12 {
 13     public partial class _Default : System.Web.UI.Page
 14     {
 15         protected void Page_Load(object sender, EventArgs e)
 16         {
 17             //判断是否第一次加载Bind()类
 18             if (!IsPostBack)
 19             {
 20                 Bind();
 21             }
 22         }
 23 
 24         /// <summary>创建返回数据库连接的公共类
 25         /// </summary>
 26         /// <returns>返回连接数据库的类</returns>
 27         public SqlConnection GetConnection()
 28         {
 29                 string str_conn = ConfigurationManager.AppSettings["myConStr"].ToString();
 30                 SqlConnection myConn = new SqlConnection(str_conn);
 31                 return myConn;
 32         }
 33 
 34         /// <summary>将查询的数据绑定到GridView控件中
 35         /// </summary>
 36         public void Bind()
 37         {     
 38             try
 39             {
 40                 SqlConnection myConn = GetConnection();
 41                 myConn.Open();
 42 
 43                 string sql_Str = "select * from stuInfo order by stuAge desc";
 44 
 45                 SqlDataAdapter myda = new SqlDataAdapter(sql_Str, myConn);
 46                 DataSet myDs = new DataSet();
 47                 myda.Fill(myDs);
 48 
 49                 GridView1.DataSource = myDs;
 50 
 51                 //为GridView控件设置主键,此处必须有否则会产生如下代码中的溢出错误
 52                 /*
 53                  * Index was out of range. Must be non-negative and less than the size of the collection.
 54                   Parameter name: index 
 55                  */
 56                 GridView1.DataKeyNames = new string[] { "stuNo" };//GridView控件设置主键,此处最为关键,稍不留意就忘掉了,切记呀
 57                 GridView1.DataBind();
 58 
 59                 myDs.Dispose();
 60                 myda.Dispose();
 61                 myConn.Close();
 62             }
 63             catch (Exception ex)
 64             {
 65                 Response.Write(ex.Message);
 66             }
 67         }
 68 
 69         /// <summary>创建GridView控件的RowEditing事件类
 70         /// </summary>
 71         /// <param name="sender"></param>
 72         /// <param name="e"></param>
 73         protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
 74         {
 75             GridView1.EditIndex = e.NewEditIndex;
 76             this.Bind();
 77         }
 78 
 79         /// <summary>创建GridView控件的RowUpdating事件类
 80         /// </summary>
 81         /// <param name="sender"></param>
 82         /// <param name="e"></param>
 83         protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
 84         {
 85             try
 86             {
 87                 //获取在GridView控件里相关事件的键值
 88                 int stuNum = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value.ToString());
 89                 string newName = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString();
 90 
 91                 SqlConnection myConn = GetConnection();
 92                 myConn.Open();
 93 
 94                 /*
 95                  * string sql_str = "update stuInfo set stuName='" + newName + "' where stuNo='" + stuNum + "'";
 96                  *与上句相比,以下使用带参数的SQL语句在一定程度上可防止SQL注入攻击
 97                 */
 98                 string sql_str = "update stuInfo set stuName=@newName where stuNo=@stuNum";
 99                 SqlCommand myCmd = new SqlCommand(sql_str, myConn);
100                 myCmd.Parameters.Add("@newName", SqlDbType.NVarChar).Value = newName;
101                 myCmd.Parameters.Add("@stuNum", SqlDbType.VarChar).Value = stuNum;
102 
103                 if (myCmd.ExecuteNonQuery() > 0)
104                 {
105                     Response.Write("<script type='text/javascript'>alert('更新成功');</script>");
106                 }
107                 else
108                 {
109                     Response.Write("<script type='text/javascript'>alert('更新失败');</script>");
110                 }
111 
112                 //调试用
113                 textbox1.Text = "学号:" + stuNum + " , 姓名:" + newName + ", " + sql_str + ", ExecuteNonQuery状态:" + myCmd.ExecuteNonQuery();
114 
115                 myCmd.Dispose();
116                 myConn.Close();
117                 GridView1.EditIndex = -1;
118                 this.Bind();
119             }
120             catch (Exception ex)
121             {
122                 Response.Write(ex.Message);
123             }
124         }
125 
126         /// <summary>创建GridView控件的RowCancelingEdit事件类
127         /// </summary>
128         /// <param name="sender"></param>
129         /// <param name="e"></param>
130         protected void GridView1_RowsCancelingEdit(object sender, GridViewCancelEditEventArgs e)
131         {
132             GridView1.EditIndex = -1;
133             this.Bind();
134         }
135   }
136 }

 

至于前台页面,无非就是绑定相关的事件了,在这就不贴代码了 

转载于:https://www.cnblogs.com/clyde-chen/p/3670636.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET中使用GridView控件输入数据时出现“ Index was out of range. Must be non-negative and less than the size of the... 的相关文章

  • 忽略挂起的更改中的某些文件

    这是我的问题 我已经更改了解决方案中的某些文件 假设是 Web config 并且永远不想签入 因为这些更改仅涉及我的计算机 有没有办法在 TFS 中忽略某个文件中的更改并将其从挂起的更改窗口中删除 当然 我可以在每次签入时跳过这个文件 但
  • MVC2 中隐藏字段的替代方案

    我有一个 viewModel 其中包含一个在传递给部分视图之前填充的字符串 我需要能够在发布表单时取回数据 目前我已经创建了一个隐藏字段并将数据绑定到它 然后 当回发时 我可以从表单集合中获取数据 这并不完全是我想要的 我希望数据完全隐藏在
  • 无法启动 Windows 服务,错误 1064

    我编写了一个在 Win10 上运行的 Windows 服务 它运行得非常好 直到我决定对其进行一些更改 我重写了一些逻辑 在调试和发布配置中进行了测试 一切都很好 然后 我使用卸载了当前版本的服务installutil exe u serv
  • C# 数据表来保存表格(无限嵌套)

    我相对较新C 但来自C C 背景 我需要一个类似于的数据类型 类 DataTable 但允许存储的列保存 简单 类型 int float boolean string 以及相同类型的数据 以便一个列可以保存另一个表 该表也具有存储表等的列
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 哪些属性有助于运行时 .Net 性能?

    我正在寻找可用于通过向加载器 JIT 编译器或 ngen 提供提示来确保 Net 应用程序获得最佳运行时性能的属性 例如我们有可调试属性 http msdn microsoft com en us library k2wxda47 aspx
  • 如何检查 FTP 目录是否存在

    寻找通过 FTP 检查给定目录的最佳方法 目前我有以下代码 private bool FtpDirectoryExists string directory string username string password try var r
  • 为什么在为 Silverlight 5 应用程序添加编码 UI 支持时 System.Core 无法加载?

    我遇到以下问题 尝试添加对为 Silverlight 5 应用程序创建编码 UI 测试的支持 MSDN 1 第一步是在 Silverlight 5 项目中引用程序集 Microsoft VisualStudio TestTools UITe
  • 应用服务中的内存利用率是否可​​以提高

    我有一个相当简单的 Web 应用程序在 Azure 的 B1 服务计划中的应用服务计划中运行 该计划提供 1 个 CPU 和 1 75GB RAM CPU 使用率永远不会超过 5 左右 内存使用率永远不会低于 52 我确实停止了计划中唯一运
  • 如何从 ReadOnlySpan 复制到 Array

    我的班级有一个财产public byte Location get new byte 30 我希望能够从 a 中填充它ReadOnlySpan
  • 是否可以调整AppFabric缓存服务器来存储更大的对象?

    当我假设将较大的对象图添加到缓存中时 我收到 AppFabric 缓存服务器错误 错误代码 子状态 连接已终止 可能是由于服务器或网络问题或序列化对象大小大于服务器上的 MaxBufferSize 请求的结果未知 我确信这不是网络问题 我能
  • 实体框架代码首先保存后不延迟加载

    我的数据库中有一个查找表和一个数据表 我将使用性别和人物作为例子 假设性别表如下所示 Id Code 1 Male 2 Female 人员表如下所示 Id Name GenderId 1 Bob 1 2 Jane 2 我首先在 EF 代码中
  • 从 .net 应用程序登录 OpenID 站点

    我一直在考虑编写一个小工具来登录 SO 并定期使用一些主题 当前信息更新我的个人资料信息 例如我最新的博客文章或我需要帮助的问题等 为了让它工作 我需要以某种方式从控制台应用程序登录到SO 是否有一个 Net 库可以简化使用原始 http
  • 删除 TableLayoutPanel 中的特定行

    我有 TableLayoutPanel 我以编程方式添加行 用户基本上选择一个属性 然后与一些控件一起显示在表中 我想我在这里有一个一般性的理解问题 我会尽力解释它 每行中的控件之一是 删除 按钮 该按钮应该删除它所在的行 我所做的是将事件
  • 检查 DBNull 会引发 StrongTypingException

    我正在使用数据集从数据库中提取数据 一行中的一个字段是NULL 我知道这个 但是 以下 vb net 代码会抛出StrongTypingException 在数据集设计器中自动生成的 get SomeField 方法中 If Not IsD
  • F# 命名约定

    F 是否有 官方 命名 大小写约定 我总是怀疑是否使用 C 风格 Class MyFunctionName or Module my function name 在 F 中 您应该混合 BCL 类和 F 库类 它们具有不同的大小写 并且代码
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐