Vb.net 需要在Gridview中填充下拉组合框(未绑定列)

Vb.net 需要在Gridview中填充下拉组合框(未绑定列),vb.net,winforms,datagridview,drop-down-menu,Vb.net,Winforms,Datagridview,Drop Down Menu,在gridview中填充下拉列表时遇到困难。 我已使用以下代码创建了该列: If Not Me.GridViewIsConstructed Then gv.Columns.Add(createComboBoxWithDDL(Me.ddlGPField.Items, "Bank_GP_Field_Name", "GPField")) gv.Columns.Add(createComboBoxWithDDL(Me.ddlBankField.Item

在gridview中填充下拉列表时遇到困难。 我已使用以下代码创建了该列:

  If Not Me.GridViewIsConstructed Then
            gv.Columns.Add(createComboBoxWithDDL(Me.ddlGPField.Items, "Bank_GP_Field_Name", "GPField"))
            gv.Columns.Add(createComboBoxWithDDL(Me.ddlBankField.Items, "Bank_Bank_Field_Name", "BankField"))
  End IF


  Private Function createComboBoxWithDDL(ByVal obj As Object, ByVal nDataFieldName As String, ByVal nColName As String) As DataGridViewComboBoxColumn
        Dim combo As New DataGridViewComboBoxColumn
        combo.DataSource = obj
        combo.DataPropertyName = nDataFieldName
        combo.Name = nColName
        Return combo
    End Function
问题是我无法获得格式化句柄,无法用所需的索引填充组合框。这是我对BankField下拉列表的代码尝试

If e.ColumnIndex = gv.Columns("BankField").Index Then
    e.FormattingApplied = True
    Dim _row = gv.Rows(e.RowIndex)
    Dim _cell As New DataGridViewComboBoxColumn
    fillGPFieldList(_cell)
    _cell.DisplayIndex = 1
    _cell.DisplayMember = "Credit"
    _cell.ValueMember = "Credit"
    _cell.DataSource = _cell.Items
    e.Value = _cell

End If
If e.ColumnIndex = gv.Columns("TrxType").Index Then
    e.FormattingApplied = True
    e.Value = "BAL"
End If
Gridview可以很好地显示下拉对象,它总是设置为索引-1

请帮忙

V***********附录编辑

不幸的是,没有人回答我的问题。所以我解决了整个问题。这很难看,如果有任何反馈,我将不胜感激

我始终无法将组合框绑定到数据源。我什么都试了,直到我脸色发青。所以我开始做一些基本的工作,对所有的自动代码进行编码。我很好奇为什么自动装订不起作用。可能是因为我的gridview数据源是LINQ

这是我如何做到的。我希望有人能从我最后48小时的delima中获益:

首先,要知道我的表单上有两个下拉列表,一个是GPField,另一个是BankField。这些是已填充的静态DDL。所以我用它们来欺骗值,而不是使用枚举

我认为这无关紧要,但以下是我如何填写GPField和BankField:

      Sub fillGPFieldListDDL(ByVal obj As Object)
            Dim db As New CompanyDataDataContext
            Dim myConn As New Connection With {.ConnCls = ConnCls}
            myConn.dbConnect(db)
            'Setup the GP Field list
            obj.Items.Clear()
            For Each fld In db.getGPFieldList(Me.ddlImportID.SelectedItem, ddlImportTypes.BNKREC_IMPORTS_WORK)
                obj.Items.Add(fld.Trim)
            Next
            db.Connection.Close()
            db.Connection.Dispose()
            db.Dispose()
        End Sub
        Sub fillBankFieldListDDL(ByVal obj As Object)
            If String.IsNullOrEmpty(ddlImportID.Text) Then
                Return
            End If
            Dim db As New CompanyDataDataContext
            Dim myConn As New Connection With {.ConnCls = ConnCls}
            myConn.dbConnect(db)
            'Setup the Bank Field list
            obj.Items.Clear()
            For Each fld In db.getImportIDVirtualFields(Me.ddlImportID.Text, ddlImportTypes.BNKREC_IMPORTS_WORK)
                obj.Items.Add(fld.Trim)
            Next
            db.Connection.Close()
            db.Connection.Dispose()
            db.Dispose()
        End Sub
接下来,根据用户的选择,我使用以下函数填充网格:

    Function fillToleranceFieldsGridView(ByVal nTrxType As String) As Integer
    Dim myConn As New Connection With {.ConnCls = ConnCls}
    Try
        Using db As New CompanyDataDataContext
            myConn.dbConnect(db)
            'Dim _query As IEnumerable(Of TWO_Tolerance_Field) = (From tf In db.getToleranceSetupRecordFields(nTrxType, BankToleranceRecordTypes.MasterRecord) _
            '             Select tf)
            'Dim _query2 As IEnumerable(Of TWO_Tolerance_Field) = db.getToleranceSetupRecordFields(nTrxType, BankToleranceRecordTypes.MasterRecord)
            Dim _query3 = (From t In db.TWO_Tolerance_Fields _
                           Where t.TRXTYPESTRING = nTrxType And t.RCRDTYPE = BankToleranceRecordTypes.MasterRecord _
                           Select t.Bank_Bank_Field_Number, t.Bank_GP_Field_Name, t.TRXTYPESTRING)

            Dim gv = Me.DataGridViewX1
            gv.AutoGenerateColumns = False
            gv.AllowUserToAddRows = False
            gv.AllowUserToDeleteRows = False
            gv.AllowUserToResizeRows = False
            gv.AutoSize = True
            gv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells

            'gv.DataSource = _query3

            If Not Me.GridViewIsConstructed Then

                'Add in the combo box for GPField Names
                Dim _comboCol As DataGridViewComboBoxColumn
                _comboCol = CreateComboBoxColumn(Me.ddlGPField.Items, _
                                                 ColumnNameData.Bank_GP_Field_Name.ToString, _
                                                 FieldNames.GPField.ToString)

                gv.Columns.Add(_comboCol)

                _comboCol = CreateComboBoxColumn(Me.ddlBankField.Items, _
                                                  ColumnNameData.Bank_Bank_Field_Number.ToString, _
                                                  FieldNames.BankField.ToString)

                gv.Columns.Add(_comboCol)

                Dim col As DataGridViewColumn = _
                    New DataGridViewTextBoxColumn()

                Dim _cell = New DataGridViewTextBoxCell
                Dim _coll = New DataGridViewColumn(_cell)
                Dim _colIndex As Integer = 0

                ''Bind to an existing column Left in for easy access for a simple text box
                '_coll = New DataGridViewColumn(_cell)
                '_coll.Name = ColumnNameData.Bank_GP_Field_Name.ToString
                '_coll.ReadOnly = True
                '_coll.HeaderText = ColumnNameData.Bank_GP_Field_Name.ToString
                '_colIndex = gv.Columns.Add(_coll)
                'gv.Columns(_colIndex).DataPropertyName = ColumnNameData.Bank_GP_Field_Name.ToString

                Me.GridViewIsConstructed = True
            End If

            gv.Rows.Clear()
            Dim ri As Integer = 0
            For Each r In _query3
                Dim _row As New DataGridViewRow
                _row.CreateCells(gv)
                _row.Cells(FieldNames.GPField).Value = r.Bank_GP_Field_Name.ToString.Trim
                _row.Cells(FieldNames.BankField).Value = ddlBankField.Items(r.Bank_Bank_Field_Number - 1).ToString.Trim
                gv.Rows.Add(_row)
                ri += 1
            Next
            db.Connection.Close()
            db.Connection.Dispose()
        End Using
        Return 0
    Catch ex As Exception
        Throw ex
    Finally
        myConn.Dispose()
    End Try
End Function
因此,未回答的问题是: 1). 我不能使用_query或_query2作为gridview的数据源,但是_query3可以用于简单的文本框。 2). 如果使用_query3作为gv.datasource,为什么在执行gv.Columns.Add(_comboCol)时,我的组合框会抛出“bank\u gp\u field\u name”not found错误 3). 我理解我无法将gv绑定到_query3的原因,因为Bank_Bank_字段_number中的数据是一个整数,并且DDL值在整数和字符串值之间没有转换。但我指出,该字段期望GPField在标准绑定上运行。我仍然发现gv.Columns.Add(\u comboCol)上不存在名为“Bank\u GP\u Field\u Name”的字段

总之,为什么下面的代码不能工作而上面的代码却可以

    Function fillToleranceFieldsGridView(ByVal nTrxType As String) As Integer
    Dim myConn As New Connection With {.ConnCls = ConnCls}
    Try
        Using db As New CompanyDataDataContext
            myConn.dbConnect(db)
            'Dim _query As IEnumerable(Of TWO_Tolerance_Field) = (From tf In db.getToleranceSetupRecordFields(nTrxType, BankToleranceRecordTypes.MasterRecord) _
            '             Select tf)
            'Dim _query2 As IEnumerable(Of TWO_Tolerance_Field) = db.getToleranceSetupRecordFields(nTrxType, BankToleranceRecordTypes.MasterRecord)
            Dim _query3 = (From t In db.TWO_Tolerance_Fields _
                           Where t.TRXTYPESTRING = nTrxType And t.RCRDTYPE = BankToleranceRecordTypes.MasterRecord _
                           Select t.Bank_Bank_Field_Number, t.Bank_GP_Field_Name, t.TRXTYPESTRING)

            Dim gv = Me.DataGridViewX1
            gv.AutoGenerateColumns = False
            gv.AllowUserToAddRows = False
            gv.AllowUserToDeleteRows = False
            gv.AllowUserToResizeRows = False
            gv.AutoSize = True
            gv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells

            gv.DataSource = _query3

            If Not Me.GridViewIsConstructed Then

                'Add in the combo box for GPField Names
                Dim _comboCol As DataGridViewComboBoxColumn
                _comboCol = CreateComboBoxColumn(Me.ddlGPField.Items, _
                                                 ColumnNameData.Bank_GP_Field_Name.ToString, _
                                                 FieldNames.GPField.ToString)

                gv.Columns.Add(_comboCol)

                '_comboCol = CreateComboBoxColumn(Me.ddlBankField.Items, _
                '                                  ColumnNameData.Bank_Bank_Field_Number.ToString, _
                '                                  FieldNames.BankField.ToString)

                'gv.Columns.Add(_comboCol)

                Dim col As DataGridViewColumn = _
                    New DataGridViewTextBoxColumn()

                Dim _cell = New DataGridViewTextBoxCell
                Dim _coll = New DataGridViewColumn(_cell)
                Dim _colIndex As Integer = 0

                ''Bind to an existing column Left in for easy access for a simple text box
                '_coll = New DataGridViewColumn(_cell)
                '_coll.Name = ColumnNameData.Bank_GP_Field_Name.ToString
                '_coll.ReadOnly = True
                '_coll.HeaderText = ColumnNameData.Bank_GP_Field_Name.ToString
                '_colIndex = gv.Columns.Add(_coll)
                'gv.Columns(_colIndex).DataPropertyName = ColumnNameData.Bank_GP_Field_Name.ToString

                Me.GridViewIsConstructed = True
            End If

            'gv.Rows.Clear()
            'Dim ri As Integer = 0
            'For Each r In _query3
            '    Dim _row As New DataGridViewRow
            '    _row.CreateCells(gv)
            '    _row.Cells(FieldNames.GPField).Value = r.Bank_GP_Field_Name.ToString.Trim
            '    _row.Cells(FieldNames.BankField).Value = ddlBankField.Items(r.Bank_Bank_Field_Number - 1).ToString.Trim
            '    gv.Rows.Add(_row)
            '    ri += 1
            'Next
            db.Connection.Close()
            db.Connection.Dispose()
        End Using
        Return 0
    Catch ex As Exception
        Throw ex
    Finally
        myConn.Dispose()
    End Try
End Function

Private Function CreateComboBoxColumn(ByVal obj As ComboBox.ObjectCollection, ByVal nDataFieldName As String, ByVal nColName As String) _
 As DataGridViewComboBoxColumn

    Dim column As New DataGridViewComboBoxColumn()
    With (column)
        .HeaderText = nColName
        .DropDownWidth = 160
        .Width = 90
        .MaxDropDownItems = 3
        .FlatStyle = FlatStyle.Flat
        .DataSource = obj
        .DataPropertyName = nDataFieldName
        .Name = nColName
        .ValueMember = nDataFieldName
        .DisplayMember = .ValueMember
    End With
    Return column
End Function

很抱歉,如果我误解或过度简化了这一点,但据我所知,combox绑定良好,您不能将索引设置为1?这是因为该单元格没有基础数据吗

您是否尝试过设置列的默认值?据我所知,DataGridViewComboxColumn没有单元格默认值,但可以使用列默认值

Columns(“ColumName”).DefaultValue=1

您也可以尝试处理所需的
defaultvalues

Private Sub gv_DefaultValuesNeeded(ByVal sender As Object, _
    ByVal e As System.Windows.Forms.DataGridViewRowEventArgs) _
    Handles gv.DefaultValuesNeeded

    With e.Row
        .Cells("GPField") = 1
        .Cells("BankField") = 1
    End With 

End Sub