Vb.net 无法向datatable添加行,datatable无任何错误
我不确定到底出了什么问题,我在顶部声明了dt作为一个类变量,然后在pageload中使用的fill函数中将它声明为新的datatable,但当我按下buttonadd时,dt is nothing错误弹出Vb.net 无法向datatable添加行,datatable无任何错误,vb.net,datatable,Vb.net,Datatable,我不确定到底出了什么问题,我在顶部声明了dt作为一个类变量,然后在pageload中使用的fill函数中将它声明为新的datatable,但当我按下buttonadd时,dt is nothing错误弹出 Private dt As DataTable Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not Page
Private dt As DataTable
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
fill()
End If
End Sub
Protected Sub fill()
dt = New DataTable
dt.Columns.Add("Status", GetType(String))
End Sub
Protected Sub btnadd_Click(sender As Object, e As EventArgs) Handles btnadd.Click
Dim R As DataRow = dt.NewRow
R("Status") = "Pending"
dt.Rows.Add(R)
'dt.Rows.Add("pending")
GridView1.DataSource = dt
GridView1.DataBind()
End Sub
关键概念是网页是“无状态的” 这意味着对于每个事件代码存根,代码将从头开始 这意味着每次浏览器往返时,浏览器代码都会从头开始。因此,只需加载一次数据表(第一次-这很好!!!) 问题当然是,网页上没有控件。(比如说一个数据网格),或者说一个简单的文本框?这些控件在所谓的往返过程中仍然存在。最重要的概念是,如果我们想了解关于asp.net网页的一件事 您必须掌握往返概念,以及所谓的页面状态 那么,你的情况如何 第一次-页面加载-代码在服务器端运行(通常称为代码隐藏) 创建表单实例类,运行加载事件,加载表。然后将浏览器发送到客户端。网页就在这里。也许你可以关闭浏览器。也许你把电脑插头拔了。服务器不知道或不关心这一点。事实上,服务器甚至不知道网页存在了 所以,你的网页就在这里,你点击这个按钮 网页现在被发送到服务器,代码开始运行——但每次都是从头开始 因此,名为“数据表”的表单级变量不再存在,也没有值 因此,这里有几种解决方案。首先,我们需要这张“桌子”来维持并在往返中生存。如前所述,您放入该页面的大多数控件将保留其值。这称为“视图状态”。那么,如果我们希望该数据表在用户下次做某事时继续存在并“存在”下去?然后我们需要保存或持久化该表变量 另一种方式?您可以使用所谓的会话()。Session()是一种允许用户将值推入Session()的尝试和系统。会话()在往返过程中仍然有效 现在,给你举个例子 那么,我们的代码将变成:
Private dt As DataTable
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
fill()
Session("MyCoolTable") = dt
else
' this is a page post back - re-load the active table into our
' forms level dt.
dt = Session("MyCoolTable")
end if
在很多情况下,我会假设驱动网格的表是一个数据库。因此,我会将该行添加到数据库中,然后重新绑定数据网格
但是上面对session()的使用将为您保留dt表。只需仔细检查页面上是否真的执行了fill()_Load@B.S.它应该被执行。我在not页上有其他函数。ispostback正在执行,所以我不知道是什么问题。从错误判断,我怀疑它是否执行,但我不知道问题出在哪里。我正在使用gridview存储datatable,然后用户稍后将决定是否按按钮将gridview中的数据插入数据库,非常感谢您的帮助!首先,我修正了一个o型。(可移植)。既然我们现在要从数据库中提取(并添加)值?那么,我们就不需要真正地保留这个表了。我们可以将新行添加到数据库中,然后从该数据库重新加载网格。在这种情况下,由于表是从头开始动态创建的,因此我们必须在session()中保留一个副本。当网格由数据库驱动时,我们不会(不必)这样做。在这种情况下,我们将添加到数据库中,然后重新加载网格。