2016-11-28 3 views
0

Я установил combobox для отображения в column1 моего Datagridview. Теперь я пытаюсь заполнить ту же строку Datagridview, где появляется Combobox, от Combobox_Key_Down события. Это мой код, показывающий выпадающий список:Datagridview - заполнить строку из Combobox

Private Sub My_DGV_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles MY_DGV.CellMouseClick 

If e.RowIndex >= 0 Then 

    With My_DGV 
    If .Columns(.Rows(e.RowIndex).Cells(e.ColumnIndex).ColumnIndex).Name = "Column1" Then 
     .CurrentCell = .Rows(.CurrentRow.Index).Cells(.CurrentCell.ColumnIndex) 
     Show_Combobox(.CurrentRow.Index, .CurrentCell.ColumnIndex) 'function that shows my Combobox in that cells 
     Combo.Visible = True 

    Else 
     Combo.Visible = False 
    End If 
    End With 
End If 

End Sub 

Я пробовал много вещей, но я не знаю, как определить, в каком появляется строка выпадающие и как дать, что Datagridview Row мои Combobox значения. Кто-то, пожалуйста, дайте мне понять, что мне делать. Заранее спасибо !

+0

Вы имеете в виду, что все строки имеют 'combobox' в 'column1', и вы хотите определить, в какой строке расширилось' combobox'? –

+0

Вы все еще боретесь с тем, как изображать/редактировать таблицу связей m: m? – Plutonix

+0

@Plutonix, да :). Но сегодня мне удалось что-то сделать, я думаю, что это может сработать. Я отправлю ответ, если я получу это правильно, tommorow. – LuckyLuke82

ответ

2

Первая проблема с вашим подходом является то, что DGV может иметь только один DataSource: он может либо показать м: м таблицу ассоциации или соответствующие элементы. Если вы включаете столбцы из одной из таблиц в запрос для отображения, таблица становится не обновляемой, и пользователи могут быть смущены, почему они не могут редактировать что-то, что они могут видеть. Кажется, это мало ценно, как они описывают это, поскольку они не могут видеть подробные данные до после, они делают выбор.

Далее, для получения подробной информации о CboColB требуется другое значение datatable. Поскольку вы хотите, чтобы DGV привязывался к простым обновлениям, вы в конечном итоге вынуждены снова и снова вводить данные в ячейки.

И, наконец, рассмотрите, с чем сталкивается пользователь. Используя таблицу Country (200+ стран/локалей с кодом и именем ISO) и список цветов флага, таблица CountryFlagColors будет содержать сотни и сотни строк (всего 2 цвета на каждый флаг).

Лучше дисплей может быть, чтобы фильтровать m:m таблицу (flagcolor) к выбранному элементу, так что пользователь только сталкивается с подмножеством данных в настоящее время они заинтересованы в:

enter image description here

Объект DataTable используется в DGV построен из таблицы m: m:

  • Столбец Страны скрыт.
  • Когда они выбирают из CBO вверху, который используется как RowFilter, чтобы ограничить строки соответствующими.
  • В RowValidating случае, когда клетка страна DBNull, скопируйте SelectedValue из комбо страны в клетку DGV, чтобы заполнить пустые
    • я бы, вероятно, на самом деле сделать пользователь нажимает на кнопку, и вручную добавьте строку, чтобы я мог подсчитать значение страны, а не зависеть от событий.
  • Он использует DataAdapter и после добавления X числа определений флага, da.Update(dtFlagColors) применяет/сохраняет все изменения.

Хорошо, так что предоставляет основные функции для назначения N цветовых отборов для определения цветов флага для страны. Недопустимый элемент - это «детали» для элемента «Цвет».

Я добавил в таблицу цветов бессмысленный int и строковый элемент, одним из способов их отображения было бы создание псевдонима в SQL с важными деталями.Отображение их в виде дискретных элементов может либо сделать запрос не обновляемым, либо пригласить пользователя редактировать то, что они не могут редактировать здесь. Мой глупый SQL:

"SELECT Id, Name, Concat(Name , ' (' , intItem , ' ' , stritem,')') As Info from FColor" 

Затем используйте «Info» в качестве элемента отображения на колонке СВО в DGV:

dc = DirectCast(dgvCF.Columns(0), DataGridViewComboBoxColumn) 
dc.DataSource = dtFlagColors 
dc.DisplayMember = "info" 
dc.ValueMember = "id" 
dgvCF.DataSource = dtSample 

Колонна комбо имеет свой собственный источник данных, конечно, для того, чтобы отобразить один вещь и использовать другую, как значение, которое нужно вернуть вам. Результат (значения глупы):

enter image description here

Это не совсем то, что вы хотите, но сближается и гораздо проще. Он также не требует почти никакого кода для управления ассоциативной сущностью. Другая альтернатива была бы использовать DGV в качестве второго сборщика, так что вы можете показать расширенные данные и вручную добавить строки в DGV:

enter image description here

Если установить стиль выпадающего в настоящее время, это выглядит как текст колонка.

+0

спасибо за это. Я не уверен, если я понимаю все, что вы написали, хотя .... Я думаю, что моя проблема похожа, но все равно другая - в таблице m: m у меня есть ID_Table1, ID_Table2 и поле Validity. И пользователь хочет видеть в Datagrid 3 поля из таблицы 1 (я получаю это через ID_Table1) + поле Validity, которое является в основном единственным полем, которое можно изменить в Datagrid. Итак, я делаю это, чтобы отобразить некоторые данные для связанной таблицы с пользователем с полем Validity, который можно редактировать. Все остальные поля заполняются из Combobox, но они просто привязаны к Dataset, я делаю все вставки и обновления вручную. – LuckyLuke82

+0

iI отказаться от этого, вы правы, это невозможно, как я и планировал. Хотя я почти получил It working - обновления работали нормально, делая вставки также. Но после того, как я все вставил и захотел обновить строку, все строки были обновлены. Я попробую ваше предложение, пользователи должны принять его. – LuckyLuke82