Как сделать форму подстановки значений из связанной таблицы в combobox
Как сделать форму подстановки значений из связанной таблицы в combobox чтобы показывались не id а значение этого id (например название).
Есть например 2 таблицы Машины и Работники которые связаны связью ( 1-много) и мы ручками добавляем запись через несколько combobox-ов с помощью sql в таблицу работников и вместо id_машины мы должны видеть название машины а когда запрос уже отправляться он должен уже вставить id.Есть ли какие-то легкие решения или функции встроеные в sql для этого?
Ответы (2 шт):
Добавляй в combobox и id и его значение только так чтобы id было за видимой частью combobox
comboBox3.Items.Add((reader1.GetValue(1).ToString() + " ~" + reader1.GetValue(0).ToString()));
а потом перед выполнение запроса делаешь split
{
comboBox3.Text = comboBox3.Text.Split('~')[1];
}
catch (Exception)
{
}
Пример использования combobox для показа "названия" и записи "Ид"
/// <summary>Заполнить источник ComboBox данными из таблицы из указанных колонок</summary>
/// <param name="cmb">ComboBox - получатель</param>
/// <param name="tbl">таблица-источник</param>
/// <param name="displayName">наименование колонки для DisplayMember</param>
/// <param name="valueName">наименование колонки для ValueMember</param>
/// <returns></returns>
public static bool SetColumnToComboBox(ComboBox cmb, DataTable tbl,
string displayName, string valueName = null)
{
int idx = 1;
cmb.Items.Clear();
int iDisplayCol = tbl.Columns.IndexOf(displayName);
int iValueCol = (valueName != null) ? tbl.Columns.IndexOf(valueName) : -1;
if (iDisplayCol < 0) {
throw new System.ArgumentException("SetColumnToComboBox. Display Column not found", displayName);
return false; }
for (int iRow = 0; iRow < tbl.Rows.Count; iRow++)
{
string sValue;
int iId;
try
{
iId = (valueName != null) ?
((tbl.Rows[iRow][iValueCol] != null) ?
(int)tbl.Rows[iRow][iValueCol]
: -1)
: idx;
sValue = (tbl.Rows[iRow][iDisplayCol] != null) ? tbl.Rows[iRow][iDisplayCol].ToString() : "<>";
if (sValue.Length > 0) cmb.Items.Add(new KeyValuePair<int, string>(iId, sValue));
}
catch (Exception ex) { MessageBox.Show("Ошибка SetColumnToComboBox" + ex.Message); }
idx++;
}
return true;
}
Допустим, Ваша таблица работников называется "tblWorker" и имеет поля Id,Name. Поле "Name" должно быть видно в списке. Такую функцию можно использовать так:
SetColumnToComboBox(cmbSelectWorker,"tblWorker","Name","Id")
Соответственно свойства контрола cmbSelectWorker "DisplayMember" - наименование работника и "ValueMember" идентификатор работника. Можно использовать для записи в таблицу "Машины"