флажок из таблицы данных в текстовое поле - PullRequest
0 голосов
/ 01 ноября 2011

Новый выпуск !!

У меня есть столбец флажка в представлении данных, а также столбец с именем "partqty", который отображает количество доступных материалов. Я хотел бы, чтобы, когда пользователь проверяет флажок, количество проверенных строк было добавлено и отображено в текстовом поле ..

Я устал что-то вроде этого .. Но он отображает 0 (ноль) в текстовом поле .. Пожалуйста, помогите ..

Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click

        'For Each _rw As DataGridViewRow In dataGridView1.Rows
        '    If _rw.Cells(0).Value = True Then

        Dim totalSum As Integer

        For i As Integer = 0 To HemDatabase1DataSet5.Tables(0).Rows.Count - 1
            totalSum += HemDatabase1DataSet5.Tables(0).Rows(i).Item("partqty")
        Next

        textBox5.Text = totalSum.ToString()
        '    End If
        'Next
    End Sub

Привет !! Это то, что я мог подумать, пытаясь! однако во время компиляции ошибки нет, но есть ошибка во время выполнения, которая говорит: Оператор '+' не определен для типа 'DBNull' и типа 'Boolean'

Вот код, который я попробовал:

For Each _rw As DataGridViewRow In dataGridView1.Rows
            If _rw.Cells(0).Value = True Then

                Dim totalSum As Integer

                For i As Integer = 0 To dataGridView1.Rows.Count - 1
                    totalSum += dataGridView1.Rows(i).Cells(5).Value
                Next

                textBox5.Text = totalSum.ToString()
            End If
        Next

В этой строке выдается ошибка:

totalSum += dataGridView1.Rows(i).Cells(5).Value

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

Первая проблема заключается в том, что вы пытаетесь добавить яблоки и апельсины вместе.

В строке:

totalSum += dataGridView1.Rows(i).Cells(5).Value 

totalSum - целое число, а свойство Value ячейки DataGridView -типа object.

Эта проблема аналогична той, которую вы видите, пытаясь использовать DataTable, за исключением того, что ваше свойство Item дает вам DBNull, а не объект обратно.

Здесьэто код, который вы хотите (я в основном разработчик C #, поэтому VB.Net может не хватать элегантности, но он работает).

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim sum As Integer
    sum = 0

    For Each row As DataGridViewRow In DataGridView1.Rows
        Dim current As Integer

        If Integer.TryParse(row.Cells("OrderQty").Value.ToString, current) Then
            sum += current
        End If
    Next
    TextBox1.Text = sum.ToString
End Sub

Некоторые вещи, которые стоит отметить в этом коде:

  • Я использую For Each, а не for.Они работают в основном одинаково, но я нахожу foreach более читабельным
  • Я использую Integer.TryParse для значения ячейки перед его использованием.Это безопаснее, чем просто приводить значение ячейки напрямую.
  • Вместо того, чтобы использовать индексы столбцов, которые немного хрупки, я использую имена столбцов.

С вашей проверкой, установлен ли флажокпроверено, что вы можете сделать что-то похожее:

Boolean.TryParse(row.Cells("IsChecked").Value.ToString, cb)

И последнее замечание: если вы попытаетесь выполнить этот код в методе cellclick объекта DataGridView, у вас возникнут проблемы - состояние флажкане фиксируется до тех пор, пока не будет нажата ячейка, поэтому последняя проверенная ячейка не будет добавлена ​​в ваш счетчик.Вместо этого вы захотите обработать CellDirtyStateChanged и зафиксировать изменения, а затем выполнить суммирование в обработчике CellValueChanged.

Чтобы проиллюстрировать, что попробуйте этот код:

Private Sub dgv_CellContentClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
    Dim sum As Integer
    sum = 0

    Dim cb As Boolean
    cb = False

    If DataGridView1.Columns(e.ColumnIndex).Name <> "IsChecked" Then
        Return
    End If


    For Each row As DataGridViewRow In DataGridView1.Rows
        If Boolean.TryParse(row.Cells("IsChecked").Value.ToString, cb) Then
            If cb Then
                Dim current As Integer

                If Integer.TryParse(row.Cells("OrderQty").Value.ToString, current) Then
                    sum += current
                End If
            End If
        End If
    Next
    TextBox1.Text = sum.ToString
End Sub

Сумма всегда будет отставать на единицущелкните позади (на самом деле в VB.Net он, кажется, просто не работает), но я больше ac # dev, чтобы я мог что-то упустить).

Вместо этого вы хотите:

Sub dataGridView1_CurrentCellDirtyStateChanged( _
    ByVal sender As Object, ByVal e As EventArgs) _
    Handles DataGridView1.CurrentCellDirtyStateChanged

    If DataGridView1.IsCurrentCellDirty Then
        DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
    End If
End Sub

' If a check box cell is clicked, this event handler disables  
' or enables the button in the same row as the clicked cell.
Public Sub dataGridView1_CellValueChanged(ByVal sender As Object, _
    ByVal e As DataGridViewCellEventArgs) _
    Handles DataGridView1.CellValueChanged

    If DataGridView1.Columns(e.ColumnIndex).Name = "IsChecked" Then
        Dim sum As Integer
        sum = 0

        Dim cb As Boolean



        For Each row As DataGridViewRow In DataGridView1.Rows
            If Boolean.TryParse(row.Cells("IsChecked").Value.ToString, cb) Then
                If cb Then
                    Dim current As Integer

                    If Integer.TryParse(row.Cells("OrderQty").Value.ToString, current) Then
                        sum += current
                    End If
                End If
            End If
        Next
        TextBox1.Text = sum.ToString
    End If
End Sub
0 голосов
/ 03 ноября 2011

Это код, который работал ..

Dim iSselected As Boolean
        Dim CurrentCellValue As String
        Dim CumulativeSummer As Integer
        Dim i As Integer

        With Me.dataGridView1
            For i = 0 To .RowCount - 1
                iSselected = .Rows(i).Cells(0).Value
                CurrentCellValue = .Rows(i).Cells(5).Value
                If CurrentCellValue = "" Then CurrentCellValue = 0

                If iSselected = True Then
                    CumulativeSummer += Convert.ToInt32(CurrentCellValue)
                End If
            Next
        End With

        Me.textBox5.Text = CumulativeSummer

Спасибо тебе за помощь !! :)

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