none
Как привязать Combobox к ячейке DataGridView ? RRS feed

  • Вопрос

  • VS-2010, язык VB.NET, WinForm, база данных access
    Есть база данных "rsc_2013.mdb", в ней, в числе прочих, таблицы "неврологи" и "палаты"
    В таблице "палаты" столбец "палата" тип данных текстовый (типа: 201, 202, АРО-3 и т.д.)
    В таблице "неврологи" столбцы ФИО, п1, п2, п3... тип данных текстовый
    Таблицы между собой не связаны.
    В столбцах п1, п2, п3... вносятся привязанные к данной ФИО палаты вручную, непосредственно в DataGridView "dgv2", которая отображает данную таблицу "неврологи".

    Задача:
    Есть Combobox "ComboboxПалаты" с раскрывающимся списком палат из таблицы "палаты"
    Необходимо внедрить его во все ячейки столбцов п1, п2, п3... для возможности выбирать палату непосредственно в ячейке DataGridView с возможностью сохранения выбранного значения в таблице "неврологи".
    Соответственно, при загрузке формы "FormНеврологиПалаты.vb" в DataGridView "dgv2" данные должны отображаться в привязанном к ячейке Combobox "ComboboxПалаты".

    Private Sub FormНеврологиПалаты_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load FormГлавная.m_dv2 = New DataView(FormГлавная.m_dt2) : Me.dgv2.DataSource = FormГлавная.m_dv2

    FormГлавная.m_cm2 = CType(Me.BindingContext(FormГлавная.m_dt2), CurrencyManager) FormГлавная.m_dv3 = New DataView(FormГлавная.m_dt3) : Me.dgv3.DataSource = FormГлавная.m_dv3

    FormГлавная.m_cm3 = CType(Me.BindingContext(FormГлавная.m_dt3), CurrencyManager) Me.dgv2.Columns(0).Visible = False Me.dgv3.Columns(0).Visible = False nRow = dgv2.RowCount - 1 nCol = dgv2.ColumnCount - 1 Dim ComboboxPalat As New DataGridViewComboBoxColumn() СписокПалат(ComboboxPalat) 'Через цикл получаем доступ к каждой ячейке dgv2 для привязки ComboboxPalat For Me.nRow = 0 To nRow For Me.nCol = 4 To nCol 'Код привязки Combobox к Cell DataGridView. 'При попытке привязать значение из базы данных к Combobox ошибка:

    '"ссылка на объект не указывает на объект" ComboboxPalat.DataGridView.Rows(nRow).Cells(nCol).Value =

    FormГлавная.m_DS.Tables("неврологи").Rows(nRow).Item(nCol).ToString Next Next End Sub Private Sub СписокПалат(ByVal cboPalat As DataGridViewComboBoxColumn) Try Dim n As Integer = FormГлавная.m_DS.Tables("палаты").Rows.Count - 1 For n = 0 To n cboPalat.Items.Add(Trim(FormГлавная.m_DS.Tables("палаты").Rows(n).Item("палата").ToString)) Next Catch ex As Exception MsgBox(ex.Message) End Try End Sub

    Буду признателен за пример кода. Смотрел похожие вопросы, но решения пока не нашел.

    4 октября 2013 г. 18:11

Ответы

  • Почитайте про DataGridViewComboBoxColumn
    • Помечено в качестве ответа Igor Galyaev 6 октября 2013 г. 13:17
    5 октября 2013 г. 3:03
  • Основные свойства для привязки comboboxColumn:
    ByVal comboboxColumn As DataGridViewComboBoxColumn)
            With comboboxColumn
                .DataSource = ...
                .ValueMember = ...
                .DisplayMember = ...
            End With

    С этими свойствами пока не разобрался.

    DataSource = сюда делаете биндинг второй таблицы

    ValueMember = сюда биндите столбец таблицы из которой нужно бпать значение (по аналогиии с внешним ключом из теории баз данных, первичный ключ)

    DisplayMember = сюда нужно биндить столбец (можно несколько) из таблицы, в котором человеческое описание id или первичного ключа БД.

    Вот мануал, посмотрите там ссылки по master\detail

    • Помечено в качестве ответа Igor Galyaev 6 октября 2013 г. 13:17
    5 октября 2013 г. 21:24

Все ответы

  • Почитайте про DataGridViewComboBoxColumn
    • Помечено в качестве ответа Igor Galyaev 6 октября 2013 г. 13:17
    5 октября 2013 г. 3:03
  • Почитайте про DataGridViewComboBoxColumn

    Спасибо, вчера сам нашел эту страницу, изучаю.
    5 октября 2013 г. 14:02
  • У Вас  ComboboxPalat.DataGridView == null (извиняюсь за свой C# ), потому что ComboboxPalat не добавлен в DataGridView. Посмотрите как создается DataGridView, в примере по ссылке это отлично описано.
    5 октября 2013 г. 14:33
  • Добрый день.

    Возможно вопрос не в тему,но все та ки.

    но с каких времен возможно стало использование в коде программы операторов на Русском языке?

    Да и в базе данных как правило все на английском, Локал пишется в значении свойства Text= ""


    Я VB.net последний раз пользовался лет 7 назад, но подразумеваю что это от VB и VBA досталось в наследство. Студентом когда первые базы на Access'е делал, сам имена формам на русском задавал - это вполне нормально. Но когда модули писать начал, понял что это не хорошо: раскладку менять замучаешься. А так - да, отлично так переваривал имена объектов на русском.

    PS. Конечно, по рукам за такой код бить нужно

    5 октября 2013 г. 14:46
  • Почитайте про DataGridViewComboBoxColumn

    Добавил DataGridViewComboBoxColumn "cboCol". Для наглядности столбец "п2" из исходной таблицы, столбец "п3" добавлен.

    Dim cboCol As New DataGridViewComboBoxColumn
    СписокПалат(cboCol)
    cboCol.HeaderText = "п3"
    cboCol.MinimumWidth = 60
    dgv2.Columns.Add(cboCol)

    Но мне нужно, чтобы при загрузке DataGridView в ячейках столбца "п2" отображался "ComboboxПалаты" , привязанный к соответствующей ячейке таблицы  "неврологи" базы данных "rsc_2013.mdb".
     Либо необходимо привязать cboCol к соответсвующему столбцу "п2" таблицы  "неврологи" базы данных "rsc_2013.mdb" и отбражать только этот столбец в DataGridView "dgv2".

    Основные свойства для привязки comboboxColumn:
    ByVal comboboxColumn As DataGridViewComboBoxColumn)
            With comboboxColumn
                .DataSource = ...
                .ValueMember = ...
                .DisplayMember = ...
            End With

    С этими свойствами пока не разобрался.

    5 октября 2013 г. 20:40
  • Основные свойства для привязки comboboxColumn:
    ByVal comboboxColumn As DataGridViewComboBoxColumn)
            With comboboxColumn
                .DataSource = ...
                .ValueMember = ...
                .DisplayMember = ...
            End With

    С этими свойствами пока не разобрался.

    DataSource = сюда делаете биндинг второй таблицы

    ValueMember = сюда биндите столбец таблицы из которой нужно бпать значение (по аналогиии с внешним ключом из теории баз данных, первичный ключ)

    DisplayMember = сюда нужно биндить столбец (можно несколько) из таблицы, в котором человеческое описание id или первичного ключа БД.

    Вот мануал, посмотрите там ссылки по master\detail

    • Помечено в качестве ответа Igor Galyaev 6 октября 2013 г. 13:17
    5 октября 2013 г. 21:24
  • DataSource = сюда делаете биндинг второй таблицы

    ValueMember = сюда биндите столбец таблицы из которой нужно бпать значение (по аналогиии с внешним ключом из теории баз данных, первичный ключ)

    DisplayMember = сюда нужно биндить столбец (можно несколько) из таблицы, в котором человеческое описание id или первичного ключа БД.

    Вот мануал, посмотрите там ссылки по master\detail

    По аналогии с примерами из ссылок получилось примерно так:

    Private Sub FormНеврологиПалаты_Load(ByVal sender As Object, ByVal e As System.EventArgs)

    Handles Me.Load FormГлавная.m_dv2 = New DataView(FormГлавная.m_dt2) : Me.dgv2.DataSource = FormГлавная.m_dv2

    FormГлавная.m_cm2 = CType(Me.BindingContext(FormГлавная.m_dt2), CurrencyManager) FormГлавная.m_dv3 = New DataView(FormГлавная.m_dt3) : Me.dgv3.DataSource = FormГлавная.m_dv3

    FormГлавная.m_cm3 = CType(Me.BindingContext(FormГлавная.m_dt3), CurrencyManager) Me.dgv2.Columns(0).Visible = False Me.dgv2.Columns(4).Visible = False Me.dgv2.Columns(5).Visible = False Me.dgv2.Columns(6).Visible = False Me.dgv2.Columns(7).Visible = False Me.dgv2.Columns(8).Visible = False Me.dgv2.Columns(9).Visible = False Me.dgv2.Columns(10).Visible = False Me.dgv2.Columns(11).Visible = False Me.dgv2.Columns(12).Visible = False Me.dgv3.Columns(0).Visible = False Dim comboboxColumn1, comboboxColumn2, comboboxColumn3, comboboxColumn4, comboboxColumn5,

    comboboxColumn6,comboboxColumn7, comboboxColumn8, comboboxColumn9 As New DataGridViewComboBoxColumn Try comboboxColumn1 = CreateComboBoxColumn(ColumnName.п1) SetAlternateChoicesUsingDataSource(comboboxColumn1, ColumnName.п1) comboboxColumn1.HeaderText = "п1" comboboxColumn1.Visible = False dgv2.Columns.Insert(4, comboboxColumn1) comboboxColumn1 = CreateComboBoxColumn(ColumnName.п1) SetAlternateChoicesUsingItems(comboboxColumn1) comboboxColumn1.HeaderText = "п1" dgv2.Columns.Add(comboboxColumn1) comboboxColumn2 = CreateComboBoxColumn(ColumnName.п2) SetAlternateChoicesUsingDataSource(comboboxColumn2, ColumnName.п2) comboboxColumn2.HeaderText = "п2" comboboxColumn2.Visible = False dgv2.Columns.Insert(5, comboboxColumn2) comboboxColumn2 = CreateComboBoxColumn(ColumnName.п2) SetAlternateChoicesUsingItems(comboboxColumn2) comboboxColumn2.HeaderText = "п2" dgv2.Columns.Add(comboboxColumn2) comboboxColumn3 = CreateComboBoxColumn(ColumnName.п3) SetAlternateChoicesUsingDataSource(comboboxColumn3, ColumnName.п3) comboboxColumn3.HeaderText = "п3" comboboxColumn3.Visible = False dgv2.Columns.Insert(6, comboboxColumn3) comboboxColumn3 = CreateComboBoxColumn(ColumnName.п3) SetAlternateChoicesUsingItems(comboboxColumn3) comboboxColumn3.HeaderText = "п3" dgv2.Columns.Add(comboboxColumn3) comboboxColumn4 = CreateComboBoxColumn(ColumnName.п4) SetAlternateChoicesUsingDataSource(comboboxColumn4, ColumnName.п4) comboboxColumn4.HeaderText = "п4" comboboxColumn4.Visible = False dgv2.Columns.Insert(7, comboboxColumn4) comboboxColumn4 = CreateComboBoxColumn(ColumnName.п4) SetAlternateChoicesUsingItems(comboboxColumn4) comboboxColumn4.HeaderText = "п4" dgv2.Columns.Add(comboboxColumn4) comboboxColumn5 = CreateComboBoxColumn(ColumnName.п5) SetAlternateChoicesUsingDataSource(comboboxColumn5, ColumnName.п5) comboboxColumn5.HeaderText = "п5" comboboxColumn5.Visible = False dgv2.Columns.Insert(8, comboboxColumn5) comboboxColumn5 = CreateComboBoxColumn(ColumnName.п5) SetAlternateChoicesUsingItems(comboboxColumn5) comboboxColumn5.HeaderText = "п5" dgv2.Columns.Add(comboboxColumn5) comboboxColumn6 = CreateComboBoxColumn(ColumnName.п6) SetAlternateChoicesUsingDataSource(comboboxColumn6, ColumnName.п6) comboboxColumn6.HeaderText = "п6" comboboxColumn6.Visible = False dgv2.Columns.Insert(9, comboboxColumn6) comboboxColumn6 = CreateComboBoxColumn(ColumnName.п6) SetAlternateChoicesUsingItems(comboboxColumn6) comboboxColumn6.HeaderText = "п6" dgv2.Columns.Add(comboboxColumn6) comboboxColumn7 = CreateComboBoxColumn(ColumnName.п7) SetAlternateChoicesUsingDataSource(comboboxColumn7, ColumnName.п7) comboboxColumn7.HeaderText = "п7" comboboxColumn7.Visible = False dgv2.Columns.Insert(10, comboboxColumn7) comboboxColumn7 = CreateComboBoxColumn(ColumnName.п7) SetAlternateChoicesUsingItems(comboboxColumn7) comboboxColumn7.HeaderText = "п7" dgv2.Columns.Add(comboboxColumn7) comboboxColumn8 = CreateComboBoxColumn(ColumnName.п8) SetAlternateChoicesUsingDataSource(comboboxColumn8, ColumnName.п8) comboboxColumn8.HeaderText = "п8" comboboxColumn8.Visible = False dgv2.Columns.Insert(11, comboboxColumn8) comboboxColumn8 = CreateComboBoxColumn(ColumnName.п8) SetAlternateChoicesUsingItems(comboboxColumn8) comboboxColumn8.HeaderText = "п8" dgv2.Columns.Add(comboboxColumn8) comboboxColumn9 = CreateComboBoxColumn(ColumnName.п9) SetAlternateChoicesUsingDataSource(comboboxColumn9, ColumnName.п9) comboboxColumn9.HeaderText = "п9" comboboxColumn9.Visible = False dgv2.Columns.Insert(12, comboboxColumn9) comboboxColumn9 = CreateComboBoxColumn(ColumnName.п9) SetAlternateChoicesUsingItems(comboboxColumn9) comboboxColumn9.HeaderText = "п9" dgv2.Columns.Add(comboboxColumn9) Catch ex As Exception MsgBox(ex.Message) End Try End Sub Private Shared Sub SetAlternateChoicesUsingItems(ByVal comboboxColumn As DataGridViewComboBoxColumn) Try Dim n As Integer = FormГлавная.m_DS.Tables("палаты").Rows.Count - 1 For n = 0 To n comboboxColumn.Items.Add(Trim(FormГлавная.m_DS.Tables("палаты").Rows(n).Item("палата").ToString)) Next Catch ex As Exception MsgBox(ex.Message) End Try End Sub Private Function CreateComboBoxColumn(ByVal cn As ColumnName) As DataGridViewComboBoxColumn Dim column As New DataGridViewComboBoxColumn() With column .DataPropertyName = cn.ToString() .HeaderText = cn.ToString .DropDownWidth = 150 .MinimumWidth = 60 .MaxDropDownItems = 8 .FlatStyle = FlatStyle.Flat End With Return column End Function Private Sub SetAlternateChoicesUsingDataSource(ByVal comboboxColumn As DataGridViewComboBoxColumn,

    ByVal cn As ColumnName) With comboboxColumn .DataSource = RetrieveAlternativeTitles() .ValueMember = cn.ToString() .DisplayMember = .ValueMember End With End Sub Private Function RetrieveAlternativeTitles() As DataTable Return Populate("SELECT * FROM неврологи") End Function

    Private Function Populate(ByVal OleDbCommand As String) As DataTable Dim connstr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=baza\" + FormГлавная.BazaName Dim conn As New OleDbConnection(connstr) conn.Open() Dim command As New OleDbCommand(OleDbCommand, conn) Dim adapter As New OleDbDataAdapter() adapter.SelectCommand = command Dim table As New DataTable() table.Locale = System.Globalization.CultureInfo.InvariantCulture adapter.Fill(table) Return table End Function

    Enum ColumnName п1 п2 п3 п4 п5 п6 п7 п8 п9 End Enum

    Выглядит так:

    Все работает, всем спасибо за участие!


    • Изменено Igor Galyaev 6 октября 2013 г. 13:22
    6 октября 2013 г. 13:16
  • Объясните пожалуйста следующее: FormГлавная - это форма, в которой расположены dgv2 и dgv3? И чем являются m_dv2, m_cm2, m_dv3, m_cm3, m_dt2, m_dt3.