我正在使用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);
答案 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的第二个答案 - 考虑虚拟地显示您的数据。您的用户会感谢您。