【问题标题】:Unable to add rows to datatable, datatable is nothing error无法将行添加到数据表,数据表没有错误
【发布时间】:2020-12-23 03:44:01
【问题描述】:

我不太确定出了什么问题,我在顶部声明 dt 作为类变量,然后在页面加载中使用的填充函数中将其声明为新数据表,但是当我按下 buttonadd 时,dt 没有任何错误弹出。

 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

【问题讨论】:

  • 仔细检查是否在您的 Page_Load 上真的执行了 fill()
  • @B.S.它应该被执行我在非 page.ispostback 上还有其他功能正在执行,所以我不知道是什么问题。从错误来看,我怀疑它的执行,但我不知道是什么问题。

标签: vb.net datatable


【解决方案1】:

关键概念是网页是“无状态”的。

这意味着对于每个事件代码存根,代码都是从头开始的。

这意味着对于每次浏览器往返,浏览器代码每次都从头开始。因此,您只需加载数据表一次(第一次 - 这很好!!!)。

问题当然是网页上没有控件。 (比如说数据网格),或者说一个简单的文本框?这些控件在所谓的往返过程中幸存下来。最重要的概念,如果要学习有关 asp.net 网页的一件事?

你必须掌握往返的概念,以及所谓的页面状态。

那么,你的情况会怎样?

第一次 - 页面加载 - 代码在服务器端运行(通常称为代码隐藏)。

您的表单实例类已创建,您的加载事件运行,您加载表格。然后浏览器向下发送到客户端。网页只是坐在这里。也许你关闭了浏览器。也许你拔下你的电脑。服务器不知道,也不关心这一点。事实上,服务器甚至不知道网页已经存在了!!!

所以,你的网页就在这儿,你点击那个按钮。

网页现在被发送到服务器,后面的代码开始运行 - 但每次都是从头开始!

所以您的名为“数据表”的表单级变量不再存在,也没有值。

因此,这里有几种解决方案。对于初学者,我们需要那个“桌子”来坚持并在往返旅行中幸存下来。如前所述,您放入该页面的大多数控件将保留其值。这称为“视图状态”。那么,如果我们希望该数据表在用户下次执行某项操作时仍然存在并“存在”?然后我们需要保存或持久化该表变量。

另一种方式?您可以使用所谓的 session()。 Session() 是允许使用将值推入 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 表。

【讨论】:

  • 我使用gridview来存储datatable,然后用户会决定是否按下按钮将gridview中的数据插入到数据库中,非常感谢您的帮助!
  • 首先,我修复了一个type-o。 (我的酷表)。好吧,既然我们现在要从数据库中提取(并添加)值?然后我们真的不需要持久化该表。我们可以将新行添加到数据库中,然后从该数据库重新加载网格。在这种情况下,因为表是从头开始动态创建的,所以我们必须在 session() 中保留一份副本。当网格由数据库驱动时,我们不会(不必)。在这种情况下,我们添加到数据库中,然后重新加载网格。
猜你喜欢
  • 1970-01-01
  • 2019-05-19
  • 2016-12-28
  • 2020-01-04
  • 1970-01-01
  • 2015-09-30
  • 2021-04-15
  • 2019-04-03
  • 2014-04-04
相关资源
最近更新 更多