2012-01-12 34 views
0

私はDataGridView(dgv_Orders)と辞書(orders<uint, Order>)を持っています。クラスの注文には以下のメンバーがあります:uint order_id, uint volume, double price辞書に含まれるすべての値をdgv_ordersに表示して、行ごとにそのプロパティをすべて一覧表示したいと考えています。私はO(1)時間の値を編集できるように、辞書構造が必要です。C#では、DictionaryをDataGridViewにバインドする方法は?

私は、DataGridViewのはただの列を持っていることを除いて、私も

https://stackoverflow.com/a/854969/1143465

...以下のソリューションを見て、ほとんどの作業にそれを得ているキーをするBindingList &で動作するようにこれを得ています&値ですが、order_id、volume、&の価格を表示したいと思います。そうする方法はありますか?

ありがとうございます!

class Order : INotifyPropertyChanged 
{ 
    private uint order_id; 
    private double price; 
    private uint volume; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public Order(uint order_id) 
    { 
     this.order_id = order_id; 
     price = 10.0; 
     volume = 1; 
    } 

    public uint Order_ID 
    { 
     get { return order_id; } 
     set { order_id = value; NotifyPropertyChanged("Order_ID"); } 
    } 

    public uint Price 
    { 
     get { return price; } 
     set { price = value; NotifyPropertyChanged("Price"); } 
    } 

    public uint Volume 
    { 
     get { return volume; } 
     set { volume = value; NotifyPropertyChanged("Volume"); } 
    } 

    private void NotifyPropertyChanged(string name) 
    { 
     if(PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 
} 

答えて

1

私はあなたの唯一のオプションは、辞書のValuesプロパティにバインドすることだと思います。

実際、それは完全に真実ではありません。辞書から継承し、IBindingListまたはIObservableCollectionインターフェイスを実装する新しいクラスを作成することができます。

すべてのコアコレクションクラスはSystem.Collections.ObjectModel.KeyedCollectionから継承していますが、辞書(provides both O(1) indexed retrieval and keyed retrieval that approaches O(1))と同様のパフォーマンス特性を持ちますが、辞書よりもWCFやWebサービスでより簡単にシリアル化されています。ここで

更新

は、ご注文のクラスのコレクションの例です。

public class OrderCollection : System.Collections.ObjectModel.KeyedCollection<uint, Order> 
{ 
    protected override uint GetKeyForItem(Order item) 
    { 
     return item.Order_ID; 
    } 
} 

私は成功し、次のコードと新しい、デフォルトのDataGridViewでこれをテストすることができました:

 var cOrders = new OrderCollection(); 

     cOrders.Add(new Order(1)); 
     cOrders.Add(new Order(2)); 
     cOrders.Add(new Order(3)); 

     dataGridView1.DataSource = cOrders; 
+0

あなたは辞書にバインドすることができます..しかし..あなたが使用しているデータソースは何ですか?いくつかのコードを投稿することができます..? – MethodMan

+0

真実ですが、私はそれらが編集可能であるかどうかはわかりません。 – zmbq

+0

@DJKRAZEデータソースは辞書であり、私は自分のコードで変更します。それはあなたが求めていたものですか? – Joshua

0

これを最初の例として使用して、使用する用途に合わせて変数を変更してください。他の人が指摘したように

Dictionary<string, double> someDictionary = new Dictionary<string, double>(); 
BindingSource _bindingSource = new BindingSource(); 
dataGridView1.DataSource = _bindingSource; 
_bindingSource.DataSource = someDictionary; 
0

Dictionary<T>にバインドすることが可能であるが、それは合理的ですか?ディクショナリの目的は、DataGridViewが行わない、指定されたキーから値を参照することです。インデックスを使用して個々のアイテムにアクセスできるようにするのがより適切なようです。List<T>List<T>は意味のある方法でソートすることもできます。ここで、辞書はハッシュ値に基づいて完全に「ワイルド」な注文を生成します。

関連する問題