2011-10-07 79 views
3

我在填充GridView中的下拉列表时遇到困难。 我创建了列与下面的代码:需要在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

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

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

这是我如何将它拉下来。我希望有人从我的delima最后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能够在标准绑定上运行。我仍然得到了“字段名为”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 

回答

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