Использование BindingSource очень медленно? - PullRequest
3 голосов
/ 24 декабря 2010

У меня есть проект C # Windows Forms с формой, содержащей 2 списка и кнопку. В FormLoad левый ListBox заполняется списком (около 1800 наименований), содержащим информацию о ценных бумагах (идентификатор и имя), и когда пользователь нажимает кнопку, все ценные бумаги перемещаются из левого списка в правое.

Когда я не использую BindingSources, то есть я напрямую использую свойство Items в ListBoxes, процесс перемещения занимает несколько секунд:

private void button1_Click(object sender, EventArgs e)
{
    while (listBox1.Items.Count > 0)
    {
         Security s = listBox1.Items[0] as Security;
         listBox1.Items.Remove(s);
         listBox2.Items.Add(s);
    }
}

Но, когда я использую BindingSources, это занимает несколько минут:

listBox1.DataSource = bindingSource1;
listBox2.DataSource = bindingSource2;

...

private void MainForm_Load(object sender, EventArgs e)
{
    ICollection<Security> securities = GetSecurities();
    bindingSource1.DataSouce = securities;
}

private void button1_Click(object sender, EventArgs e)
{
    while (bindingSource1.Count > 0)
    {
        bindingSource1.Remove(s);
        bindingSource2.Add(s);
    }
}

В чем причина того, что способ BindingSource занимает так много времени? Есть ли способ сделать это быстрее?

Ответы [ 3 ]

6 голосов
/ 07 февраля 2011

Вы должны сбросить свойство RaiseListChangedEvents в BindingSource, прежде чем вносить большой набор изменений в BindingSource, и выполнить сброс, если после этого все будет сделано. Затем вы можете использовать ResetBindings для обновления связанных элементов управления.

Вы также должны обернуть большие наборы операций над элементами списка с помощью BeginUpdate / EndUpdate, чтобы избежать перерисовки. Это, вероятно, то, что вызывает большую часть замедления.

0 голосов
/ 24 декабря 2010

Ок, решил.Я должен манипулировать основной коллекцией, а затем сбросить привязки в конце.Теперь он почти мгновенно движется:)

0 голосов
/ 24 декабря 2010

попробуйте

listBox1.DataSource = bindingSource1;
listBox2.DataSource = bindingSource2;

...

private void button1_Click(object sender, EventArgs e)
{
      listBox2.DataSource = listBox1.DataSource;
}
...