winform程序控件数量上限

SoulRed 2018-02-23 05:37:59
做了一个小程序,发现老是崩溃,调试了好久,发现貌似是控件太多导致的。
预估是10000个必定报错。

于是另写了个测试程序,十几行代码。测试下

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10000; i++)
{
Button btn = new Button();
btn.Text = i + "!";
flowLayoutPanel1.Controls.Add(btn);
Console.WriteLine(i);

}

}
}
}



果不其然,9978的时候就报错
System.ComponentModel.Win32Exception
创建窗口句柄时出错。

请问有什么能突破微软的这个限制么?不是电脑内存的问题。我内存16G,程序就用几十兆。
...全文
1312 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunylf 2018-04-18
  • 打赏
  • 举报
回复
用TabControl进行产品分类的话,确实可能窗口控件够多, 产品几十种,每种产品可能有10~30个不同的属性,这样很快就会超过控件个数限制了, 我也在苦恼这个问题。
大鱼> 2018-02-25
  • 打赏
  • 举报
回复
厉害了
SoulRed 2018-02-25
  • 打赏
  • 举报
回复
谢谢。各位,已经解决了。因为其中大部分控件只是数据不同,所以我把数据分离了出来,动态加载数据替换控件中的值,这样总共控件(winform组件)也就300个。。。
秋的红果实 2018-02-24
  • 打赏
  • 举报
回复
从控件复用的角度考虑,难道你这1w个控件都是不同的类型吗,工具箱里也就那么多个
sexfio 2018-02-24
  • 打赏
  • 举报
回复
引用 5 楼 diaodiaop 的回复:
LZ是从技术的角度出发..而不是"需求".. 你别管人家有什么需求... 以前看到有人说几百万数据显示到listview上 基本上90%的人都会来喷... 喷之前想一下. 自己用过"everything"这个软件吗? 人家也是几百万数据扔到了listview 怎么没人喷?
我觉得everything不会那么傻,几百万丢控件上,一般易语言的作者最喜欢做这种事,还有更狠直接丢textbox里的,呵呵
exception92 2018-02-24
  • 打赏
  • 举报
回复
自己解决了优越感爆棚,但是这完全没有必要去深究,私下里感兴趣可以搞搞,千万不要让客户看到一个控件数量达到上百个的界面。
  • 打赏
  • 举报
回复
我之前也做过上万控件的东西,后来用了变通方法,就是你实际上一个界面能够显示出来的部分超不过500个控件,控件本身所处位置能计算出来,滚动条也就能计算出来,用滚动条算出来要显示的列表,渲染显示。
by_封爱 版主 2018-02-24
  • 打赏
  • 举报
回复
LZ是从技术的角度出发..而不是"需求".. 你别管人家有什么需求... 以前看到有人说几百万数据显示到listview上 基本上90%的人都会来喷... 喷之前想一下. 自己用过"everything"这个软件吗? 人家也是几百万数据扔到了listview 怎么没人喷?
mk_lucifer 2018-02-24
  • 打赏
  • 举报
回复
如果是比较特殊的控件,比如一万条记录,其实方法很简单,你不可能看到1万个,那么用100个代替就行,只显示能看到的数据即可。。。 其实如果需要很多,最好的办法是写一个自定义的控件都是靠绘图实现的,不需要子控件反而更简单,控件只是对于常规情况用的,比如由100米长的流水账,记录了1000万条数据,难道你真需要1000万个控件???其实一个自定义控件就够了。。。
mk_lucifer 2018-02-24
  • 打赏
  • 举报
回复
根据你的报错内容,应该是系统创建窗口失败了,是窗口数量受限制,或者子窗口数量有限制。。 在winForm下,每一个控件都是一个window窗口,.net的winform控件是模仿ActiveX控件的,也采用以窗口做基类,创建窗口句柄出错,是系统不想给你创建新窗口了,你创建的太多了,受限制了,可能系统会对进程窗口数量进行限制,毕竟建那么多窗口微软会觉得你肯定是脑子坏掉了,系统不一样,可能有却别。。。我用win10我创建了三万个都没问题。。。 在WPF里不一样,他的控件不是窗口,他就是个视图,所以比较扯淡的一点是会把视图画到控件外面,超出区域,窗口不会。。。
  • 打赏
  • 举报
回复
简单来说,对于显示,所谓优化起码要对控件进行剪裁、抽稀(比如说过小的、被遮挡的,等等),甚至自动停止刷新而异步延迟到最后时刻才渲染仅仅一次。
  • 打赏
  • 举报
回复
引用 6 楼 xomix 的回复:
我之前也做过上万控件的东西,后来用了变通方法,就是你实际上一个界面能够显示出来的部分超不过500个控件,控件本身所处位置能计算出来,滚动条也就能计算出来,用滚动条算出来要显示的列表,渲染显示。
是这样的。不同的工具库有不同的解决办法,有的做的比较深入,有的比较浅,遇到比较浅的类库我们就得挽起袖子自己动手来进行优化改进了!
正怒月神 2018-02-24
  • 打赏
  • 举报
回复
UI重汇本来就耗时耗力,何必呢。 你这么玩和前台显示2万条数据有什么区别? 根本没有人会看。。。。这研究其实没什么太大意义。
xuzuning 2018-02-23
  • 打赏
  • 举报
回复
两百个控件就反应迟钝了,何况你一万个 不要拿自己开心
SoulRed 2018-02-23
  • 打赏
  • 举报
回复
看来只能抛弃这种做法,复用控件,数据替换控件内容来做了。。。 看了下貌似是GDI句柄限制,但修改了也增加不了多少。
zj_zwl 2018-02-23
  • 打赏
  • 举报
回复
到底什么样的窗口需要这么多控件?

110,572

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧