DataGridViewComboBoxCell.DataSource устанавливается равным нулю после показа формы - PullRequest
4 голосов
/ 14 марта 2011

Я добавляю DataGridViewComboBoxColumn к DataGridView во время обработчика событий Load формы и задаю источник данных каждого DataGridViewComboBoxCell в столбцах. Однако, как только форма показывается, источник данных каждого DataGridViewComboBoxCell был установлен в null. Вот код, который я использую для заполнения столбца и его ячеек:

DataGridViewComboBoxColumn comboCol;

comboCol = new DataGridViewComboBoxColumn();
comboCol.Name = "ComboCol";
comboCol.HeaderText = "Combo Column";
comboCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

this.dgv.Columns.Add(comboCol);

for (int i = 0; i < dgv.Rows.Count; i++)
{
    // This datatable is actually populated here!
    DataTable myData = PopulatedDataTable(dgv.Rows[i].Cells["info"].Value); 

    DataGridViewComboBoxCell DCC = new DataGridViewComboBoxCell();

    DCC = (DataGridViewComboBoxCell)dgv.Rows[i].Cells["CombolCol"];
    DCC.DataSource = myData;

    DCC.DisplayMember = "Association"; // Association is a column in myData
    DCC.ValueMember = "Association";
}

dgv.Columns["association"].Visible = false;

Этот код делает именно то, что ожидается, если я помещу его в кнопку, которую нажимаю ПОСЛЕ загрузки формы, но при выполнении во время загрузки формы источник данных очищается. Есть предложения?

Ответы [ 3 ]

6 голосов
/ 05 мая 2011

Я решил эту проблему, обработав событие DataBindingComplete сетки данных.

По-видимому, когда вы заполняете сетку данных во время события Load формы, данные в сетке данных восстанавливаются.Это испортило данные в несвязанном столбце, который я пытался добавить.

Поместив мой код выше в обработчик событий DataBindingComplete (и отключив обработчик событий в начале и повторно включив его в конце события), столбцы добавляются в соответствующее время, и ихданные не зашифрованы глупостью .NET.

4 голосов
/ 22 марта 2012

Да, я боролся с этим два дня, и, наконец, событие DataBinding исправило его.

Вот полный код для добавления ячейки поля со списком в некоторые ячейки DataGridView.

1 голос
/ 04 мая 2011

Я боролся с очень похожей проблемой на DataGridView с DataGridViewComboBoxColumn.

DataGridView привязан к DataSet Параметры раскрывающейся ячейки DataGridViewComboBoxCell должны заполняться в соответствии со значением другой ячейки в той же строке.

Заполняю ли я ComboBox Элементы ячеек вручную (свойство DataGridViewComboBoxCell.Items) или использую DataBinding (свойство DataGridViewComboBoxCell.DataSource), прямо перед вводом обработчика события CellFormatting значения верны, но как только выполняется шаги в обработчике, myComboBoxCell.Items.Count понижается до нуля.

Если значение ячейки отличается от DBNull.Value, это вызывает неприятное «System.ArgumentException: DataGridViewComboBoxCell значение недопустимо». (Потому что myComboBoxCell.Value не содержится в myComboBoxCell.Items)

Мое "решение" - это скорее обходной путь : Я обрабатываю событие DataGridView.DataError и заполняю соответствующий DataGridComboBoxCell источник данных в этом обработчике. Затем отмените исключение (e.ThrowException = False).

На мой взгляд, он слишком грязный, но работает.

...