我有一个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));
}
}
答案 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>
也可以以有意义的方式进行排序,因为字典会产生一个完全“狂野”的字样。基于哈希值的订单。