3

我正在创建一个实用程序,该实用程序需要足够灵活以使用用户输入的不同类型的数据。不仅仅是不同的数据,因为一个用户可能会输入“Rory Gallagher”另一个“Merle Travis”另一个“Louis Jordan”和另一个“Gatemouth Brown”。

更像是一个用户会输入“Rory Gallagher”另一个“42”和另一个同时输入日期(例如 9/8/1956)和 ID 值(例如“00034872184”)。

所以问题出在 GUI 上:我怎样才能“换掉”提示他们输入的表单部分?创建几个 99% 相同的实用程序似乎有点矫枉过正。但是应用程序的某些“版本”只需要一个“输入一些值”标签和一个文本框,而另一个可能需要提示它们输入两条甚至更多条信息。

我不想在表单上有一个“输入数据”按钮来调用另一个表单,因为当用户只需要输入一个信息时,这看起来很奇怪。

我在想策略模式可能会在我的未来出现,但 GUI 部分仍然是个难题。如果我们使用 WPF 会更容易,但我们不是。我想我仍然可以留出足够大的表格部分以包含“最大”场景,但这是最好的方法吗?

更新

我尝试了以下建议:

我在表单中添加了一个面板,并通过 Add | 创建了一个用户控件。UserControl 并尝试了这个:

panel1.Controls.Add(UserControl1);
UserControl1.Dock = DockStyle.Fill; 

...但遭遇了史诗般的失败(“'PlatypiRUs.UserControl1' 是一个'类型',但用作'变量'”和“非静态字段、方法或属性'System. Windows.Forms.Control.Dock.get'")

再次更新

现在有了史诗般的成功:

UserControl1 usr1 = new UserControl1();
panel1.Controls.Add(usr1);
usr1.Dock = DockStyle.Fill;
4

2 回答 2

4

我建议将不同的用户控件动态加载到表单的该部分。为了设计时的简单性,您可以在动态控件所在的位置放置一个面板,然后在打开停靠的情况下将其加载到该面板中,这样它就可以填满整个面板。然后,您可以为您需要的每组数据输入字段创建一个单独的用户控件。例如,如果您有一个名为 pnlCustom 的面板控件,您可以在表单的加载事件(或任何有意义的地方)中执行以下操作:

UserControl1 customControl = new UserControl1();
pnlCustom.Controls.Add(customControl);
customControl.Dock = DockStyle.Fill;
于 2012-06-06T13:37:03.460 回答
1

在我看来,这是一种建造者模式。

基本上,将您的表单视为“两步视图”,这意味着以下内容:

  • 想出定义表单元素的结构(例如文本框、下拉菜单等),
  • 实现一个抽象视图构建器(第一步构建器),以便在不同情况下生成不同的结构(请记住,该结构是通用的,不必涉及具体的 UI 组件,只需一个定义它们的结构),
  • 为结构必须不同的所有情况实施抽象构建器,
  • 然后实现 UI builder,它采用通用结构并构建 UI 组件。基本上,此构建器只是将通用结构转换为特定于平台的 UI 组件(例如 win-forms 文本框或 Html 输入)。

下一步显然是处理数据。为此,您有一个抽象处理器,然后是每种情况的具体实现(类似于上面的第一步构建器)。

现在很清楚,UI 构建和数据处理可以 1 对 1 关联,这意味着情况是工厂,它产生视图构建器和数据处理器。

伪代码如下所示:

// construct the view.
var factory = Situation.GetCurrentSituationFactory(); //abstract factory.
var uiBuilder = factory.GetUIBuilder(); //abstract builder
var structure = uiBuilder.GetFormStructure([context goes here]); //build view definition
var viewParser = Platform.GetViewParser(); //abstract builder (step 2)
viewParser.ConstructForm([context with form goes here]); //build form UI

// later on, process the input data.
var input = viewPrser.GetInput([context with form goes here]); //input definition
var dataProcessor = factory.GetDataPocessor(); //strategy
dataProcessor.Process(input); //execute processing strategy

此外,这与动态控件或您要用于构造表单的任何其他内容不冲突。只需正确实现您的抽象问题。

于 2012-06-06T13:57:29.570 回答