Значение ячейки VB.net возвращает DBNull

У меня есть DataGridView с пользовательской DataTable (не база данных SQL). где моя кодировка, как это

Sub Tabel()
        Tabel1 = New DataTable

        With Tabel1
            .Columns.Add("kodebarang")
            .Columns.Add("namabarang")
            .Columns.Add("satuan")
            .Columns.Add("harga", GetType(Double))
            .Columns.Add("jumlah", GetType(Integer))
            .Columns.Add("hargatotal", GetType(Double))
        End With

        DataGridView1.DataSource = Tabel1

        With DataGridView1
            .Columns(0).HeaderText = "ID"
            .Columns(1).HeaderText = "Item Name"
            .Columns(2).HeaderText = "Unit"
            .Columns(3).HeaderText = "Unit Price"
            .Columns(4).HeaderText = "Qty"
            .Columns(5).HeaderText = "Total Price"

            .Columns(3).DefaultCellStyle.Format = "###,###,###"
            .Columns(5).DefaultCellStyle.Format = "###,###,###"

            .Columns(1).ReadOnly = True
            .Columns(2).ReadOnly = True
            .Columns(3).ReadOnly = True
            .Columns(5).ReadOnly = True

            .Columns(3).DefaultCellStyle.BackColor = Color.LightBlue
            .Columns(4).DefaultCellStyle.BackColor = Color.LightGray

            .Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
            .Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .Columns(4).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns(5).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight

            .Columns(1).HeaderCell.Style.BackColor = Color.LightBlue

            .Columns(0).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns(1).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns(2).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns(3).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns(4).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns(5).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter

            .Columns(1).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
        End With

        For i = 0 To DataGridView1.Columns.Count - 1
            DataGridView1.Columns.Item(i).SortMode = DataGridViewColumnSortMode.Programmatic
        Next i
    End Sub

и я использую CellEndEdit для изменения значения ячейки сетки данных.

Private Sub DataGridView_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
        celWasEndEdit = DataGridView1(e.ColumnIndex, e.RowIndex)

        txtNamaBarang.Text = DataGridView1.Rows.Count - 1

        If e.ColumnIndex = 0 Then
            Call Connect()

            Sql = "SELECT * FROM databarang WHERE kodebarang='" & DataGridView1.CurrentRow.Cells(0).Value & "'"
            Cmd = New OdbcCommand(Sql, Con)
            Read = Cmd.ExecuteReader

            While Read.Read()
                DataGridView1.Rows(e.RowIndex).Cells(1).Value = Read("namabarang")
                DataGridView1.Rows(e.RowIndex).Cells(2).Value = Read("satuan")
                DataGridView1.Rows(e.RowIndex).Cells(3).Value = Read("hargapartai")
            End While
        ElseIf e.ColumnIndex = 4 Then
            Dim Quantity As Integer = DataGridView1.Rows(e.RowIndex).Cells(4).Value
            Dim UnitPrice As Integer = DataGridView1.Rows(e.RowIndex).Cells(3).Value

            Dim TotalPrice As Integer = Quantity * UnitPrice
            DataGridView1.Rows(e.RowIndex).Cells(5).Value = TotalPrice
        End If
    End Sub

Снимок экрана DataGridView

но я получил ошибку, когда я изменил значение столбца 4 (количество). Преобразование типа 'DBNull' в тип 'Integer' недопустимо., но если изменить мой код на

ElseIf e.ColumnIndex = 4 Then
            DataGridView1.Rows(e.RowIndex).Cells(3).Value, MsgBoxStyle.Information, "Error")
        End If

Я могу получить значение столбца 3 в MsgBox.


person GaroPpo    schedule 24.07.2020    source источник
comment
Чтобы использовать CellEndEdit, вы должны сначала использовать CellBeginEdit с этим вашим сценарием. Кроме того, если вы хотите отформатировать DataGridView, используйте CellFormatting   -  person evry1falls    schedule 24.07.2020
comment
Я понимаю. Значит, e.ColumnIndex = 4 должен быть внутри CellBeginEdit?   -  person GaroPpo    schedule 24.07.2020
comment
Нет, не то, что я имел в виду.   -  person evry1falls    schedule 24.07.2020
comment
Что ты вообще пытаешься сделать?   -  person evry1falls    schedule 24.07.2020
comment
Итак, у меня всего 6 столбцов, где: Column 0 = ID Number, Column 1 = Item Name, Column 2 = Unit, Column 3 = Unit Price, Column 4 = Quantity, Column 5 = Total Price. Что мне нужно сделать, это рассчитать Total Price Где, если пользователь введет число ini Column 4, значение Column 5 покажет результат Column 3 * Column 4. Я добавляю его на CellEndEdit, потому что я думал, что команда будет сгенерирована, когда будет EndEdit ячейка   -  person GaroPpo    schedule 24.07.2020
comment
И вы хотите сделать это, пока DataGridView привязан к базе данных?!   -  person evry1falls    schedule 24.07.2020
comment
Привязан к DataTable, а не к базе данных. Таким образом, сетка данных просто хранит данные, которые я ввожу, пока я не выполню их в базе данных. Таким образом, я могу добавлять, редактировать или удалять его, пока данные не будут в порядке.   -  person GaroPpo    schedule 25.07.2020


Ответы (1)


Вам не нужно делать ничего из этого, если ваш DataGridView привязан к DataTable; просто установите выражение для итогового столбца, которое вычисляет кратность двух других столбцов:

    Tabel1 = New DataTable

    With Tabel1
        .Columns.Add("kodebarang")
        .Columns.Add("namabarang")
        .Columns.Add("satuan")
        .Columns.Add("harga", GetType(Double))
        .Columns.Add("jumlah", GetType(Integer))
        Dim dc = .Columns.Add("hargatotal", GetType(Double))   ''changed line
        dc.Expression = "[harga] * [jumlah]"                   ''new line
    End With

    DataGridView1.DataSource = Tabel1

В соответствующей заметке вы не должны получать доступ к данным через datagridview; данные находятся в datatable и должны быть доступны оттуда, а не через элемент управления, который их отображает

person Caius Jard    schedule 24.07.2020
comment
Работает отлично. Спасибо за ответ и совет. действительно ценю это. - person GaroPpo; 25.07.2020
comment
Можно ли получить сумму hargatotal для label.text? Я использовал CellValueChanged, но он работает только после того, как я добавлю 2 строки в datagridview, а метка суммирует только значение первой строки. не включать общее значение строки 2. Если я добавлю строку №. 3 он будет суммировать hargatotal Row 1 и Row 2 - person GaroPpo; 22.11.2020
comment
Просто привяжите текст метки к этому столбцу таблицы данных. Или, если вы имеете в виду, что метка должна показывать сумму всех строк, добавьте еще один столбец в таблицу данных, установите для свойства .Expression значение SUM([hargatotal]) или SUM([harga] * [jumlah]), а затем привяжите метку к этому новому столбцу. Вы продолжаете думать о данных с точки зрения элементов управления пользовательского интерфейса; вы должны думать об этом с точки зрения данных, в которых живут данные. - person Caius Jard; 23.11.2020
comment
Я уже привязал его к метке, но он работает, только если я добавляю более 1 столбца. Если добавлена ​​строка 1, метка не покажет сумму, но если я добавлю строку 2, она суммирует столбец HargaTotal, но только строку HargaTotal 1. Если добавлена ​​1 строка, она не будет суммировать HargaTotal. Если добавлена ​​2 строка, будет суммирована только строка 1 HargaTotal. Если добавлено 3 строки, будет суммирована только строка 1 + строка 2 HargaTotal. - person GaroPpo; 23.11.2020
comment
Я попробовал этот код CellValueChanged Dim sum As Integer = Convert.ToInt32(DataTabel.Compute("SUM(HargaTotal)", String.Empty)) lblGrandTotal.Text = sum - person GaroPpo; 23.11.2020
comment
У меня есть сомнения, что это было сделано так, как я говорю: создать новый столбец, установить его выражение в виде суммы, привязать к нему метку. Если вы сделали это с CellValueChanged, это не привязка данных. Если вы сделали это с помощью Compute, это не свойство Expression. - person Caius Jard; 23.11.2020