2012-02-14 14 views
0

私はデータ入力に使用しているDataGridviewを持っています。これまではすべてのテキスト列でこれを行いました。しかし今では、カラムの1つをデータバインドされたコンボボックスにしたいので、ユーザはオプションを選択できます。私がこれを行うと、結果のgridviewのデータソースは空の行(しかし、正しい量)で終わる。私は何が欠けていますか?ここでDataGridViewComboboxColumnを入力に使用する際のトラブル

コードです:

DataGridViewComboBoxColumn cboCategory = new DataGridViewComboBoxColumn(); 
{ 
    cboCategory.HeaderText = "Category"; 
    cboCategory.DataSource = downtimeCategories; 
    cboCategory.DisplayMember = "Name"; 
    cboCategory.ValueMember = "CategoryID"; 
    cboCategory.DataPropertyName = "CategoryID"; 

    gridDowntime.Columns.Add(cboCategory); 
} 

次にGridViewのデータソースをつかむために、コード:彼らはものの(私は行の正しい数を持つテーブルを取得しますが、すべての行が空である

DataTable dt = (gridDowntime.DataSource as DataTable); 

毎回長い行で、データセットビジュアライザはスクロールしてセル全体を表示する必要があります)。エラーを見つけて修正するにはどうすればよいですか?

EDIT:ここで具体的な追加情報はありますか?

+1

は、あなたが何をしようとしていることは、非常に単純であるが、完全なコードなしでそれがある(...など、データテーブルpopulaltingグリッドのデータソースに割り当てる)完全なコードを提供することができますあなたが間違っているところを言うのは難しいです。 (おそらくオンラインであればチャットで議論することができます) –

+1

また、それは明らかではありませんが、行が空であると言うと、データテーブルの後でそれを調べるときにデータテーブル内にあることを意味しますか?フォームレベルのデータテーブルにバインドしておらず、そのオブジェクトを直接参照していないのはなぜですか?その調整が問題を解決するかどうかはわかりませんが、コードをきれいにするでしょう。 –

+0

私はそれを介してチャットしたいですが、チャットにあなたをどのように招待しますか? – MAW74656

答えて

1

ここでは、ちょうど私が調理した単純なプロジェクトの例を示します。

私があなたが間違っていると思う重要なことは、DataGridViewComboboxColumnDataPropertyNameプロパティが、DataGridViewのデータソースを参照する必要があり、列ではないことです。

public Form1() 
{ 
    InitializeComponent(); 

    DataTable dt = new DataTable("Customers"); 
    DataColumn dc; 

    dc = new DataColumn(); 
    dc.DataType = typeof(int); 
    dc.ColumnName = "CustomerID"; 

    dt.Columns.Add(dc); 
    dt.Columns.Add(new DataColumn("LastName")); 
    dt.Columns.Add(new DataColumn("FirstName")); 
    // Concatenation of first and last names 
    dt.Columns.Add(new DataColumn("FullName")); 
    dt.Columns.Add(new DataColumn("Address")); 
    dt.Columns.Add(new DataColumn("City")); 
    dt.Columns.Add(new DataColumn("State")); 
    dt.Columns.Add(new DataColumn("Zip")); 
    dt.Columns.Add(new DataColumn("Phone")); 

    dc = new DataColumn(); 
    dc.DataType = typeof(DateTime); 
    dc.ColumnName = "LastPurchaseDate"; 
    dt.Columns.Add(dc); 

    dc = new DataColumn(); 
    dc.DataType = typeof(int); 
    dc.ColumnName = "CustomerType"; 
    dt.Columns.Add(dc); 

    // Populate the table 
    dt.Rows.Add(2, "Baggins", "Bilbo", "Baggins, Bilbo", "Bagshot Row #1", "Hobbiton", "SH", "00001", "555-2222", DateTime.Parse("24/9/2008"), 1); 
    dt.Rows.Add(1, "Baggins", "Frodo", "Baggins, Frodo", "Bagshot Row #2", "Hobbiton", "SH", "00001", "555-1111", DateTime.Parse("14/9/2008"), 1); 
    dt.Rows.Add(6, "Bolger", "Fatty", "Bolger, Fatty", "ProudFeet Creek", "Hobbiton", "SH", "00001", "555-1111", DateTime.Parse("14/9/2008"), 1); 
    dt.Rows.Add(4, "Elessar", "Aragorn", "Elessar, Aragorn", "Citadel", "Minas Tirith", "Gondor", "00000", "555-0000", DateTime.Parse("14/9/2008"), 4); 
    dt.Rows.Add(5, "Evenstar", "Arwin", "Evenstar, Arwin", "Citadel", "Minas Tirith", "Gondor", "00000", "555-0001", DateTime.Parse("23/9/2008"), 4); 
    dt.Rows.Add(3, "Greyhame", "Gandalf", "Grayhame, Gandalf", DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, 3); 

    DataGridViewComboBoxColumn cboCategory = new DataGridViewComboBoxColumn(); 

    List<CustomerType> customerTypes = new List<CustomerType> { new CustomerType { Id = 1, Name = "Good" }, new CustomerType { Id = 4, Name = "Bad" }, new CustomerType { Id = 3, Name = "Ugly" } }; 

    cboCategory.HeaderText = "Customer Type"; 
    cboCategory.DataSource = customerTypes; 
    cboCategory.DisplayMember = "Name"; 
    cboCategory.ValueMember = "Id"; 
    cboCategory.DataPropertyName = "CustomerType"; 

    dataGridView1.Columns.Add(cboCategory); 

    dataGridView1.DataSource = dt; 

} 

そこに綿毛のビットがあります。しかし、ここでの重要な部分は、コンボボックス列のプロパティの設定です。

私のデータソースがcustomertypeオブジェクトのリストです:

public class CustomerType 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

だから私は、これは、列のデータソースを参照するため、「名前」とValueMemberでのカラムへの「ID」にDisplayMemberを設定する必要があります。 ただし、DataPropertyNameのには、DataGridViewにバインドしたDataTableの列の名前である "CustomerType"に値が設定されていました。


だからチャットでの議論のほんの少し後には、上記のは本当ですが、あなたはまた、あなたのID列の型が一致していることを確認する必要があることが判明しました。

コンボボックスの列にデータを提供するために使用されるデータテーブルは、SQLクエリから生成され、内タイプのidカラムを持っていたあなたのバッキングデータテーブルは、id列はとても似ていた:。

dt.Columns.Add(new DataColumn("Category")); 

このデフォルトをします型stringの列。代わりに試してみてください何かのように:

downtimeEntries.Columns.Add("Category", typeof(int)); 
関連する問題