Почему изменение HeaderStyle объекта ListView приводит к зависанию приложения? - PullRequest
2 голосов
/ 03 февраля 2012

Я пытался решить эту проблему, и, похоже, это проблема .NET Framework.Во всяком случае, у меня есть просмотр списка, который содержит более 5000 элементов и кнопка, используемая для дальнейшей обработки выбранных элементов в просмотре списка.Теперь нажатие этой кнопки также должно установить свойство listview.HeaderStyle для списка в «ColumnHeaderStyle.Nonclickable».теперь, когда я это делаю.программа зависает примерно на 10 секунд, затем продолжает работу.Я понятия не имею, что вызывает и почему это происходит.Я надеюсь, что у вас, ребята, есть решение для этого.есть идеи?

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

На данный момент я нашел базовое решение, все, что мне нужно, это установить

myListview.ColumnClick += new ColumnClickEventHandler(delegate{});

Теперь мне больше не нужно изменять свойство listview.HeaderStyle. в основном я отключал событие ColumnClick из свойства HeaderStyle и все. поэтому вместо установки HeaderStyle на nonClickable. Я просто удаляю / меняю функцию внутри обработчика событий.

0 голосов
/ 03 февраля 2012

Вы можете решить эту проблему, используя BackgroundWorker MSDN .

Примечание : Даже при использовании этого решения ваша форма будет зависать некоторое время. Поскольку у вас есть более 5000 элементов для привязки к списку, которые заблокируют ваш поток пользовательского интерфейса , следовательно, winform будет зависать. Но ваш listview.HeaderStyle будет изменен.

Попробуйте это

  1. При нажатии кнопки вы напрямую изменяете свойство listview.HeaderStyle на ColumnHeaderStyle.Nonclickable. Затем позвоните RunWorkerAsync из BackgroundWorker.
  2. В обработчике событий DoWork вы выполняете обработку и после этого привязываете данные к представлению списка. Для этого вам нужно добавить следующий класс расширения в ваш проект.

Класс расширения

public static class ControlExtensions
{
    public static void Invoke(this Control control, Action action)
    {
        if (control.InvokeRequired) control.Invoke(new MethodInvoker(action), null);
        else action.Invoke();
    }
}

С его помощью вы можете привязать данные к списку

listview.Invoke(() => ( listview.DataSource = dataSource; });

Надеюсь, это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...