【问题标题】:Insert data into SQL from DataGridView with New Added Row State使用新添加的行状态将数据从 DataGridView 插入 SQL
【发布时间】:2017-08-15 13:05:58
【问题描述】:
dtNew = TryCast(bs.DataSource, DataTable).GetChanges()

If (dtNew IsNot Nothing) Then
For Each dr As DataRow In dtNew.Rows
      Select Case (dr.RowState)
          Case DataRowState.Added

              Dim strSQLDelete As String = String.Empty
              strSQLDelete = String.Format("insert into employeebenefittran (empbenefitcode,amount,calamount,refno,taxclass,source,empbenefitdate,period,cycle,empno) values ('{0}',{1},{1},'{2}','{3}','{4}','{5}','{6}','{7}','{8}')", dr(0), dr(1), "", dr(2), "Y", Date.Parse(String.Format("{0}-{1}-{2}", strPeriod.Substring(0, 4), strPeriod.Substring(4, 2), 1)), strPeriod, "0E", strEmpNo)

              Using sqlConn As New SqlConnection(sDBConnection)
              If sqlConn.State = ConnectionState.Closed Then sqlConn.Open()

                  Using cmdSQLDelete As New SqlClient.SqlCommand(strSQLDelete, sqlConn)
                  cmdSQLDelete.ExecuteNonQuery()
                  End Using

              If sqlConn.State = ConnectionState.Open Then sqlConn.Close()
              End Using
    End Select
Next
End If

我已编码以使用数据源从 DataGridView 插入我的新添加数据。但是,我发现在完成一行数据的键入后,我总是需要单击到下一行,否则它会发现我的数据源或数据表中没有任何内容并跳过插入。 * 意味着 dtNew 在我单击 datagridview 上的新行之前将始终一无所有,这不是一个好的用户体验。

你对此有什么想法吗?

【问题讨论】:

  • 当他们添加新行时可能会给他们一个表格来填写?
  • 我在DataTable的getchange之前使用了最笨的方法gcvYTDBIK.AddNewRow()来临时解决这个问题。但是,我不确定是否会提出任何其他问题,因为这是一个“把戏”。感谢 ThatGuy。

标签: vb.net datagridview


【解决方案1】:

您应该将DataTable 绑定到BindingSource,然后将其绑定到您的网格。看来您可能已经在这样做了。然后,当您准备好保存时,您可以在 BindingSource 上调用 EndUpdate,这将提交对底层 DataTable 的任何未决更改。

至于实际节省,您将非常简单的事情复杂化。首先,您不需要Select CaseGetChanges 方法允许您指定一个或多个 DataRowState 值,生成的 DataTable 将仅包含具有该状态的已更改行。改变这个:

dtNew = TryCast(bs.DataSource, DataTable).GetChanges()

到这里:

dtNew = TryCast(bs.DataSource, DataTable).GetChanges(DataRowState.Added)

然后你可以删除Select Case

顺便说一句,你永远不应该使用TryCast,然后将另一个成员链接到它上面。 TryCast 的全部意义在于它可以返回Nothing。如果在您的代码中发生这种情况,则会抛出 NullReferenceExcpetion。如果您知道这永远不会发生,那么您应该首先使用DirectCast 而不是TryCast

也没有充分的理由使用这样的循环。您应该使用适当的InsertCommand 创建一个数据适配器,然后将您的DataTable 传递给它的Update 方法。这会将 DataTable 中的所有更改保存为一个批次。

无论如何,打电话给GetChanges 可能没有充分的理由。只有在您不想同时保存的添加之外的类型可能发生更改时,您才会这样做。如果您想保存所有更改或者只能有新行,那么您也可以在数据适配器上调用 Update 并传递原始的 DataTable

【讨论】:

  • 我已经尝试过 DirectCast 与 trycase 没有什么不同,对于 DataTable 两者都不会得到任何结果。之所以使用select case,是因为AddNew只是实现了其中一个功能,解决了当前的Issue之后,我还要进一步实现Delete,Update。谢谢你的建议,Jmcih​​inney,你颠覆了我的观点。
  • 如果TryCast 在该代码中失败,那么DirectCast 也会失败。如果TryCast 在该代码中永远不会失败,那么DirectCast 也永远不会失败。两者都有特定目的,因此请使用适用于特定情况的目的。从来没有,任何情况下都不是 100% 清楚应该使用哪个。
  • 只需使用数据适配器并批量保存批次。如果您只想测试一种类型的更改,请在测试时做出决定。不要编写代码来强制执行这种情况。您可能想阅读本文,特别注意使用数据适配器的示例:vbforums.com/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 2012-08-09
相关资源
最近更新 更多