如何使用大量可变的输入文本字段管理WinForm?

时间:2011-07-18 19:55:12

标签: c# winforms user-interface

我正在编写一个C#表单,用于将各种条目添加到数据库中。大约有15种不同的类型条目。所有条目类型共享几个常见属性,例如名称,日期,注释等。此外,所有条目类型都有大约10个其他独特的类型属性。

为了避免编写15个单独的表单,每个表单类型一个,我试图在一个表单上完成所有操作。

目前,我正在使用选项卡控件,并将每个条目类型的属性的所有唯一输入字段放到该类型的选项卡控件页面上。我只是将选项卡控件页面更改为所选的条目类型,以显示该条目类型的输入字段。在将条目保存到数据库时,我从这些字段中读取。

我认为必须有更好的方法来做到这一点。这在我的机器上实际上有点慢,我的机器有一个四核处理器!在保存这种形式的同时,Visual Studio甚至有点迟钝。

在运行时是否有任何可行的方法来创建这些动态字段集?

6 个答案:

答案 0 :(得分:2)

也许我完全不理解你,但你尝试过Visual Inheritence概念。创建一个包含您可以提取的所有共享功能的表单,并让您的子表单(继承共享表单的表单)显示详细信息。这不会很慢,我一直都在使用它。

此外,WinForms实际上只会从你的机器硬件中获得很小的好处,因为它和旧的GDI +技术在现代机器上运行时根本没有优化(不是说它很慢,但不要指望任何极端,它不是用于图形密集的东西,它甚至不使用图形卡,处理器大部分时间。)

答案 1 :(得分:1)

我发现在这15个标签中的每个标签中放置所有这些控件都有点麻烦 - 很难维护,然后你有一个包含这么多代码的表单,很难导航。

最好创建15个子表单(无边框,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。

答案 2 :(得分:0)

您可以使用带有两列的简单网格视图,并使用标签填充列并将其保持为只读,而另一列则用于输入。

答案 3 :(得分:0)

除了这里的帖子,我还要添加一个建议:我发现在这种应用程序中你必须在UI上有很多字段让用户插入它们,这并不意味着你需要< strong>向用户提供这些字段。

我的意思是,如果在你的情况下可能导致它在帖子中不明确,只是不显示每个实体的所有字段,而是拥有它,例如在 expandable GroupBox 中(仅一个示例),并且实际上只显示用户想要用一些数据填充它,如果不是只留下默认数据,谁关心......

如果在您的特定项目中有可能,这将在屏幕上节省大量UI空间,但更重要的是让用户免于沮丧地看到所有“混乱”在屏幕上,专注于对他来说很重要的事情 精确的时刻。

希望我能清楚表达自己。

问候。

答案 4 :(得分:0)

好吧,我想我已经提出了一个非常优雅的解决方案。

我发现了一个非常漂亮的控件叫FlowLayoutPanel。默认情况下,这会自动将其内部的所有控件对齐到左上角。当其他控件被隐藏或可见时,控件将自动调整。这正是我所寻找的。

但是,当我想要添加Label和TextEdit时,我遇到了问题。 Label和TextEdit都遵循流程,而不是标签位于TextEdit之上。 Label有一个属性,你可以打开或关闭它是否应该打破流量。我追求这一点,直到它显然隐藏和取消隐藏标签和Label所涉及的TextEdit,当我需要切换各种表单状态时会很痛苦。 (每个州必须显示或隐藏不同的可用输入字段选择)

所以,我在这里做的是创建一个通用的自定义控件,其上有两个面板,两个都停靠,因此它们可以很好地重新调整尺寸。顶部Panel包含Label控件。在这个带有Label的基本自定义控件中,我创建了一个用于编辑Label文本的公共属性。接下来,为了适应各种表单输入类型,我创建了多个自定义控件,这些控件使用Label从基本控件继承。在这些子控件上,我输入了所需的输入字段--TextEdit,ComboEdit,DateEdit等。每个子控件都有公共属性,用于获取和设置各自输入控件中的值。

现在,它就像添加许多不同的自定义“LabeledField”控件一样简单,我对FlowLayoutPanel进行了调整,并按照预期进行调整。现在,我只能显示或隐藏我需要的那些,而且我不会在所有不同形式的状态中重复任何代码!这类似于Denis Biondic的建议,除了我没有使用表单而是使用自定义控件。我认为我个人不建议使用表格,这就是为什么我提供自己的答案。

答案 5 :(得分:-1)

我建议在单击选项卡时,可能通过ajax调用延迟加载其他选项卡,以返回选项卡的整个html。保存数据的类似ajaxed方法也会很好。您甚至可能希望在第一个选项卡中执行此操作。

这不是一件容易的事,但应该意味着加载的html要小得多,但是,你需要管理加载和显示。