Необходимо заполнить выпадающий список в Gridview, (несвязанный столбец) - PullRequest
3 голосов
/ 07 октября 2011

Мне трудно заполнить раскрывающийся список в моем виде сетки.Я создал столбец с кодом ниже:

  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

Проблема в том, что я не могу получить ручку форматирования, чтобы заполнить поле со списком нужным мне индексом.Вот мои попытки кода для списка DropFown 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 часов моего делима:

Прежде всего, знайте, что у меня есть два раскрывающихся списка в моей форме, один - 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 в качестве источников данных для вида сетки, но _query3 действительно работал для простых текстовых полей.2).При использовании _query3 в качестве источника gv.datas, почему мой комбобокс сгенерировал ошибку «bank_gp_field_name», не найденную, когда gv.Columns.Add (_comboCol) был выполнен 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

1 Ответ

0 голосов
/ 03 июля 2014

Извините, если я неправильно понял или слишком упростил это, но из того, что я понял, комбокс работает нормально, вы просто не можете установить индекс в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...