DataGridViewComboBoxColumn は、常にコンボボックスの項目リストに可能なすべての値を持つ必要があります。そうしないと、「FormatException: The DataGridViewComboBoxCell value is not valid」がスローされます。
1 つのコンボボックス列から選択された値を取得しようとしている場合は、DataGridView CellParsing イベントを処理し、選択された項目を DataGridView.EditingControl から取得して、編集された列からコントロールを編集するように設定することができます。次に例を示します。
private void dataGridView1_CellParsing(object sender,
DataGridViewCellParsingEventArgs e) {
if (dataGridView1.CurrentCell.OwningColumn is DataGridViewComboBoxColumn) {
DataGridViewComboBoxEditingControl editingControl =
(DataGridViewComboBoxEditingControl)dataGridView1.EditingControl;
e.Value = editingControl.SelectedItem;
e.ParsingApplied = true;
}
}
また、セルの書式設定イベントを処理することで、各セルにオブジェクトを表示する方法をカスタマイズすることもできます。これは、任意のオブジェクトまたはインターフェイスの toString を表示するコードです。
private void dataGridView1_CellFormatting(object sender,
DataGridViewCellFormattingEventArgs e) {
if (e.Value != null) {
e.Value = e.Value.ToString();
e.FormattingApplied = true;
}
}
この 2 つのイベントを処理するだけで、ビジネス オブジェクト内のデータを表示および編集するのに十分であり、そのイーザーは型コンバーターを記述します。この作業では、次のように DataGridView とコンボボックス列を設定します。
var data = (from item in someTable
select new { Foo = item.foo, Bar = item.Bar }).ToList();
grid.DataSource = data;
column.DataPropertyName = "Foo";
column.DataSource = (from foo in Foo select foo).ToList ();
DisplayMember または ValueMember プロパティを設定する必要はありません。コンボボックス データ ソース リストに Foo のすべての可能な値があることを確認してください。
その助けを願っています。