需要填充Gridview中的Dropdown组合框,(未绑定列)

时间:2011-10-07 15:47:27

标签: 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.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 DropDown List的代码尝试。

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 *的 * ** * ** * *** 附录编辑 ** * ** * **** * V < / p>

不幸的是,没有人回答我的问题。所以我解决了整个问题。它很难看,我非常感谢任何反馈。

我无法将ComboBox绑定到数据源。我尝试了一切,直到我变成蓝色。所以我去了基础知识并编写了所有自动内容。我很好奇为什么自动绑定不起作用。也许是因为我的gridview数据源是LINQ。

以下是我如何将其取消。我希望有人能在过去的48小时内获益:

首先,知道我的表单上有两个下拉列表,一个是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_gp_field_name”错误 3)。我理解我无法对_query3进行gv绑定的原因,因为Bank_Bank_field_number中的数据是一个整数,并且DDL值没有整数和字符串值之间的转换。但我注意到该字段期望GPField在标准绑定上运行。我仍然在gv.Columns.Add(_comboCol)上不存在“字段调用”Bank_GP_Field_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

1 个答案:

答案 0 :(得分:0)

很抱歉,如果我误解或过度简化了这个,但是根据我收集的内容,combox绑定正常,你只能将索引设置为1?这是因为该单元格没有基础数据吗?

您是否尝试过设置列的默认值?从我读过的内容来看,DataGridViewComboBoxColumn没有单元格DefaultValue,但可以使用默认列。

Columns("ColumName").DefaultValue = 1

http://msdn.microsoft.com/en-us/library/system.data.datacolumn.defaultvalue.aspx

您也可以尝试处理DefaultValuesNeeded

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

http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.defaultvaluesneeded(v=vs.110).aspx