2014-12-02 43 views
1

我加載VB.NET DataGridView使用SqlDataAdapter填充DataSet,然後設置DataGridViewDataSourceDataSetSqlDataAdapter的缺失的DeleteCommand

由於某些原因,使用SqlCommandBuilder填充的唯一命令是SelectCommand。我意識到我只是指定一個SELECT查詢,但我認爲SqlCommandBuilder的目的是爲我生成更新/刪除/插入命令。

以下是適用代碼:

Dim _dstErrorLog As New DataSet 
Dim _adapter As SqlDataAdapter 
Dim _builder As SqlCommandBuilder 

Private Sub ErrorLog_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Call LoadErrorLog() 
End Sub 

Private Sub LoadErrorLog() 
    Dim strSql As String 

    strSql = "SELECT Ident, LogDate, LogDesc FROM dbo.ErrorLog ORDER BY DescDateTime DESC" 
    _adapter = New SqlDataAdapter(strSql, dataLayer.Connection) 
    _builder = New SqlCommandBuilder(_adapter) 
    _adapter.Fill(_dstErrorLog) 

    grdErrorLog.DataSource = _dstErrorLog.Tables(0) 
End Sub 

Private Sub grdErrorLog_UserDeletingRow(sender As Object, e As DataGridViewRowCancelEventArgs) Handles grdErrorLog.UserDeletingRow 
    _adapter.Update(_dstErrorLog.Tables(0)) 
End Sub 

當我刪除一行,它從DataGridView消失,但是當我重新打開窗體,數據是一切仍然存在。我需要自己指定DeleteCommand嗎?如果是這樣,那麼SqlCommandBuilder的目的是什麼?

回答

1

使用UserDeletedRow事件,而不是UserDeletingRow
在UserDeletingRow事件中,對DataGridView所做的更改仍未提交到綁定的DataSource,因此在該事件中調用SqlDataAdapter.Update不會導致數據庫發生任何更改,因爲該表仍未更改。

Private Sub grdErrorLog_UserDeletedRow(sender As Object, e As DataGridViewRowEventArgs) Handles grdErrorLog.UserDeletingRow 
    Dim count = _adapter.Update(_dstErrorLog.Tables(0)) 
    Console.WriteLine("Rows deleted:" & Count) 
End Sub 

逸岸在UserDeletingRow參數eDataGridViewRowCancelEventArgs這意味着你仍然可以取消刪除設置e.Cancel = True

+0

優秀,是沒有的伎倆!出於某種原因,當我設置斷點時,'DeleteCommand'仍然表示「Nothing」。但是,數據已成功從數據源中刪除,因此它似乎正常工作。 – 2014-12-02 22:30:08