Как правильно привязать BindingList список к DataGridViewComboBoxColumn - C#

Узнай цену своей работы

Формулировка задачи:

Друзья, помогите разобраться с вопросом. Следующий код работает, но DataGridView не дает изменять значения в комбобоксе. Что не так делаю?
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>();
Есть DataGridView, который привязан к списку Sotrudniki. В DataGridView есть столбец doljnost типа DataGridViewComboBoxColumn. Как правильно заполнить и связать этот столбец со списком Doljnosti, чтобы при выборе элемента в комбобоксе, автоматически менялось значение свойства doljnost в соответствующем экземпляре списка Sotrudniki ?

Решение задачи: «Как правильно привязать 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();
        }

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы