用列表,字典或数据表绑定,更新列表框

时间:2019-01-08 05:33:17

标签: c# winforms listview listbox

我已经研究了一段时间,并且对此主题有很多疑问,但是我没有找到明确的答案。

我在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

1 个答案:

答案 0 :(得分:0)

对于问题1,您可以通过从其中创建Dictionary来将ListBox绑定到BindingSource

listBox1.DataSource = new BindingSource(clients, null); 
listBox1.DisplayMember = "Key"; 
listBox1.ValueMember = "Key"; 

对于问题2,您可以将BindingList用作DataSource,并且ListBox将随着BindingList的更改而自动更新。

例如,如果将ListBoxButton放在表单上,​​此代码将向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);
}