Insert new row inside DataGridView
这个答案使得数据库看起来应该使用rows.add
进行更新其他一些网站有说明,但形成了从头开始创建数据库的视角。我已经有了一个数据库,只是想让愚蠢的事情接受新数据。
这就是我所做的:
Private Sub InitializeDataGridView()
Try
' Set up the DataGridView.
With Me.DataGridView1
' Automatically generate the DataGridView columns.
.AutoGenerateColumns = True
' Set up the data source.
'bindingSource1.DataSource = GetData("SELECT * FROM Places and Stuff")
MyTable = GetData("SELECT * FROM Places and Stuff")
'MyDataSet = bindingSource1.DataSource
'MyTable = MyDataSet.Tables(0)
.DataSource = MyTable
' Automatically resize the visible rows.
.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
' Set the DataGridView control's border.
.BorderStyle = BorderStyle.Fixed3D
' Put the cells in edit mode when user enters them.
.EditMode = DataGridViewEditMode.EditOnEnter
' Disables Add New Row
.AllowUserToAddRows = False
End With
Catch ex As SqlException
MessageBox.Show(ex.ToString, _
"ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
System.Threading.Thread.CurrentThread.Abort()
End Try
End Sub
我将DGV绑定到表格。看起来我可能需要在某个地方更新数据集,但我无法弄清楚如何使用也是sql数据库的表填充数据集。您还可以看到我在其他数据集/数据表等处使用过的地方。
我还有我的datagridview添加一行,但数据库是懒惰的:
Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
'Determine Last Row Index
Dim dgvrowCnt As Integer = DataGridView1.Rows.Count - 1
If DataGridView1.Rows.Count > 0 Then
Dim myRow As DataRow = MyTable.NewRow
myRow(0) = DataGridView1.Rows(dgvrowCnt).Cells(0).Value + 1
MyTable.Rows.Add(myRow)
Else
Dim myRow As DataRow = MyTable.NewRow
myRow(0) = 230
MyTable.Rows.Add(myRow)
End If
End Sub
我因为无法使用myRow("<column name here>") = 230
而感到有点难过,但我想我必须克服它。
我尝试刷新并检查表格,看看我的表单是否需要刷新,但似乎并非如此。
此页面http://support.microsoft.com/kb/301248有2行,并声称它符合我的希望:
Dim objCommandBuilder As New SwlCammandBuilder(daAuthors)
daAuthors.Update(dsPubs, "Authors")
我无法将表格放入数据集中,如我示例的绑定行所示。
答案 0 :(得分:2)
您似乎还没有理解ADO.NET的基本概念。 DataTable和其他对象(如DataSet)是“已断开连接”的对象,这意味着添加/更新和删除行不会更新/插入/删除数据库表。
您需要创建一个SqlCommand,准备其命令文本,然后执行查询以更新您的数据库(其他方法包括使用SqlDataAdapter及其Update方法)
例如,要在数据表中插入单行,您的代码应该是这样的
Using con = New SqlConnection(.....constringhere...)
Using cmd = new SqlCommand("INSERT INTO table1 (field1) values (@valueForField)", con)
con.Open()
cmd.Parameters.AddWithValue("@valueForField", newValue)
cmd.ExecuteNonQuery()
End Using
End Using
A more complete tutorial could be found here
相反,这可能是一个伪代码,使用SqlDataAdapter
和SqlCommandBuilder
来自动构建将更改存储回数据库所需的命令
' Keep the dataset and the adapter at the global class level'
Dim da As SqlDataAdapter = Nothing
Dim ds As DataSet
Private Function GetData(ByVal sqlCommand As String) As DataSet
ds As New DataSet()
Dim connectionString As String = "Data Source=...."
Using con = New SqlConnection(connectionString)
conn.Open()
Using command = New SqlCommand(sqlCommand, con)
Using da = New SqlDataAdapter(command)
da.Fill(ds)
End Using
End Using
End Using
Return ds
End Function
使用GetData返回的DataSet中的第一个表作为网格的数据源(或者只使用整个数据集)
.DataSource = GetData(.......).Tables(0)
' Add a new button to submit changes back to the database'
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
Dim builder = New SqlCommandBuilder(da)
da.UpdateCommand = builder.GetUpdateCommand()
da.InsertCommand = builder.GetInsertCommand()
da.DeleteCommand = builder.GetDeleteCommand()
da.Update(ds)
End Sub
请注意,我无法测试此代码,并且我将其作为伪代码提供,而不需要更强大的应用程序进行任何错误检查。