8

DataGridViewComboBoxCellとDataTableがあります。表Iのデータは、DataSourceを使用してDataGridViewComboBoxCellにバインドされ、ValueMemberとDisplayMemberを設定しました。

private void Form1_Load(object sender, EventArgs e)
{         
    DataGridViewComboBoxCell comboBoxCell = new DataGridViewComboBoxCell();

    dataGridView1.Rows[0].Cells[0] = comboBoxCell;

    comboBoxCell.DataSource = dataTable;
    comboBoxCell.ValueMember = "ID";
    comboBoxCell.DisplayMember = "Item";
}

フォームが読み込まれたときにセルに値をプログラムで設定するにはどうすればよいですか?単純なComboBoxでは、プロパティSelectedIndexを知っています。comboBoxCell.Value=...;を試しました。しかし、それは例外を与えます。そして試してみました

private void dataGridView1_CellFormatting(object sender, 
    DataGridViewCellFormattingEventArgs e)
{
    e.Value = 1;
}

セルに新しい値を設定しますが、値を選択する必要があります。

フォームが読み込まれ、空のセルがあります。

フォームが読み込まれ、空のセルがあります。

そして、ComboBoxのいくつかのデータ。

そして、ComboBoxのいくつかのデータ。

このコードdataGridView1.Rows[0].Cells["ComboColumn"].Value = "1";をcomboBoxCell.DisplayMember=...(上記を参照)の直後に置くと、正常に機能します。

ID列の値「1」は「アイテム」列の値「Second」に対応しているので、正しい結果が得られます。

値

私の英語と私の初心者コードでごめんなさい:)

4

1 に答える 1

17

グリッドにセルを追加する代わりに、DataGridViewComboBox列を追加します。

DataGridViewComboBoxColumn c = new DataGridViewComboBoxColumn();
c.Name = "ComboColumn";
c.DataSource = dataTable;
c.ValueMember = "ID";
c.DisplayMember = "Item";
dataGridView1.Columns.Add(c);

特定の値を選択するには、特定のセルのValueプロパティを設定します。

dataGridView1.Rows[rowIndexYouWant].Cells["ComboColumn"].Value = 1;
  • ここでのタイプは重要であることに注意してください!コメントであなたはあなたが得ると言いますSystem.FormatException。これは、値に間違ったタイプを設定したことが原因である可能性があります。

    値を1に設定すると、intが割り当てられます。何らかの理由でID列に文字列がある場合は、表示されているSystem.FormatException例外が発生します。

    タイプが異なる場合は、DataTable定義を更新するか、値を文字列に設定する必要があります。

    dataGridView1.Rows[rowIndexYouWant].Cells["ComboColumn"].Value = "1";
    
  • また、この値は、グリッドのソースとして設定したDataTableのID列に存在する必要があることに注意してください。

通常DataGridView、データソースが設定されている場合に操作するのが最も簡単です。この場合、DataPropertyNameプロパティを使用して、ComboBoxColumnをグリッドのデータソースにバインドできます。

c.DataPropertyName = "GridDataSourceColumnName";

これにより、列の値をグリッドデータソースから取得し、列を変更してそのデータソースを直接変更できます。


最後に、ここではCellFormattingイベントを使用しないでください。このイベントはこの種の使用を目的としたものではありません。通常、この種の作業は、DataBindingCompleteイベント(1回だけ実行する場合)、またはDefaultValuesneededやRowValidatingなどのイベント中に実行するのが最適です。

CellFormattingを使用すると、ユーザーがコンボボックスを手動で編集できなくなる可能性があります。

于 2012-07-25T19:43:01.280 に答える