私は次のようにDataGridViewComboBoxColumn
を設定しています:
var newColumn = new DataGridViewComboBoxColumn() {
Name = "abc"
};
newColumn.DataSource = new string[] { "a", "b", "c" };
dgv.Columns.Add(newColumn);
これは機能します。各行の列には、a、b、cが入力されたドロップダウンボックスがあります。
ただし、特定の行のリストをトリミングしたいと思います。私は次のように行ごとのリストを設定しようとしています:
foreach (DataGridViewRow row in dgv.Rows) {
var cell = (DataGridViewComboBoxCell)(row.Cells["abc"]);
cell.DataSource = new string[] { "a", "c" };
}
ただし、このコードは効果がありません。すべての行に「a」、「b」、「c」が表示されます。
new string[]
をnew List<string>
とnew BindingList<string>
に置き換えてみましたが、どちらも役に立ちませんでした。
newColumn.DataSource
を設定するコードも削除しようとしましたが、リストが空になっています。
これを適切に行うにはどうすればよいですか?
以下は私のために働きます:
DataGridViewComboBoxColumn newColumn = new DataGridViewComboBoxColumn();
newColumn.Name = "abc";
newColumn.DataSource = new string[] { "a", "b", "c" };
dataGridView1.Columns.Add(newColumn);
foreach (DataGridViewRow row in dataGridView1.Rows)
{
DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)(row.Cells["abc"]);
cell.DataSource = new string[] { "a", "c" };
}
あなたも試すことができます(これは私にとってもうまくいきます):
for (int row = 0; row < dataGridView1.Rows.Count; row++)
{
DataGridViewComboBoxCell cell =
(DataGridViewComboBoxCell)(dataGridView1.Rows[row].Cells["abc"]);
cell.DataSource = new string[] { "f", "g" };
}
別のオプションは、行レベルでデータバインディングを試すことです。イベントOnRowDataBoundイベントを使用してみてください。次に、その行の内容に基づいて、コンボボックスの内容をプログラムで設定できます。
もちろん、これはあなたがグリッドをデータバインディングしていることを前提としています。