在 WinForms c# 面板上绘制矩阵[x,y]
Posted
技术标签:
【中文标题】在 WinForms c# 面板上绘制矩阵[x,y]【英文标题】:Draw matrix[x,y] on WinForms c# panel 【发布时间】:2015-06-23 05:26:47 【问题描述】:我编写了一个程序,从 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 对象获取内容和坐标(扩展标签)。
我总是在输入中输入一些 txt 文件来测试我的程序。 今天我用一个大的 txt 文件(9000 行 * 50 列)进行了测试,我已经达到了 windows 窗体应用程序的最大句柄。 (在 Container.Controls.Add(curLabel) 期间启动 Win32 异常)。 谷歌搜索我发现winforms应用程序中的控件限制是10000个句柄。
还在我的表单上查看很多标签(如果 10000 是可修改的值),性能非常糟糕(如果我滚动容器面板,我会等待很多时间才能查看结果)! 有一种方法或控制可以帮助我吗? 我也认为 GDI+,但什么是适合你的方法?有什么建议吗?
提前致谢
【问题讨论】:
我可以推荐你使用一些 Grid 控件,例如 WinForms DataGridView 见codeproject.com/Articles/5806/… 我明白了,我已经尝试过使用 DataGridView(也在虚拟模式下),一切都很好。但现在我必须重新编写所有代码以适应 DataGridView。这是一项艰巨的工作,我只想在我的控制容器中添加超过 10.000 个标签。有办法吗? 【参考方案1】:我认为你应该使用DataGridView 控件。
如果您的数据量太大,您可以限制项目的数量并添加一些控件来选择您正在查看的区域的开始(如 NumericUpDdown 或 TrackBar)。每次更改起始索引时,都会将数据重新加载到 DataGridView。
如何从数组中填充 DataGridView 的示例:"How do I show the contents of this array using DataGridView?".
另一种解决方案是使用 WPF,它具有内置的 UI 虚拟化,因此支持更大的数据集而不会对性能产生任何影响。
【讨论】:
【参考方案2】:对网格状控件的单元格使用标签是不切实际的。正如 agent5566 建议的那样,您可以使用 DataGridView 控件来获得快速方法,或者如果您想要完全控制和更好的性能,您可以使用单个 UserControl 并在其上绘制所有内容、处理击键、模拟对单元格的关注(如果需要)等等。
【讨论】:
以上是关于在 WinForms c# 面板上绘制矩阵[x,y]的主要内容,如果未能解决你的问题,请参考以下文章