В Visual Studio 2010 существует стандартный элемент управления – ComboBox, задача которого является отображение редактируемого текстового поля и раскрывающегося списка допустимых значений. По своей неопытности настроить связанный с БД ComboBox, который помимо связанного списка показывал бы ещё и текущее состояние строки из таблицы в поле которой указан код, по которому она связана с дочерней таблицей и где дочерняя таблица и есть список выпадающих items'ов Combobox, у меня не получалось. Но я знал, как на определённый столбец отображаемой таблицы в DataGridView повесить Combobox. Время решения задачи поджимало, и я решил сделать связанный Combobox на основе DataGridView, убрав при этом отображение всех ненужных мне полей – и это весьма ламерское решение, как выяснилось позже.
В «DataGridView Задачи» выбираем «Правка столбцов», где выбираем столбец и в свойствах привязанного столбца в ColumnType указываем: «DataGridViewComboBoxColumn». Затем определяем DataSource, DisplayMemer и ValueMember. Где в DataSource указывается таблица, связанная (или не связанная, но обязательно с содержанием всех ключей основной таблицы) таблица. В DisplayMember мы указываем строку, определяющую свойство или столбец, из которого извлекаются строки для отображения в полях со списком, или проще говоря, то, что должно отображаться в выпадающем списке (и для того, чтобы пользователь работал не с кодом мастера Васильева В. С., а именно с его Ф.И.О.), а в ValueMember мы выбираем поле, в котором указан код Васильева В.С. (это значение будет записываться в БД в основную таблицу при изменении данных). Далее, всем ненужным нам полям выставляем False в Visible (очень нудно, когда столбцов очень много, у меня их было 24 и это надо было сделать на 8 Combobox), тем самым убрав всё лишнее отображаемое. Затем переходим в свойства dataGridView, где убираем отображение строки заголовков столбцов, убираем отображение столбца, содержащего заголовки строк, а типу полосы прокрутки(ScrollBars) присваиваем значение «None». Затем нужно поиграть со цветом dataGridView, где синий фон выделенной строки поменять на белый, а цвет текста поменять на чёрный. И, вот, у нас получился связанный ComboBox, который умеет не только выбрасывать список, но и отображать текущее состояние строки. И всё бы хорошо, если бы пользователь (или занудный тестер, который сидит внутри меня), не умудрился нажать клавишу «вверх» или «вниз». Ведь, так как фактически, ComdoBox содержится внутри DataGridView, и фактически там отображается не одна строка, а все строки нашего BindingSource (если я не путаюсь в терминологии, если точнее, то метод Fill, GetData() нашего TableAdapter). То при нажатии «вниз» мы перемещаемся на следующую строку того самого BindingSource таблицы указанной в DataGridView, вместо того, чтобы перемещаться вниз по items’ам нашего ComboBox. Чтобы запретить пользователю делать это, нам нужно создать отдельный метод, который будет выбирать по SQL-запросу текущую строку – а это вычисление ключа текущей строки главного DataGridView, и передача его в SQL запрос DataGridView в которой содержится наш ComboBox – весьма нудное занятие. Проще вернуться к нормальному ComboBox и изучить его более подробно, чем при первом знакомстве. Хотя, данное решение может пригодиться для создания выпадающего списка с содержанием нескольких столбцов. Или для ComboBox, внутри которого есть ещё один ComboBox.
С нормальным ComboBox дела идут куда проще в контексте поставленной мне задачи. В свойствах ComboBox определяем DataSource, DisplayMember и ValueMember. В DataSource указываем то, что у нас должно отображаться в выпадающем списке ComboBox. В DisplayMember и ValueMember указываем отображаемые и вносимые данные соответственно. В задачах СomboBox определяем «выбранное значение», где указываем столбец родительской таблицы, в который мы вносим изменения. На этом создание ComboBox заканчивается. Не нужно определение новых TableAdapter, новых BindingSource и новых методов чтения/обновления БД.