web-dev-qa-db-ja.com

セルごとに異なるデータソースを使用してDataGridViewComboBoxColumnを設定するにはどうすればよいですか?

私は次のように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を設定するコードも削除しようとしましたが、リストが空になっています。

これを適切に行うにはどうすればよいですか?

11
Blorgbeard

以下は私のために働きます:

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" };
}
21
SwDevMan81

別のオプションは、行レベルでデータバインディングを試すことです。イベントOnRowDataBoundイベントを使用してみてください。次に、その行の内容に基づいて、コンボボックスの内容をプログラムで設定できます。

もちろん、これはあなたがグリッドをデータバインディングしていることを前提としています。

0
Andy_Vulhop