Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataGridView、虚拟模式和;“滞后”;_C#_Winforms_Datagridview_Selection_Virtualmode - Fatal编程技术网

C# DataGridView、虚拟模式和;“滞后”;

C# DataGridView、虚拟模式和;“滞后”;,c#,winforms,datagridview,selection,virtualmode,C#,Winforms,Datagridview,Selection,Virtualmode,我的代码如下所示: private void dataGridView4_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) { Records recordsTmp = null; recordsTmp = (Records)this.ArrayOfRecords[e.RowIndex]; //ArrayList with string[] objec

我的代码如下所示:

private void dataGridView4_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
        {
            Records recordsTmp  = null;
            recordsTmp = (Records)this.ArrayOfRecords[e.RowIndex]; //ArrayList with string[] objects inside


            switch (dataGridView4.Columns[e.ColumnIndex].HeaderText)
            {
                case "#":
                    e.Value = recordsTmp.nr;
                    break;
                case "ip":
                    e.Value = recordsTmp.Ip;
                    break;
                case "long":
                    e.Value = recordsTmp.Long;
                    break;
                case "3":
                    e.Value = recordsTmp.type;
                    break;
                case "4":
                    e.Value = recordsTmp.time;
                    break;
            }
  • ArrayOfRecords
    每秒更新10-100个新的
    string[]
    对象
  • VirtualMode
    设置为true
  • SelectionMode
    设置为
    FullRowSelect
  • dataGridView
    为只读
现在还有一个
ProgressBar
Marquee
样式,它向我显示了5000多行滚动冻结
表单
,但我想这只是线程/后台工作人员等的问题

最让我害怕的是选择。拥有8000行并单击最后一行(8000)需要我的表单4.2秒来选择它。其内容如下:

private void dataGridView4_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
        {
            Records recordsTmp  = null;
            recordsTmp = (Records)this.ArrayOfRecords[e.RowIndex]; //ArrayList with string[] objects inside


            switch (dataGridView4.Columns[e.ColumnIndex].HeaderText)
            {
                case "#":
                    e.Value = recordsTmp.nr;
                    break;
                case "ip":
                    e.Value = recordsTmp.Ip;
                    break;
                case "long":
                    e.Value = recordsTmp.Long;
                    break;
                case "3":
                    e.Value = recordsTmp.type;
                    break;
                case "4":
                    e.Value = recordsTmp.time;
                    break;
            }
4000行等于2.1秒,以此类推。如果选择第8000行,则最小化然后最大化需要4.2秒。选择第1行“使其”再次快乐。这是不能接受的*为什么为我的
表单“标记”第8000行如此困难

VirtualMode的分页工作非常完美,但选择是一件痛苦的事情

还有另一个问题/行为:

当我将鼠标移到行上时,为什么会引发
CellValueRequired
事件?他们已经画好了吗?那么,为什么要浪费资源呢


这个选择问题有什么解决办法吗?或者我必须限制datagrid中的最大记录数

您需要处理的一件事是自动调整单元格大小,因为gridview必须遍历所有单元格才能找到长度最长的单元格。您应该禁用自动调整大小,并且应该通过编程来实现。 关于您的选择问题:选择会导致大量重绘,我的直觉是,它会重绘所有单元格,因此延迟与行/单元格计数成正比


为了使用虚拟模式,您需要的不仅仅是将VirtualMode设置为true。看到dataGridView1_RowsAdded、dataGridView1_CellValuePushed和dataGridView1_CellValueValueValidating方法会很有趣,因为它们可能是延迟的罪魁祸首。

感谢您的提示,花了很长时间想知道为什么我在通过同一绑定源编辑数据绑定对象时DataGridView会不断刷新所有行。