我已经研究了一段时间,并且对此主题有很多疑问,但是我没有找到明确的答案。
我在Windows窗体应用程序中有一个Listbox
(列表框1)和IDictionary
(客户端)对象。
public static IDictionary<string, Object> clients = new Dictionary<string, Object>();
我可以使用以下内容从Listbox
中填充IDictionary
:
listBox1.DataSource=clients.ToList();
form_m.listBox1.DisplayMember = "key";
问题#1 :将DataBinding与Listbox一起使用的正确方法是什么?我尝试了以下
listBox1.DataBindings.Add("DataSource", clients, "Key");
我遇到异常
System.Reflection.TargetInvocationException:对象'System.Collections.Generic.Dictionary`2 [[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[ System.Net.Sockets.Socket,系统,版本= 4.0.0.0,文化=中性,PublicKeyToken = b77a5c561934e089]]'引发以下异常:“对象与目标类型不匹配。”
System.Reflection.TargetException:对象与目标类型不匹配。
当我尝试
listBox1.DataBindings.Add("DataSource", clients.ToList(), "Key");
我遇到异常
System.ArgumentException:复杂数据绑定将IList或IListSource接受为数据源。
问题2:,该方法可以找到,但我希望列表框在有新的键,从IDictionary
添加或删除的值时进行更新。据我了解,我需要制作和使用Observable
的扩展IDictionary
类。或者,还有其他更简单的解决方案吗?
PS:不一定必须是IDictionary
,而是任何数据结构。但是,我需要在数据结构进行更改时更新列表框。
我发现的一个是example
答案 0 :(得分:0)
对于问题1,您可以通过从其中创建Dictionary
来将ListBox
绑定到BindingSource
:
listBox1.DataSource = new BindingSource(clients, null);
listBox1.DisplayMember = "Key";
listBox1.ValueMember = "Key";
对于问题2,您可以将BindingList
用作DataSource
,并且ListBox
将随着BindingList
的更改而自动更新。
例如,如果将ListBox
和Button
放在表单上,此代码将向BindingList
添加5个项目并将ListBox
绑定到其中Load
事件。然后在Button_Click
事件中,将另一个项目添加到我们的BindingList
中,而ListBox
立即反映出更改:
BindingList<int> items = new BindingList<int>();
private void Form1_Load(object sender, EventArgs e)
{
// Add some items to our binding list
for (int i = 0; i < 5; i++)
{
items.Add(i);
}
// Bind our listbox
listBox1.DataSource = items;
}
private void button1_Click(object sender, EventArgs e)
{
// Add an item to our binding list on each click
items.Add(items.Count + 1);
}