首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何有条件地换出表单中的“用户输入”部分?

如何有条件地换出表单中的“用户输入”部分?
EN

Stack Overflow用户
提问于 2012-06-06 21:34:08
回答 2查看 215关注 0票数 3

我正在创建一个实用程序,它需要足够灵活,以便使用用户输入的不同类型的数据。不只是不同的数据,因为一个用户可能输入"Rory Gallagher“、另一个"Merle Travis”、另一个“路易斯·乔丹”和另一个"Gatemouth“。

更像是一个用户输入"Rory Gallagher“,另一个用户输入"42”,另一个用户输入日期(如1956年9月8日)和ID值(如"00034872184")。

所以问题出在GUI上:我如何“换出”表单中提示用户输入的部分?创建几个99%相同的实用程序似乎有点夸张。但一些“版本”的应用程序只需要一个“输入一些值”标签和一个TextBox,而另一个可能需要提示他们输入两条甚至更多的信息。

我不希望在表单上有一个调用另一个表单的“输入数据”按钮,因为当用户只需要输入一小部分信息时,这似乎很奇怪。

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

更新

我尝试了下面的建议:

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

代码语言:javascript
运行
复制
panel1.Controls.Add(UserControl1);
UserControl1.Dock = DockStyle.Fill; 

...but遭遇了巨大的失败("'PlatypiRUs.UserControl1‘是一个’类型‘,但像’variable‘一样使用“”,并且“非静态字段、方法或属性’System.Windows.Forms.Control.Dock.get‘需要一个对象引用”)

再次更新

现在取得了史诗般的成功:

代码语言:javascript
运行
复制
UserControl1 usr1 = new UserControl1();
panel1.Controls.Add(usr1);
usr1.Dock = DockStyle.Fill;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-06 21:37:03

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

代码语言:javascript
运行
复制
UserControl1 customControl = new UserControl1();
pnlCustom.Controls.Add(customControl);
customControl.Dock = DockStyle.Fill;
票数 4
EN

Stack Overflow用户

发布于 2012-06-06 21:57:30

在我看来,这是一个构建器模式。

基本上,可以将您的表单看作一个“两步视图”,这意味着:

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

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

现在很明显,UI构造和数据处理可以一一对应,这意味着情况是一个工厂,它生产视图构建器和数据处理器。

伪代码将如下所示:

代码语言:javascript
运行
复制
// 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

此外,这不会与动态控件或要用来构造窗体的任何其他内容冲突。只要正确实现您的抽象关注点即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10915293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档