在C#中,如何将Dictionary绑定到DataGridView?

时间:2012-01-12 20:20:16

标签: c# dictionary datagridview

我有一个DataGridView(dgv_Orders)和一个Dictionary(orders<uint, Order>)。 Class Order有以下成员:uint order_id, uint volume, double price我希望能够让dgv_orders逐行显示字典中包含的所有值,列出所有属性。我需要Dictionary结构,以便我可以在O(1)时间内编辑值。

我已经使用了BindingList&amp;我也看了下面的解决方案..

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

并使它几乎工作,除了DataGridView只有列,Key&amp;价值,而我希望它显示order_id,音量和&amp;价钱。有没有办法这样做?

提前致谢!

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));
    }
}

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

使用此作为开始示例并更改变量以匹配您的用例。

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

答案 2 :(得分:0)

正如其他人所指出的那样,可以绑定到Dictionary<T>,但这是否合理?字典的目的是从给定键查找值,DataGridView不会做什么。允许通过索引访问单个项目的List<T>似乎更合适。 List<T>也可以以有意义的方式进行排序,因为字典会产生一个完全“狂野”的字样。基于哈希值的订单。