SQL Обновление не работает после использования SQL для построения столбцов в связанном DataGridView-VB - PullRequest
0 голосов
/ 04 февраля 2020

Я использую формы VB Windows с элементом управления DataGridView с привязкой к данным. Используя Access, у меня есть таблица «Customers», и я использую команды SQL для заполнения выбранных полей в DataGridView. ПРОБЛЕМА: у меня есть поле «Активное» с 1 для активного и 0 для неактивного. В окне DataGridView мне нужно изменить столбец «Активный», чтобы отображать Y для активного и N для неактивного (без изменения базовых данных). Я попытался использовать команду UPDATE без успеха. После первых команд SQL для заполнения DataGridView я не уверен, как кодировать вторую команду SQL для изменения столбца «Активный».

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Подумав об этом дальше, я бы посоветовал вам использовать столбец со списком, а не столбец с текстовым полем. Таким образом, пользователь не сможет ввести недопустимое значение, поскольку ему нужно выбрать «Y» или «N» из выпадающего списка.

A DataGridView никогда не создаст поле со списком Колонка для вас, хотя, так что вам нужно добавить один самостоятельно. Вы можете сделать это в коде, но я бы посоветовал вам сделать это в конструкторе. В любом случае вам нужно установить для свойства DataPropertyName столбца сетки имя столбца источника данных (в вашем случае «Активный»), чтобы он правильно связывался. См. Мое руководство по добавлению столбца со списком в конструкторе здесь .

Когда у вас есть столбец со списком, вам необходимо связать выпадающие элементы. В вашем случае вы можете сделать это:

Dim activeOptions = {New With {.Text = "Y", .Value = 1},
                     New With {.Text = "N", .Value = 0}}

With activeColumn
    .DisplayMember = "Text"
    .ValueMember = "Value"
    .DataSource = activeOptions
End With

Это следует сделать до того, как вы установите DataSource сетки. Этот код создает массив объектов анонимного типа, где значения Text - это то, что отображается в раскрывающемся списке, а значения Value соответствуют значениям ячеек из источника данных сетки.

0 голосов
/ 04 февраля 2020

Ничего не делай в SQL. Сетка может обработать это для вас, с небольшим количеством кода. Вам нужно обработать события CellFormatting и CellParsing сетки и сначала подтвердить, что это тот столбец. При форматировании вы конвертируете из 1 и 0 в «Y» и «N» соответственно, а при анализе вы делаете обратное. Например,

Private activeColumnIndex As Integer 'Set column index as appropriate.

Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    If e.ColumnIndex = activeColumnIndex Then
        Select Case CInt(e.Value)
            Case 0
                e.Value = "N"
            Case 1
                e.Value = "Y"
        End Select

        e.FormattingApplied = True
    End If
End Sub

Private Sub DataGridView1_CellParsing(sender As Object, e As DataGridViewCellParsingEventArgs) Handles DataGridView1.CellParsing
    If e.ColumnIndex = activeColumnIndex Then
        Select Case CStr(e.Value)
            Case "N"
                e.Value = 0
            Case "Y"
                e.Value = 1
        End Select

        e.ParsingApplied = True
    End If
End Sub

Обратите внимание, что этот код не учитывает значения NULL или неверный ввод. Это выходит за рамки и зависит от вас.

...