2017-08-03 6 views
2

私はこれは私が私の列を作成するために使用し、すべての行に対してDataSourceを更新コードであるComboBox として列を持つDataGridViewを持っています。DataGridViewComboBoxCellデータソースの空

var dTable = new DataTable(); 
dTable.Columns.Add("Id",typeof(int)); 
dTable.Columns.Add("Desc", typeof(string)); 

for (int i = 0; i < 10; i++) 
{ 
    var dRow = dTable.NewRow(); 

    dRow[0] = i; 
    dRow[1] = "test"; 
    dTable.Rows.Add(dRow); 
} 
dataGridView1.DataSource = dTable; 

//Create the ComboBoxColumn at the end of the grid 
var cmb = new DataGridViewComboBoxColumn(); 
cmb.Name = "ComboCol"; 
cmb.HeaderText = "ComboCol"; 

dataGridView1.Columns.Add(cmb); 

UpdateDataSourceCombo(); 

private void UpdateDataSourceCombo() 
{ 
    for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) 
    { 
     var comboCell = (DataGridViewComboBoxCell)dataGridView1.Rows[i].Cells["ComboCol"]; 
      //Same datasource for every row just for testing 
     comboCell.DataSource = new string[] { "a", "b", "c" }; 
    } 
} 

カラムは正しくComboBoxとして作成されますが、常に空です。

UPDATE さらにテストした結果、DGV全体のデータソースを使用する場合にのみ問題が発生することがわかりました。

私はちょうど列を自分で作成する場合は正常に動作します:

var test = new DataGridViewTextBoxColumn(); 
     test.Name = "asd"; 
     dataGridView1.Columns.Add(test); 
     dataGridView1.Rows.Add(new DataGridViewRow()); 

     var cmb = new DataGridViewComboBoxColumn(); 
     cmb.Name = "ComboCol"; 
     cmb.HeaderText = "ComboCol"; 

     dataGridView1.Columns.Add(cmb); 

     UpdateDataSourceCombo(); //Same function as the original post 

私は、グリッドにデータテーブルのロードのサンプルと元のコードを更新しました。

+0

ここでうまくいきます。ドロップダウンが満たされている間は、cell.Valueが項目リストにない限り、値は表示されません。また、アイテムのデータソースを設定する前に、DGVデータソースを設定する必要があります。 Btw、なぜ 'i TaW

+0

更新の内容を確認できません。 DGV.DataSourceの各設定後に、ITEMsを設定する必要があります。これは特に、それぞれが行依存のデータリストを必要とするためです。 – TaW

答えて

0

私のプロジェクトでは次のように動作します。 ソース配列のクラスを作成します。 DisplayMemberPathをコンボボックス列のValueMemberPathプロパティに設定します。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

    namespace sof 
{ 
    public partial class Form1 : Form 
    { 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     System.Data.DataTable dTable = new DataTable(); 
     using (System.Data.SqlClient.SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=testBase;Integrated security=true")) 
     { 
      using (System.Data.SqlClient.SqlDataAdapter sqlAdp = new System.Data.SqlClient.SqlDataAdapter("SELECT * FROM City WHERE City_Name LIKE 'Chalon%'", sqlConn)) 
      { 
       sqlConn.Open(); 
       sqlAdp.Fill(dTable); 
      } 
     } 

     dataGridView1.DataSource = dTable; 

     //Create the ComboBoxColumn at the end of the grid 
     var cmb = new DataGridViewComboBoxColumn(); 
     cmb.Name = "ComboCol"; 
     cmb.HeaderText = "ComboCol"; 


     cmb.DisplayMember = "Display"; 
     cmb.ValueMember = "Value"; 
     dataGridView1.Columns.Add(cmb); 

     UpdateDataSourceCombo(); 


    } 
    private void UpdateDataSourceCombo() 
    { 
     for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) 
     { 
      var comboCell = (DataGridViewComboBoxCell)dataGridView1.Rows[i].Cells["ComboCol"]; 
      //Same datasource for every row just for testing 
      if (i % 2 == 0) 
       comboCell.DataSource = new customObj[] { new sof.customObj("a", "a"), new sof.customObj("b", "b"), new customObj("c", "c") }; 
      else 
       comboCell.DataSource = new customObj[] { new sof.customObj("1", "1"), new sof.customObj("2", "2"), new customObj("3", "3") }; 
     } 
    } 

} 

class customObj 
{ 
    public string Value { get; set; } 
    public string Display { get; set; } 
    public customObj(string value, string display) 
    { 
     this.Value = value; 
     this.Display = display; 
    } 

} 
} 
+0

これは動作しますが、私のすべての行に対して異なるデータソースを持つ必要がありますグリッド。私がコードで述べたように、テスト用に同じデータソースを使用しました。 – SilentRage47

+0

どの種類のデータを追加しようとしていますか?とにかく同じことは?あなたのコードは私が試したときに働くからです。 if(i%2 == 0) comboCell.DataSource = new string [] {"a"、 "b"、 "c"}; else comboCell.DataSource = new int [] {4、5、6}; –

+0

コンボボックスにデータがあります。 –

関連する問題