【问题标题】:Need to populate a Dropdown combo box in Gridview, (unbound column)需要在 Gridview 中填充 Dropdown 组合框,(未绑定列)
【发布时间】:2011-12-03 03:07:39
【问题描述】:

我在网格视图中填充下拉列表时遇到了困难。 我使用以下代码创建了列:

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

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

我永远无法让 ComboBox 绑定到数据源。我尝试了一切,直到我变蓝。所以我去了基础知识并编码了所有自动的东西。我很好奇为什么自动绑定不起作用。也许是因为我的 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_gp_field_name" not found 错误 3)。我理解我无法将 gv 绑定到 _query3 的原因,因为 Bank_Bank_field_number 中的数据是整数,而 DDL 值在整数和字符串值之间没有转换。但是我注释掉了期望 GPField 在标准绑定上运行的字段。我仍然得到“名为“Bank_GP_Field_Name”的字段在 gv.Columns.Add(_comboCol) 上不存在

所以,总结一下,为什么下面的代码不起作用而上面的代码起作用?

    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

【问题讨论】:

    标签: vb.net winforms datagridview drop-down-menu


    【解决方案1】:

    对不起,如果我误解或过度简化了这一点,但据我所知,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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      相关资源
      最近更新 更多