2017-08-15 76 views
0
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上的新行,這不是一個好的用戶體驗。從DataGridView插入數據到新添加的行狀態

你對此有什麼想法嗎?

+0

當他們添加一個新行時,可能會給他們一個表格來填寫? – ThatGuy

+0

我在DataTable的getchange之前使用了最虛擬的方法gcvYTDBIK.AddNewRow()來暫時解決這個問題。但是,我不確定這是否會引發其他問題,因爲這是一個「技巧」。感謝ThatGuy。 –

回答

0

您應該將DataTable綁定到BindingSource,然後將其綁定到您的網格。看起來你可能已經在做這件事了。您可以在準備好保存時致電EndUpdateBindingSource,並且將對潛在的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

+0

我試過DirectCast與trycase沒有什麼不同,兩者都會得到DataTable的Nothing。我使用select case的原因是AddNew只是其中一個實現的功能,我在解決當前問題後仍會進一步實現Delete,Update。謝謝你的建議,你已經爆炸了我的觀點,Jmcih​​inney。 –

+0

如果'TryCast'在該代碼中失敗了,那麼'DirectCast'也會失敗。如果'TryCast'永遠不會失敗,那麼'DirectCast'也不會失敗。兩者都有一個特定的目的,所以使用適用於有關具體情況的目標。永遠不會有這樣的情況,即不應100%清楚應該使用哪種情況。 – jmcilhinney

+0

只需使用數據適配器並批量保存批次即可。如果您只想測試一種類型的變化,那麼在測試時做出決定。不要編寫代碼來執行這種情況。您可能希望閱讀本文,特別關注使用數據適配器的示例:http://www.vbforums.com/showthread.php?469872-Retrieving-and-Saving-Data-in-Databases&highlight= – jmcilhinney

相關問題