У меня проблема с обновлением элемента управления DataGridView после Insert
или Update
. Исходный код:Как обновить dataGridView
Получить все строки из таблицы в DataTable и установите источник данных:
Dim dt1 as DataTable = GetData("SELECT * FROM CLAIMSTATE ")
dataGrid.DataSource = dt1
Update Event ID, если оценивается, и вставка, если это не так:
Private Sub dataGrid_RowLeave(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dataGrid.RowLeave
Dim row As DataGridViewRow = CType(sender, DataGridView).Rows(e.RowIndex)
Dim query As New StringBuilder("")
If row.Cells(0).Value & "" = "" Then
query.Append("INSERT INTO CLAIMSTATE ")
query.Append("(CST_CODE, CST_LABEL, CST_POINTS)")
query.Append("VALUES ")
query.Append("(?, ?, ?)")
Else
query.Append("Update CLAIMSTATE ")
query.Append("SET CST_CODE = ?, ")
query.Append("CST_LABEL = ?, ")
query.Append("CST_POINTS = ? ")
query.Append("WHERE CST_ID = ? ")
End If
Dim command As New OdbcCommand(query.ToString(), con)
command.Parameters.Add("@cst_code", OdbcType.Char).Value = row.Cells(1).Value
command.Parameters.Add("@cst_label", OdbcType.NVarChar).Value = row.Cells(2).Value
command.Parameters.Add("@cst_points", OdbcType.Decimal).Value = row.Cells(3).Value
command.Parameters.Add("@cst_id", OdbcType.BigInt).Value = row.Cells(0).Value
Dim res As Integer = ExecuteNonQuery(command)
End Sub
Public Function GetData(ByRef sqlQuery As String) As DataTable
Dim command As New OdbcCommand(sqlQuery, con)
Try
If con.State = ConnectionState.Closed Then
con.ConnectionString = conString
con.Open()
End If
Using dr As OdbcDataReader = command.ExecuteReader()
Dim dt As New DataTable()
dt.Load(dr)
Return dt
End Using
'con.Close()
Catch ex As Exception
MsgBox(ex.Message)
con.Close()
Return Null
End Try
End Function
Public Function ExecuteNonQuery(ByRef command As OdbcCommand) As Integer
Dim result As Integer = 0
If con.State = ConnectionState.Closed Then
con.ConnectionString = conString
con.Open()
End If
'Dim command As New OdbcCommand(sqlQuery, conn)
Try
'command.Connection = con
'Dim cmd As New OdbcCommand(sqlQuery, conn)
result = command.ExecuteNonQuery()
Catch
result = 0
If con IsNot Nothing Then
con.Close()
command.Dispose()
End If
Finally
command.Dispose()
End Try
Return result
End Function
Я попытался получить все записи из таблицы и снова установить источник данных в конце метода, но он не работает.
Если я ставлю код:
dataGrid.Rows.Clear()
dataGrid.Columns.Clear()
dt1 = GetData("SELECT * FROM CLAIMSTATE ")
dataGrid.DataSource = dt1
на конец метода событий RowLeave я Recive эту ошибку:
"Operation is not valid because it results in a reentrant call to the SetCurrentCellAddressCore function"
на dataGrid.Rows.Clear(), но если я удалить строку коды Rows.Clear() и Columns.Clear(), курсор отладки после выполнения dataGrid.DataSource = dt1 возвращаются к началу метода события, снова выполняют код и после получения некоторой ошибки «... реентерабельный вызов SetCurrentCellAddressCore функция "!
Помогите мне, пожалуйста!
В DataSource DataGridView отсутствуют методы Clear() и Add(). У кого-нибудь есть другие идеи, как я могу обновить datagridview? – wertyk
Я нашел эту страницу: http://stackoverflow.com/questions/2760657/failure-to-validate-but-cannot-remove-in-datagridview Как я могу написать это в vb.net: BeginInvoke (новое действие (delegate {dataGrid.DataSource = dt1;})); – wertyk
@wertyk Извините. GridView ... не ReportViewer. Я уточню вопрос для этого. –