vs2013使用VB编写gridview的rowupdating事件时无法findcontrol找到对应控件

kikiwang20 2014-05-06 10:39:58
s2013使用VB编写gridview的rowupdating事件时,在窗口中编辑后,无法进行更新,请帮忙解答

报错如下:
未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

源错误:

行 160: Dim sqlstr As String
行 161: Dim woo As TextBox = CType(GridView1.Rows(e.RowIndex).FindControl("工程名称(必填)"), TextBox)// 错误所在行
行 162: Dim str1 As String = woo.Text
行 163:
行 164:

断点调测发现正在编辑行(标黄处)的gridview.cell下确实有子控件,非编辑行就没有,是否有命令能查询到该子控件的ID?通过查看网页的HTML代码能找到该子控件是个textbox,有名字,但是gridview.cells.findcontrol(控件名字)结果却是null,究竟怎么样才能正确获取子控件的文本内容,从而实现gridview编辑后的更新呢
...全文
178 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangjin118 2014-05-07
  • 打赏
  • 举报
回复
贴出你的前台代码,让我们看下,是不是写的有问题。另外你页面有没有用到页面模版之类的的(masterpage之类的),这样的话控件的ID就不是你现在的ID了。 最好发一下代码前台和后台的都发一下,你有自己定义EditTemplate 然后绑定的? 还是直接用的绑定的。 如果是上述的问题的话, 解决方法(将控件ID变成静态类型 在控件(前台)中加上属性ClientIDMode="Static")
huangjin118 2014-05-07
  • 打赏
  • 举报
回复
顺便说下用zip包发我,不然我解压不了
huangjin118 2014-05-07
  • 打赏
  • 举报
回复
hj19882006@126.com
kikiwang20 2014-05-07
  • 打赏
  • 举报
回复
没有报错,而且我的取消函数只有如下代码都没问题,可以退回gridview GridView1.EditIndex = -1 fresh() ,你邮箱多少,我把文件发给你看看行么
huangjin118 2014-05-07
  • 打赏
  • 举报
回复
前台没有问题呀。 另外你这个fresh方法没有找控件的呀,怎么会报找控件的错误。 fresh方法再贴一下,这个绑定的方法,你一开始绑定不用吗?一开始报错了没有?
kikiwang20 2014-05-07
  • 打赏
  • 举报
回复
前台是这样的 <asp:AccessDataSource ID="AccessDataSource1" runat="server" DataFile="~/工程预约.mdb" SelectCommand="SELECT [工作类型(必填)] AS column1 FROM [sheet4]"></asp:AccessDataSource> <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" DataKeyNames="ID" EnableModelValidation="True" OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating" OnRowCancelingEdit="GridView1_RowCancelingEdit"> <Columns> <asp:TemplateField> <ItemTemplate> <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="False" /> </ItemTemplate> </asp:TemplateField> <asp:CommandField HeaderText="编辑" ShowEditButton="True" ButtonType="Button" /> <asp:CommandField HeaderText="删除" ShowDeleteButton="True" /> <asp:TemplateField HeaderText="工程名称(必填)" SortExpression="工程名称(必填)"> <EditItemTemplate> <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("[工程名称(必填)]") %>'></asp:TextBox> </EditItemTemplate> <ItemTemplate> <asp:Label ID="Label2" runat="server" Text='<%# Bind("[工程名称(必填)]") %>'></asp:Label> </ItemTemplate> </asp:TemplateField>
huangjin118 2014-05-07
  • 打赏
  • 举报
回复
你把前台的gridview控件代码发过来吧,字段名字你直接删掉好了。 我看下你前台怎么写的?
huangjin118 2014-05-07
  • 打赏
  • 举报
回复
你是在什么时候触发的updating事件? 是点击的保存按钮吗?(这个也可以自定义) 另外你更新成功以后 先设定GridView1.EditIndex = -1 让后重新绑定gridview就可以了。 下面这个就不必要弹出来了,再说了这个应该是注册脚本的吧,不然你只能在你本地弹出来。 MsgBox("更新成功,请点击刷新按钮返回")
kikiwang20 2014-05-07
  • 打赏
  • 举报
回复
to huangjin118:感谢答复,我看了下是之前的列不是模板列,我再gridview把列转换成模板后可以找到控件的ID,接下来又遇到一个问题,就是我点击“更新”成功更改了值后,无法自动返回到gridview那页,而会报错,报错原因我看了下,是由于又找不到那个控件了,我查了下应该是和我的fresh(刷新gridview绑定的数据)函数有关系,但不知道具体原因在哪里,如果不接fresh()不会报错,但会停留在编辑的那个页面。我的updating函数和fresh函数如下 sqlstr = "update sheet4 set 工程名称(必填)='" & CType(GridView1.Rows(e.RowIndex).FindControl("TextBox2"), TextBox).Text.ToString & "' where ID=" & GridView1.DataKeys(e.RowIndex).Value.ToString 'MsgBox(sqlstr) conn.Execute(sqlstr) conn.Close() conn = Nothing MsgBox("更新成功,请点击刷新按钮返回") GridView1.EditIndex = -1 fresh() Protected Sub fresh() Dim Con As OleDbConnection, path As String Dim da As OleDbDataAdapter, ds As New DataSet() path = Server.MapPath("./") path = Left(path, path.Length - 5) Con = New OleDbConnection() Con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ("/工程预约.mdb") da = New OleDbDataAdapter("select * from sheet4 order by 开始时间(必填)", Con) da.Fill(ds, "sheet4") GridView1.DataSource = ds.Tables("sheet4").DefaultView GridView1.DataBind() End Sub

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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