Привязка, обновление списка со списком, словарем или таблицей данных - PullRequest
0 голосов
/ 08 января 2019

Я некоторое время изучал это, и по этой теме есть много вопросов, но я не смог найти четкого ответа.

У меня есть объект Listbox (listBox1) и IDictionary (клиенты) в приложении Windows Forms.

public static IDictionary<string, Object> clients = new Dictionary<string, Object>();

Я могу использовать следующее для заполнения Listbox из IDictionary:

 listBox1.DataSource=clients.ToList();
 form_m.listBox1.DisplayMember = "key";

Вопрос № 1 : как правильно использовать привязку данных со списком? Я пробовал следующее

listBox1.DataBindings.Add("DataSource", clients, "Key");

Я получаю исключение

System.Reflection. System.Net.Sockets.Socket, System, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089]] 'выдал следующее исключение:' Объект не соответствует типу цели. '

System.Reflection.TargetException: объект не соответствует типу цели.

Когда я пытаюсь

  listBox1.DataBindings.Add("DataSource", clients.ToList(), "Key");

Я получаю исключение

System.ArgumentException: комплексная привязка данных принимает в качестве источника данных либо IList, либо IListSource.

Вопрос № 2: это работает, но я хочу, чтобы список обновлялся при появлении нового ключа, значения, добавленного или удаленного из IDictionary. Как я понимаю, мне нужно сделать и использовать расширенный Observable класс IDictionary. Или есть другое более простое решение для этого?

PS: не обязательно должен быть IDictionary, но любая структура данных. Но мне нужно обновить список, так как в структуру данных вносятся изменения.

Один такой, который я нашел, был пример

1 Ответ

0 голосов
/ 08 января 2019

Для вопроса № 1 вы можете связать Dictionary с ListBox, создав из него BindingSource:

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

Для вопроса №2 вы можете использовать BindingList в качестве DataSource, и ListBox будет обновляться автоматически при изменении BindingList.

Например, если вы опускаете ListBox и Button в форме, этот код добавит 5 элементов к BindingList и привяжет 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...