【问题标题】:Winforms Data Grid Scrolling IssueWinforms 数据网格滚动问题
【发布时间】:2010-02-19 11:33:33
【问题描述】:

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

基本上问题是数据进来的速度非常快,所以它可能无法处理它?

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

【问题讨论】:

  • 您是在主 UI 线程还是后台线程上查看数据包?
  • 好的。也许您应该实现某种缓冲。 (见我的回答)

标签: c# winforms datagridview


【解决方案1】:

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

您是在主 UI 线程还是后台线程上进行填充?如果您将主线程与工作捆绑在一起,您的 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();
}

【讨论】:

  • 这就是我添加数据的方式。字符串 [] 行 = { packetList[countOfPacketCaptures].packetType,packetsList[countOfPacketCaptures].sourceAddress,packetsList[countOfPacketCaptures].destinationAddress,packetsList[countOfPacketCaptures].sourcePort,packetsList[countOfPacketCaptures].destinationPort,packetsList[countOfPacketCaptures].packetMessage }; dgwPacketInfo.Rows.Add(row);
【解决方案2】:

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

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

我赞同 Zach Johnson 的回答 - 考虑以虚拟方式显示您的数据。您的用户会感谢您的。

【讨论】:

  • 好吧,当我将 data virtual 选项设置为 true 时,它​​什么也不显示!其次,它要求我的客户在它到来时显示数据,就像钢丝鲨一样。
  • @itsaboutcode:您必须使用与虚拟模式关联的事件并设置行数,以便虚拟模式 DataGridView 显示任何内容。
  • @itsaboutcode:将 Designer 属性设置为 true 不会为您编写代码! 阅读 Zach 的回答中提供的链接。
猜你喜欢
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多