Winforms数据网格滚动问题

时间:2010-02-19 00:17:57

标签: c# winforms datagridview

我正在使用C#编写数据包分析应用程序并将来自网络的数据包放入datagridview中,但一旦开始填充,datagrivdview滚动就会变成如下图所示,我无法得分?我怎么解决这个问题?

基本上问题是数据进入的速度非常快,所以也许它无法处理它?<​​/ p>

alt text 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 个答案:

答案 0 :(得分:2)

如何填充整个DataGridView?也许您应该尝试在virtual mode中使用它,这意味着DataGridView会询问您可见范围内的数据,并且仅在需要时询问数据。

您是在主UI线程或后台线程上进行填充吗?如果你正在将主线程与工作捆绑在一起,那么你的用户界面就会变得迟钝。

我建议您在幕后实现一个列表,并从后台线程向其添加数据。使用与虚拟模式关联的事件(请参阅this walkthrough),并从列表中提供数据。更新列表时,您需要刷新DataGridView(在主线程上,因为DataGridView需要这个)。

我不确定你看到一秒钟有多少数据包,但也许你应该缓冲它们并且每10个数据包刷新一次DataGridView或者每一秒刷新一次(或者你的情况下任何数字都是有意义的)以保持UI响应并且不会因刷新而超载。

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();
}

答案 1 :(得分:0)

把你的问题发挥到极致。当你每秒获得50,000件新物品时会发生什么?您要显示所有该数据吗?显示所有数据是否有意义?用户是否想要甚至能够查看所有数据?

手动填充网格(或任何类似的控件,如ListView)可能无法满足您的需求,除非您找到过滤掉不必要数据的方法。例如,如果您只在一个端口上查看数据包,或者只想查看特定计算机上的数据,那么您的方法可能会有效。

我是Zach Johnson的第二个答案 - 考虑虚拟地显示您的数据。您的用户会感谢您。