2011-10-05 4 views
5

私はDataGridViewに何かを設定しようとしています。これはかなり簡単なはずですが、私は問題があるようです。DataGridViewComboBoxColumn DataSource?

  • CodeID
  • 私はTypeNameのすべての可能な値から選択できるようにしたい型名のDisplayMember、のTypeID
  • のValueMemberで

とコードネーム

  • コンボボックス:私は3つの列を表示したいです。ここに私のジレンマです:

    私は1 DataTableにこのすべてをロードし、DataSourceとしてDataGridViewを設定した場合、私はそのレコードの既存のTypeNameを表示することができますが、コンボボックスは、他の値が含まれていません。 DataGridViewComboBoxColumnDataSourceを、すべてTypeNamesを含む別のDataTableに設定すると、既存の値は表示されません。

    DataGridViewと一緒に作業するのは面倒ですので、この解決法または実行可能な代替策のいずれかが評価されます。

    編集:それはDisplayMemberValueMemberのための別の項目を持ちたいと思っているためです。私はValueMemberとしてIDの設定を心配していない場合は、次の作品、私は次の操作を行う場合は

    var typeColumn = new DataGridViewComboBoxColumn 
    { 
        DataSource = typeList, 
        DisplayMember = "Type", 
        ValueMember = "Type", 
        DataPropertyName = "Type" 
    } 
    

    は、右のタイプが選択されているが、私は、コンボボックスで選択を変更することはできません。

    var typeColumn = new DataGridViewComboBoxColumn 
    { 
        DataSource = typeList, 
        DisplayMember = "Type", 
        ValueMember = "TypeID", 
        DataPropertyName = "TypeID" 
    } 
    

    私は、次を使用している場合、移入しようとしているように私はFormatExceptionエラーを取得する:

    var typeColumn = new DataGridViewComboBoxColumn 
    { 
        DataSource = typeList, 
        DisplayMember = "Type", 
        ValueMember = "TypeID", 
        DataPropertyName = "Type" 
    } 
    

    EDIトンtypeListは以下によって移入シンプルDataTableです:

    SELECT DISTINCT IT.InsuranceTypeID, IT.[Type] 
    FROM InsuranceType IT 
    WHERE IT.ClientID = @ClientID 
    ORDER BY [Type] 
    
  • +0

    :この例ではDataGridViewComboBoxを移入し、InsuranceDetailsInsurDetailz = all_insurance_types[2]、具体的に)に基づいて値を設定するのでしょうか?また、壮大なプロフィールのアイコン。 http://social.msdn.microsoft。com/forums/en-US/winformsdatacontrols/thread/952b1cc9-4ba7-4b16-abdf-be2cdfde6460/ –

    +0

    私の編集を参照してください。 –

    +0

    'typeList'の設定やリストに追加する構造体を投稿することはできますか? 'DataPropertyName'と' ValueMember'の型は同じでなければなりません。おそらく最後の例で例外が出ているのでしょう。 – SwDevMan81

    答えて

    3

    [OK]を、私は例ClientInfoを思い付いたと私は何を模倣するかもしれないと思うInsuranceDetailsあなたはしようとしている。これらの詳細がまったく正しいのかどうかは教えてください。あなたはDGVCBCにDataPropertyNameを設定している

    public partial class Form1 : Form 
        { 
         private ClientInfo _myClient; 
         private BindingList<InsuranceDetails> all_insurance_types = 
         new BindingList<InsuranceDetails>(); 
    
         public Form1() 
         { 
         InitializeComponent(); 
    
         DataGridView grid = new DataGridView(); 
         grid.Dock = DockStyle.Fill; 
         grid.AutoGenerateColumns = true; 
    
         all_insurance_types.Add(new InsuranceDetails(1, "Health")); 
         all_insurance_types.Add(new InsuranceDetails(2, "Home")); 
         all_insurance_types.Add(new InsuranceDetails(3, "Life")); 
    
         var col = new DataGridViewComboBoxColumn 
         { 
          DataSource = all_insurance_types, 
          HeaderText = "Insurance Type", 
          DataPropertyName = "InsurDetailz", 
          DisplayMember = "ItType", 
          ValueMember = "Self", 
         }; 
    
         _myClient = new ClientInfo { 
          InsurDetailz = all_insurance_types[2], Name = "Jimbo" }; 
         grid.Columns.Add(col); 
         grid.DataSource = new BindingList<ClientInfo> { _myClient }; 
         this.Controls.Add(grid); 
    
         this.FormClosing += new FormClosingEventHandler(Form1_FormClosing); 
         } 
    
         void Form1_FormClosing(object sender, FormClosingEventArgs e) 
         { 
         // make sure its updated 
         InsuranceDetails c = _myClient.InsurDetailz; 
         string name = _myClient.Name; 
         // Place breakpoint here to see the changes in _myClient 
         throw new NotImplementedException(); 
         } 
        } 
    
        class ClientInfo 
        { 
         public string Name { get; set; } 
         public InsuranceDetails InsurDetailz { get; set; } 
        } 
    
        class InsuranceDetails 
        { 
         public int InsuranceTypeID { get; set; } 
         public String ItType { get; set; } 
         public InsuranceDetails Self { get { return this; } } 
    
         public InsuranceDetails(int typeId, String itType) 
         { 
         this.InsuranceTypeID = typeId; 
         this.ItType = itType; 
         } 
        } 
    
    +0

    秘密は「自己」プロパティです。 –

    5

    私は似た(と思う)問題があった、と私のためのソリューションはDataSourceための設定前DataGridViewComboBoxColumnためDataSourceを設定することでしたDataGridView。私の場合は

    、私のデータソースは、それぞれList<T>BindingList<T>ですが、それはDataTableのと同じように機能する必要があります

    DataGridViewComboBoxColumn categoryColumn = (DataGridViewComboBoxColumn)_ItemsGrid.Columns["CategoryID"]; 
    categoryColumn.DataSource = categories; 
    
    _ItemsGrid.DataSource = items; 
    
    +0

    残念ながら、これは役に立たなかった。 –

    +0

    これは、Eloqueraを使用して複雑なクラスをデータグリッドにバインドするときに役立ちました。ありがとう! – Sverker84

    +0

    これは私のために働いた。ありがとう! –

    関連する問題