Closed 。这个问题需要多问focused /help/closed-questions 。目前不接受答案。
我对 Windows 窗体编程比较陌生。我正在开发一个 Windows 表单应用程序,它需要用户滚动表单(我在表单内使用了 AutoScroll=True 的 FlowLayoutPanel)。
面板的源代码包含一个用户控件,该控件根据记录数进行循环。
例如,如果数据库中存在 10 条记录,则在加载表单时将创建 10 个用户控件并将其添加到面板中,并且用户将能够滚动浏览这 10 个项目。(请参阅描述此场景的示例图像)示例屏幕图像 https://i.stack.imgur.com/0QfFu.jpg
Issue:
当记录数量较多(例如 1000 条)时,会出现问题,因为用户控件对象未释放且超出了句柄限制,应用程序崩溃(并显示一条消息:创建窗口句柄时出错)。我知道这是内存泄漏或设计不良的问题。
但我在这里找不到可靠的解决方案,我考虑过以下选项(以克服问题),但不确定如何继续:
仅加载用户屏幕上可见的 UserControls 并动态处置其他 userControls(当用户滚动或按下向上/向下按钮时)
是否可以将用户控件渲染为面板中的图像,并且在悬停或单击任何部分时,可以重新初始化用户控件并触发加载(这样,实际的用户控件对象将不会在内存中)
您能否建议一个合适的解决方案/在此要求的上下文中处理 UserControl 对象的正确方法
我建议去DataGridView
.
我将能够保存数千条记录。
您可以选择其中之一
我的意思是一种将除当前记录之外的所有记录显示为网格中的一行的解决方案;当前的一个可以放大并被您的一个实例覆盖UserControl
每当所选行发生更改时,都会从基础行的数据加载。
See 这个帖子 https://stackoverflow.com/questions/29005397/accordion-in-windows-forms-datagridview/29006361?s=23%7C0.5316#29006361 有关此技术的示例;在那里我展示了如何用更大的区域替换当前行,就像手风琴 控制会起作用..
DGV 中的行实际上只是Bitmap
因此滚动起来很便宜;使用 DGV 的正常方法是依靠其使用正确类型的编辑控件覆盖一个单元格的能力。
“手风琴技巧”将其扩展到任意UserControl
覆盖整行。
请注意,其他行将占用更少的空间,我认为这是一个额外的好处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)