Как правильно привязать BindingList список к DataGridViewComboBoxColumn - C#
Формулировка задачи:
Друзья, помогите разобраться с вопросом.
Следующий код работает, но DataGridView не дает изменять значения в комбобоксе. Что не так делаю?
Подробнее:
Есть классы:
есть списки:
Есть DataGridView, который привязан к списку Sotrudniki.
В DataGridView есть столбец doljnost типа DataGridViewComboBoxColumn.
Как правильно заполнить и связать этот столбец со списком Doljnosti, чтобы при выборе элемента в комбобоксе, автоматически менялось значение свойства doljnost в соответствующем экземпляре списка Sotrudniki ?
private BindingSource bind = new BindingSource(); public SotrudnikForm() { InitializeComponent(); bind.AddingNew += new AddingNewEventHandler(bind_AddingNew); dataGridView1.AutoGenerateColumns = false; dataGridView1.Columns.Clear(); dataGridView1.Columns.AddRange( new DataGridViewTextBoxColumn() { DataPropertyName = "fio", HeaderText = "фио" }, new DataGridViewTextBoxColumn() { DataPropertyName = "address", HeaderText = "адрес" }, new DataGridViewComboBoxColumn() { DataPropertyName = "doljnost", HeaderText = "должность", DataSource = DataBaseHotel.Doljnosti}); bind.DataSource = DataBaseHotel.Sotrudniki; bind.AllowNew = true; dataGridView1.DataSource = bind; } void bind_AddingNew(object sender, AddingNewEventArgs e) { e.NewObject = new Sotrudnik(); }
class Sotrudnik { public string fio { get;set;} public string addrress { get;set;} public Doljnost doljnost { get;set;} } class Doljnost { public string name { get;set;} }
BindingList<Sotrudnik> Sotrudniki = new BindingList<Sotrudnik>(); BindingList<Doljnost> Doljnosti = new BindingList<Doljnost>();
Решение задачи: «Как правильно привязать BindingList список к DataGridViewComboBoxColumn»
textual
Листинг программы
private BindingSource bind = new BindingSource(); public SotrudnikForm() { InitializeComponent(); bind.AddingNew += new AddingNewEventHandler(bind_AddingNew); dataGridView1.AutoGenerateColumns = false; dataGridView1.Columns.Clear(); dataGridView1.Columns.AddRange( new DataGridViewTextBoxColumn() { DataPropertyName = "fio", HeaderText = "фио" }, new DataGridViewTextBoxColumn() { DataPropertyName = "address", HeaderText = "адрес" }, new DataGridViewTextBoxColumn() { DataPropertyName = "doljnost", HeaderText = "должность", ReadOnly = true, ContextMenuStrip = contextMenuDoljnost}); bind.DataSource = DataBaseHotel.Sotrudniki; bind.AllowNew = true; dataGridView1.DataSource = bind; } void bind_AddingNew(object sender, AddingNewEventArgs e) { e.NewObject = new Sotrudnik(); } private void contextMenuDoljnost_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { int index = 0; // Находим индекс выбранного пользователем значения, в этом контекстном меню. for (; ; index++) if (DataBaseHotel.Doljnosti[index].name == e.ClickedItem.Text) break; // Изменяем свойство экземпляра, выделенного пользователем, // на значение, которое пользователь выбрал в этом контекстном меню. DataBaseHotel.Sotrudniki[dataGridView1.SelectedRows[0].Index].doljnost = DataBaseHotel.Doljnosti[index]; // Снимаем выделение со всех ячеек, чтобы значение // выделенной ячейки автоматически обновилось dataGridView1.ClearSelection(); }