2012-01-31 2 views
0

У меня проблема с обновлением элемента управления 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 функция "!

Помогите мне, пожалуйста!

ответ

0

Для решения этой проблемы я использую OdbcDataAdapter. Я сохраняю все изменения с помощью адаптера.Update (dataTable) и после того, как я снова заново заполняю datatable: adapter.fill (dataTable).

0

Вот класс C#, который у меня есть, чтобы использовать поиск в моем GridView. То, что вам нужно, должно быть похоже, я бы подумал.

protected void lbSearch_Click(object sender, EventArgs e) 
    { 
     if (txtSearch.Text.Trim().Length > 0) 
     { 
      odsInbox.FilterExpression = 
       string.Format("(l_name LIKE '*{0}*') OR (f_name LIKE '*{0}*') OR (title LIKE '*{0}*')", 
       txtSearch.Text); 
     } 
     else 
     { 
      odsInbox.FilterExpression = string.Empty; 
     } 

     gvInbox.DataBind(); 
    } 

    protected void lbClear_Click(object sender, EventArgs e) 
    { 
     odsInbox.FilterExpression = string.Empty; 
     txtSearch.Text = ""; 
     gvInbox.DataBind(); 
    } 

Надеюсь, это поможет вам на правильном пути.

+0

В DataSource DataGridView отсутствуют методы Clear() и Add(). У кого-нибудь есть другие идеи, как я могу обновить datagridview? – wertyk

+1

Я нашел эту страницу: http://stackoverflow.com/questions/2760657/failure-to-validate-but-cannot-remove-in-datagridview Как я могу написать это в vb.net: BeginInvoke (новое действие (delegate {dataGrid.DataSource = dt1;})); – wertyk

+0

@wertyk Извините. GridView ... не ReportViewer. Я уточню вопрос для этого. –

Смежные вопросы