簡體   English   中英

如何從 DataGridView 編輯行? MS Access 數據庫

[英]How to edit rows from DataGridView? MS Access Database

似乎這是我唯一不知道和不理解的查詢。 我已經為我的編輯按鈕設置了一個查詢,這是代碼。

ExecuteQuery("Update ICT11 set [Author] = '" & AuthorTxt.Text & "', [Publisher] = '" & PublisherTxt.Text & "', [Subject Code] = '" & SubcodeTxt.Text & "', [Price] = '" & PriceTxt.Text & "', [DiscountAmount] = '" & DiscountTxt.Text & "' Where [Book Name] = '" & BooknameTxt.Text & "'")

這也是連接到數據庫的模塊

Module SQLDatabase
Public provider As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Anthony\Desktop\BookSelection\DataBase\BookListUE.accdb"
Public myConnection As OleDbConnection = New OleDbConnection(provider)
Public sql As String
Public cmd As OleDbCommand
Public da As OleDbDataAdapter = New OleDbDataAdapter
Public dt As New DataTable
Function ExecuteQuery(ByVal Query As String) As DataTable

    Dim sqlDT As New DataTable

    Dim sqlCon As New OleDbConnection(provider)
    Dim sqlDA As New OleDbDataAdapter(Query, sqlCon)
    Dim sqlCB As New OleDbCommandBuilder(sqlDA)

    sqlDA.Fill(sqlDT)
    Return sqlDT

End Function

終端模塊

編輯按鈕上的功能似乎工作正常,因為我沒有遇到任何異常。 然而,它並沒有真正更新數據庫,以及 DataGridView。

你正在以完全錯誤的方式解決這個問題。 您使用數據適配器來填充DataTable並將其綁定到網格。 用戶在本地所做的任何更改都應該對該DataTable

如果他們通過網格編輯,那會自動發生。 如果他們通過TextBoxes等進行編輯,那么如果您也綁定TextBoxes ,這些更改仍然可以自動推送到DataTable 否則,您應該使用來自TextBoxes的數據手動更新DataTable 這是綁定到網格和TextBoxes的示例:

BindingSource1.DataSource = myDataTable
DataGridView1.DataSource = BindingSource1
TextBox1.DataBindings.Add("Text", BindingSource1, "Column1")
TextBox2.DataBindings.Add("Text", BindingSource1, "Column2")

如果您這樣做,則在網格中選擇一行將自動使用該行的數據填充TextBoxes 當您導航到另一行時,在TextBoxes所做的任何編輯都將反映在網格中。 如果您沒有綁定,那么您會將數據從網格復制到TextBoxes

Dim row = DirectCast(BindingSource1.Current, DataRowView)

TextBox1.Text = CStr(row("Column1"))
TextBox2.Text = CStr(row("Column2"))

然后再回來:

Dim row = DirectCast(BindingSource1.Current, DataRowView)

row("Column1") = TextBox1.Text
row("Column2") = TextBox2.Text

請注意BindingSource的使用,它旨在成為訪問和操作綁定數據的一站式商店。 另請注意,當您綁定DataTable ,數據實際上來自其DefaultView屬性,即DataView類型,而不是其Rows屬性,即DataRowCollection類型。 出於這個原因,每個項目都是一個DataRowView而不是DataRow 另外,請注意,在將更改復制回來時,您可能無法使用Current項目,具體取決於您何時/何地執行此操作。 如果此時選擇已更改,則必須通過將其分配給字段來記住正在編輯的行:

Private editingRow As DataRowView

'...

If editingRow IsNot Nothing Then
    editingRow("Column1") = TextBox1.Text
    editingRow("Column2") = TextBox2.Text
End If

editingRow = DirectCast(BindingSource1.Current, DataRowView)

TextBox1.Text = CStr(editingRow("Column1"))
TextBox2.Text = CStr(editingRow("Column2"))

您可以在保存之前對DataTable進行任意數量的更改,即您可以但不必在每次編輯后保存。 准備好保存后,您可以使用數據適配器(最好是相同的,但不一定),通過調用Update將更改從DataTable保存到數據庫。 沒有對網格進行“刷新”,因為它在保存之前已經反映了綁定DataTable的更改。

以下是我前段時間寫的一些示例,可能對您有所幫助:

http://www.vbforums.com/showthread.php?469872

http://www.vbforums.com/showthread.php?469518

在第一個線程的所有 ADO.NET 代碼中,請注意使用參數而不是字符串連接將值導入 SQL 代碼。 要了解為什么以及如何做到這一點,請查看以下內容:

http://jmcilhinney.blogspot.com/2009/08/using-parameters-in-adonet.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM