我正在编写一个c#表单,用于向数据库中添加各种条目。大约有15种不同的类型条目。所有条目类型都共享一些公共属性,如名称、日期、注释等。此外,所有条目类型都有大约10个其他独特的类型属性。
为了避免编写15个单独的表单,每个条目类型一个,我试图在一个表单上完成所有这些。
目前,我正在使用选项卡控件,并将每个条目类型的属性的所有唯一输入字段放在该类型的选项卡控件页面上。我只是将选项卡控制页更改为所选的条目类型,以显示该条目类型的输入字段。在将条目保存到数据库时,我从这些字段中读取。
我想一定有更好的办法。这在我的机器上实际上有点慢,我的机器有一个四核处理器!Visual studio在保存这个表单时甚至有点迟钝。
是否有合适的方法在运行时创建这些动态字段集?
也许我没有完全理解你,但是你尝试过视觉继承的概念吗?创建一个包含您可以提取的所有共享功能的表单,并让您的子表单(继承共享表单的表单)实现这些细节。这可太慢了,我一直在用。
另外,WinForms从你的机器硬件上得到的好处很小,因为它是旧的GDI+技术,在现代机器上运行根本没有优化(不是说它很慢,但不要期望有什么极端,它不是为图形密集型的东西而设计的,它甚至不使用图形卡,大多数时候处理器)。
我发现把所有这些控件放在这15个选项卡中的每个选项卡中有点麻烦——很难维护,然后你有一个包含如此多代码的表单,它变得难以导航。
最好创建15个子表单(borderless, TopLevel = false, dock = fill),然后在选择选项卡时加载子表单:
private subform _subForm1 = null;
private subform _subForm2 = null;
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPage.Name == tabPage1.Name)
{
if (_subForm1 == null)
{
_subForm1 = new subform();
tabPage1.Controls.Add(_subForm1);
_subForm1.Show();
}
}
else if (e.TabPage.Name == tabPage2.Name)
{
if (_subForm2 == null)
{
_subForm2 = new subform();
tabPage2.Controls.Add(_subForm2);
_subForm2.Show();
}
}
对于这些表单共享的公共字段,我将创建一个usercontrol。
您可以使用具有两列的简单gridview,并使用标签填充其中一列并保持它们为只读,而另一列用于输入。
除了这里的帖子,我还会添加一个建议:我发现对于这种类型的应用程序,你必须在UI上有很多字段让用户插入它们,这并不意味着你需要提供字段给用户。
我的意思是,如果可能的话,在你的情况下,因为它不清楚,只是不显示每个实体的所有字段,但有它,例如在可扩展的GroupBox(只是一个例子),并显示实际上只有当用户想要填充它与一些数据,如果不是只是留下默认的数据,谁在乎…
如果在你的特定项目中可能的话,这将节省屏幕上的大量UI空间,但更重要的是将使用户免于沮丧地看到屏幕上的所有"混乱",并在那个精确的时刻专注于对他重要的。
希望我能把自己表达清楚。
问候。
好了,我想我已经想出了一个非常优雅的解决方案。
我发现了一个非常漂亮的控件叫做FlowLayoutPanel。默认情况下,这将自动将其内部的所有控件对齐到左上角。当其他控件被隐藏或显示时,这些控件将自动调整。这正是我要找的。
但是,当我想同时添加Label和TextEdit时,我遇到了问题。Label和TextEdit都遵循这个流程,而不是Label位于TextEdit的顶部。标签有一个属性,您可以打开或关闭它是否应该中断流。我一直这样做,直到我发现,当我需要切换各种表单状态时,隐藏和取消隐藏Label以及Label所指向的TextEdit显然会很痛苦。(每个状态必须显示或隐藏可用输入字段的不同选择)所以,我在这里做的是创建一个通用的自定义控件,它有两个面板,都停靠,所以他们可以很好地调整大小。顶部面板包含Label控件。在这个带有Label的基本自定义控件中,我创建了一个公共属性,用于编辑Label的文本。接下来,为了适应各种表单输入类型,我创建了多个自定义控件,它们从带有Label的基本控件继承而来。在这些子控件上,我放置了所需的输入字段——TextEdit、ComboEdit、DateEdit等。每个子控件都有公共属性,用于获取和设置各自输入控件中的值。
现在,它就像添加许多不同的自定义"LabeledField"控件一样简单,我对FlowLayoutPanel进行了调整,并按预期进行调整。现在,我可以只显示或隐藏我需要的那些,并且我不会在所有不同的表单状态中重复任何代码!这类似于Denis Biondic的建议,除了我没有使用表单,而是使用自定义控件。我个人不建议使用表单来做这个,这就是为什么我提供了我自己的答案。
我建议考虑延迟加载其他选项卡,可能在单击选项卡时通过ajax调用,以返回选项卡的整个html。一个类似的ajax方法来保存数据也会很好。您甚至可以对第一个选项卡执行此操作。
这不是微不足道的,但应该意味着加载的html要小得多,但是,您确实需要管理加载和显示