Проблема с прокруткой таблицы данных Winforms - PullRequest
0 голосов
/ 19 февраля 2010

Я пишу приложение для анализа пакетов с использованием C # и помещаю пакеты, поступающие из сети, в представление данных, но как только оно начинает заполняться, прокрутка datagrivdview становится такой, как показано на рисунке ниже, и я не могу оценить? Как я могу это исправить?

В основном проблема в том, что данные поступают очень быстро, так что, может быть, они не справляются с этим?

альтернативный текст http://img705.imageshack.us/img705/2681/gridviewscrollingissue.png

Я заполняю данные вручную, а вот код:

string[] row = { packetsList[countOfPacketCaptures].packetType, packetsList[countOfPacketCaptures].sourceAddress, packetsList[countOfPacketCaptures].destinationAddress, packetsList[countOfPacketCaptures].sourcePort, packetsList[countOfPacketCaptures].destinationPort, packetsList[countOfPacketCaptures].packetMessage };

dgwPacketInfo.Rows.Add(row);

Ответы [ 2 ]

2 голосов
/ 19 февраля 2010

Как вы заполняете весь DataGridView? Возможно, вам следует попробовать использовать его в виртуальном режиме , что означает, что DataGridView будет запрашивать у вас данные в видимом диапазоне и запрашивать данные только тогда, когда это необходимо.

Вы занимаетесь заполнением основного потока пользовательского интерфейса или фонового потока? Если вы связываете основной поток с работой, ваш пользовательский интерфейс станет вялым.

Я бы предложил вам создать список за кулисами и добавить в него свои данные из фонового потока. Используйте события, связанные с виртуальным режимом (см. это пошаговое руководство ), и предоставьте данные из списка. Когда вы обновляете список, вам необходимо обновить DataGridView (в главном потоке, поскольку DataGridView требует этого).

Я не уверен, сколько пакетов вы видите в секунду, но, возможно, вам следует их буферизовать и обновлять DataGridView только один раз каждые 10 пакетов или раз в секунду (или любое другое число, которое имеет смысл в вашем случае), чтобы сохранить Пользовательский интерфейс отзывчив и не перегружает его обновлением.

private delegate void ParameterlessVoid();

private void RefreshDataGridViewThreadSafe()
{
    if (this.dataGridView.InvokeRequired)
    {
        this.dataGridView.Invoke(new ParameterlessVoid(this.RefreshDataGridView));
    }
    else
    {
        this.RefreshDataGridView();
    }
}

private void RefreshDataGridView()
{
    this.dataGridView.Refresh();
}
0 голосов
/ 19 февраля 2010

Возьмите свою проблему до крайности. Что происходит, когда вы получаете 50 000 новых предметов каждую секунду? Хотите показать все эти данные? Имеет ли смысл показывать все эти данные? Пользователь хочет или даже может просмотреть все эти данные?

Заполнение сетки вручную (или любого другого аналогичного элемента управления, например ListView), скорее всего, не будет работать для вас, если вы не найдете способ отфильтровать ненужные данные. Например, если вы просматривали пакеты только на одном порту или хотели просматривать данные только с определенного компьютера, ваш метод мог бы работать.

Я второй ответ Зака ​​Джонсона - подумайте о том, чтобы показать ваши данные виртуально. Ваши пользователи будут вам благодарны.

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