Как обновить dataGridView - PullRequest
       16

Как обновить dataGridView

0 голосов
/ 31 января 2012

У меня проблема с обновлением элемента управления DataGridView после Insert или Update. Исходный код:

Получить все строки из таблицы в datatable и установить для источника данных:

Dim dt1 as DataTable = GetData("SELECT * FROM CLAIMSTATE ")
dataGrid.DataSource = dt1

Обновить событие, если значение 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 Я получаю эту ошибку:

"Операция недопустима, поскольку она приводит к повторному вызову Функция SetCurrentCellAddressCore "

для dataGrid.Rows.Clear (), но если я удалю строковые коды Rows.Clear () и Columns.Clear (), курсор отладки после execute dataGrid.DataSource = dt1 вернется в начало метода события и выполнит несколько код снова и после того, как я получаю некоторую ошибку "... повторный вход в функцию SetCurrentCellAddressCore"!

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

Ответы [ 2 ]

0 голосов
/ 13 февраля 2012

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

0 голосов
/ 31 января 2012

Вот класс 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();
    }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...