Первая проблема с вашим подходом является то, что DGV может иметь только один DataSource
: он может либо показать м: м таблицу ассоциации или соответствующие элементы. Если вы включаете столбцы из одной из таблиц в запрос для отображения, таблица становится не обновляемой, и пользователи могут быть смущены, почему они не могут редактировать что-то, что они могут видеть. Кажется, это мало ценно, как они описывают это, поскольку они не могут видеть подробные данные до после, они делают выбор.
Далее, для получения подробной информации о CboColB требуется другое значение datatable. Поскольку вы хотите, чтобы DGV привязывался к простым обновлениям, вы в конечном итоге вынуждены снова и снова вводить данные в ячейки.
И, наконец, рассмотрите, с чем сталкивается пользователь. Используя таблицу Country (200+ стран/локалей с кодом и именем ISO) и список цветов флага, таблица CountryFlagColors будет содержать сотни и сотни строк (всего 2 цвета на каждый флаг).
Лучше дисплей может быть, чтобы фильтровать m:m
таблицу (flagcolor
) к выбранному элементу, так что пользователь только сталкивается с подмножеством данных в настоящее время они заинтересованы в:
Объект 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
Колонна комбо имеет свой собственный источник данных, конечно, для того, чтобы отобразить один вещь и использовать другую, как значение, которое нужно вернуть вам. Результат (значения глупы):
Это не совсем то, что вы хотите, но сближается и гораздо проще. Он также не требует почти никакого кода для управления ассоциативной сущностью. Другая альтернатива была бы использовать DGV в качестве второго сборщика, так что вы можете показать расширенные данные и вручную добавить строки в DGV:
Если установить стиль выпадающего в настоящее время, это выглядит как текст колонка.
Вы имеете в виду, что все строки имеют 'combobox' в 'column1', и вы хотите определить, в какой строке расширилось' combobox'? –
Вы все еще боретесь с тем, как изображать/редактировать таблицу связей m: m? – Plutonix
@Plutonix, да :). Но сегодня мне удалось что-то сделать, я думаю, что это может сработать. Я отправлю ответ, если я получу это правильно, tommorow. – LuckyLuke82