Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 无法向datatable添加行,datatable无任何错误_Vb.net_Datatable - Fatal编程技术网

Vb.net 无法向datatable添加行,datatable无任何错误

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

我不确定到底出了什么问题,我在顶部声明了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.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()中保留一个副本。当网格由数据库驱动时,我们不会(不必)这样做。在这种情况下,我们将添加到数据库中,然后重新加载网格。