【问题标题】:checkbox from datagridview to textbox从datagridview到文本框的复选框
【发布时间】:2011-11-03 18:00:49
【问题描述】:

一个新问题!

我在 datagridview 中有一个复选框列,还有一个名为“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

【问题讨论】:

    标签: vb.net datagridview checkbox textbox


    【解决方案1】:

    你的第一个问题是你想把苹果和橙子加在一起。

    行内:

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

    totalSum 是一个整数,而 DataGridView 单元格的 Value 属性是 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)
    

    最后要注意的一点是,如果您尝试在 DataGridView 的 cellclick 方法中执行此代码,您将遇到问题 - 复选框状态直到 cellclick 之后才提交,因此最近检查的单元格不会得到添加到您的计数中。相反,您需要处理 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 中它似乎并没有真正起作用 - 但我更像是一个 c# 开发人员,所以我可能会遗漏一些东西)。

    相反,你想要:

    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
    

    【讨论】:

    • 好吧,我把这段代码放在按钮点击事件中。我也是第一次尝试 vb.net,所以谢谢你的所有解释。它有助于更​​新自我。我试试这个并很快恢复..再次感谢! :)
    • 嘿..这似乎对我不起作用..我正在使用此代码并尝试将其放在按钮单击事件中进行一些修改!你能帮我修改我的代码吗?我发布的代码的第二部分是我正在使用的!谢谢你.. :)
    • @Ruchi22 很高兴你有一些工作 - 我的答案最终对你有用,请将其标记为已接受,如果没有,请将其作为答案发布,以便其他人可以使用它。
    【解决方案2】:

    这是有效的代码..

    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
    

    感谢您的帮助! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2015-06-28
      • 2012-10-17
      • 1970-01-01
      相关资源
      最近更新 更多