天天看点

DataGridView中Combobox的数据类型匹配

DataGridView中Combobox的数据类型匹配

假如Combobox中设置的时候的数据类型时int32,DataGridView显示是匹配的数据是double型的,显示时就会报错。

解决方法:

1。匹配时作判断(MaxID是要匹配的数据,默认是int32)

                If dgvMaster.Rows(0).Cells(0).Value.GetType.Name = "Double" Then

                    dgvMaster.Rows.Add(CType(MaxID, Double), "")

                    dgvMaster.Rows(dgvMaster.Rows.Count - 1).Cells(j).Value = CType(MaxOrder, Double)

                ElseIf dgvMaster.Rows(0).Cells(0).Value.GetType.Name = "Short" Then

                    dgvMaster.Rows.Add(CType(MaxID, Short), "")

                    dgvMaster.Rows(dgvMaster.Rows.Count - 1).Cells(j).Value = CType(MaxOrder, Short)

                Else

                    dgvMaster.Rows.Add(MaxID, "")

                    dgvMaster.Rows(dgvMaster.Rows.Count - 1).Cells(j).Value = MaxOrder

                End If 

2。根据要匹配的数据类型进行设置

Call SetGridComboBoxEx(dgv_3, "SELECT CAST(COD AS NUMBER(3,0)) AS COD,NAM FROM MZZT001 WHERE KBN = 'X0162' ORDER BY DSP_SEQ", "COD", "NAM", "方向", "System.Int16")

dgvContainer :DataGridView名字

strSQL :Combobox中设置数据的查询

strValueMember :sql查询中,最为数据的字段

strDispMember :sql查询中,最为显示的字段

strColumnName :DataGridView中,显示为Combobox的列

strType :要设置的数据类型

Public Shared Function SetGridComboBoxEx(ByVal dgvContainer As Windows.Forms.DataGridView, ByVal strSQL As String, ByVal strValueMember As String, ByVal strDispMember As String, ByVal strColumnName As String, ByVal strType As String) As Boolean

        Dim tblDataSource As DataTable

        Dim dgcmb As New Windows.Forms.DataGridViewComboBoxColumn

        Dim bFlag As Boolean = False

        Try

            '取得列的Combobox对象

            For i As Integer = 0 To dgvContainer.Columns.Count - 1

                If dgvContainer.Columns(i).HeaderText = strColumnName Then

                    dgcmb = dgvContainer.Columns(i)

                    bFlag = True

                    Exit For

                End If

            Next

            If bFlag = False Then

                Return False

            End If

            tblDataSource = clsDBBase.dataTable(strSQL)

            If tblDataSource Is Nothing Then

                tblDataSource = New DataTable

                tblDataSource.Columns.Add(strValueMember, System.Type.GetType(strType))

                tblDataSource.Columns.Add(strDispMember)

            End If

            tblDataSource.Rows.InsertAt(tblDataSource.NewRow(), 0)

            tblDataSource.Rows(0).Item(strValueMember) = 0

            tblDataSource.Rows(0).Item(strDispMember) = DBNull.Value

            '数据绑定

            dgcmb.DisplayMember = strDispMember

            dgcmb.ValueMember = strValueMember

            dgcmb.DataSource = tblDataSource

            Return True

        Catch ex As Exception

            Return False

        End Try

    End Function

3。CellParsing事件(假设应该是Double型)

Private Sub dgvMaster_CellParsing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellParsingEventArgs) Handles dgvMaster.CellParsing

        Try

            If (e.Value Is Nothing) Or (e.Value Is DBNull.Value) Or (e.Value = "") Then

                    e.Value = Convert.ToDouble("0")

                Else

                    e.Value = Convert.ToDouble(e.Value)

                End If

                e.ParsingApplied = True

            End If

        Catch ex As Exception

             End Try

    End Sub

4。DataError事件(适用于原来有此combobox选项,后来被删除了,但是,以前的数据中,combobox可能还有此选项纪录遗留)

Private Sub dgvMaster_CellValidating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles dgvMaster.CellValidating

        Dim dgvTem As DataGridView = sender

        Try

            dgvTem.Rows(e.RowIndex).Cells(e.ColumnIndex).ErrorText = ""

        Catch ex As Exception

        End Try

    End Sub

Private Sub DataGridView_DataError(ByVal sender As System.Object, _

            ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles dgvMaster.DataError

        Try

            Call DataGridViewComboBoxCellDataErrorHandler(sender, e)

        Catch ex As Exception

        End Try

    End Sub

Public Shared Sub DataGridViewComboBoxCellDataErrorHandler(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs)

        Try

            Dim lDgv As Windows.Forms.DataGridView = sender

            If lDgv.Columns(e.ColumnIndex).CellType.Name = "DataGridViewComboBoxCell" Then

                If lDgv.Rows(e.RowIndex).Cells(e.ColumnIndex).ValueType.Equals(Type.GetType("System.String")) Then

                    If IsNumeric(lDgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value.ToString) Then

                        lDgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = CInt(lDgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value.ToString)

                    End If

                Else

                    lDgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = lDgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value.ToString

                End If

                lDgv.Rows(e.RowIndex).Cells(e.ColumnIndex).ErrorText = "此项已删除"

            Else

                e.ThrowException = True

            End If

        Catch ex As Exception

        End Try

    End Sub