【发布时间】:2008-09-04 11:39:39
【问题描述】:
使用 C# 2.0 实现动态表单控件的最佳方式是什么?
我需要为每个数据对象提供一组控件,所以我应该手动完成并在增加顶部值的同时将它们布置好还是有更好的方法?
【问题讨论】:
使用 C# 2.0 实现动态表单控件的最佳方式是什么?
我需要为每个数据对象提供一组控件,所以我应该手动完成并在增加顶部值的同时将它们布置好还是有更好的方法?
【问题讨论】:
您可以使用具有自动布局的面板,例如FlowLayoutPanel 和TableLayoutPanel。
不幸的是,只有 2 个面板具有开箱即用的自动布局,但您可以创建自定义布局面板。
我建议你阅读以下文章:
How to: Create a Resizable Windows Form for Data Entry
Walkthrough: Creating a Resizable Windows Form for Data Entry
另一种选择是使用 WPF(Windows 演示文稿)。
WPF 非常适合您的任务。
WPF 控件可以托管在 WinForms 应用程序中,因此您不必完全切换到它。
【讨论】:
@Sam 我知道这个问题是关于 Windows 窗体的,但您绝对应该开始研究 WPF。在带有 DataTemplates 和 TemplateSelectors 的 WPF 中,这种场景真的很容易。
【讨论】:
“动态”是什么意思?为数据集中的每个数据行提供一组新的、固定的控件?然后使用包含您的控件的UserControl。
或者您的意思是,根据您的数据布局,您希望为用户提供一组自定义控件,例如,每列一个TextBox?
【讨论】:
是的,我发现手动布局控件(将其 Top 属性增加控件的高度加上边距)相当有效。
另一种方法是将控件放置在面板中,并将 Dock 设置为顶部,以便每个连续的面板停靠在上面的面板上。然后,您可以切换各个面板的可见性,下面的控件将迅速填充可用空间。请注意,这可能有点不可预测:显示停靠的隐藏面板有时会改变其相对于其他停靠控件的位置。
【讨论】:
嗯,这就是我们现在在项目中的做法。但这仅对简单的情况有用。对于更复杂的情况,我建议您使用某种模板。
例如,我使用反射将某种类型的控件映射到旧项目中域对象的某个属性。
您可以尝试使用 t4 从模板生成代码,请参阅 T4 Templates in Visual Studio for Code Generation Screencast 以获取简单示例。您可以将此应用于 WinForms。
DevExperience 也有一个不错的(昂贵的)框架,请参阅 DevExpress eXpressApp Framework™。
【讨论】: