在WinForms c#面板上绘制矩阵[x,y]



我写了一个程序,从txt文件构建一个2D矩阵,并构建一个带有X*Y标签的winforms面板,其中包含字符、坐标、颜色和边框(如果选择它)。这是我的DrawGrid例程:

Container.SuspendLayout();
for (int y = 0; y < template.Matrix.GetLength(1); y++)
{
for (int x = 0; x < template.Matrix.GetLength(0); x++)
{
var curLabel = new LabelTemplate(template.Matrix[x, y].Content, x, y, spacing);                    
_templateCells.Add(curLabel);
Container.Controls.Add(curLabel);
}
}
Container.ResumeLayout();

我在表单中查看一个txt文件,用鼠标选择一行、一列或一个区域,从中操作并保存新的文本文件,从我的LabelTemplate对象(扩展Label)中获取内容和坐标。

我总是在输入中使用一些txt文件来测试我的程序。今天,我用一个大的txt文件(9000行*50列)进行了测试,我已经达到了windows窗体应用程序的最大句柄。(Container.Controls.Add(curLabel)期间启动Win32异常)。通过谷歌搜索,我发现winforms应用程序中控件的限制是10000个句柄。

此外,在我的表单上查看了很多标签(如果10000是一个可修改的值),性能非常差(如果我滚动容器面板,我会等待很多时间来查看结果)!有什么方法或控制可以帮助我吗?我也认为GDI+,但对你来说什么是正确的方式?有什么建议吗?

提前感谢

我认为您应该使用DataGridView控件。

如果你的数据量太大,你可以限制项目的数量,并添加一些控件来选择你正在查看的区域的开始(比如NumericUpDdown或TrackBar)。每次更改起始索引时,都会将数据重新加载到DataGridView中。

如何从数组填充DataGridView的示例:"如何使用DataGridView显示此数组的内容?"。

另一种解决方案是使用WPF,它具有内置的UI虚拟化,因此支持更大的数据集,而不会对性能产生任何影响。

为类似网格的控件的单元格使用标签是不实用的。正如agent5566所建议的,你可以使用DataGridView控件来实现快速方法,或者如果你想要完全控制和更好的性能,你可以用一个UserControl在上面绘制所有内容,处理击键,模拟对单元格的关注(如果需要)等等

最新更新