我主要是后端开发人员,但我正被置于前端设计中。我正在应用程序中构建一个面板(窗体)。我将根据用户选择的以前参数动态添加/删除表单中的其他项目。例如,面板顶部会有一个客户下拉列表。我需要能够配置用户进行选择后将显示哪些其他下拉菜单。我将至少有90种不同的配置。每个配置都有大约50个参数。在C#中处理这种情况的最佳方法是什么?
我公司的某个人建议为每个配置使用一个新表单,因为我看到人们说要使用用户控件,而其他地方则说要动态地将控件放在列表中并以这种方式生成内容。其中一些建议似乎违反直觉......
有人可以建议一种“正确”的方法吗?从透视角度来看,我之前只构建过一个表单,而且非常简单。 (这是使用.net 4.0的桌面应用程序)
编辑:这是在Winforms中
答案 0 :(得分:0)
这是WinForms还是WPF?
无论如何,你在设计师中做的任何事情,都可以在运行时在你的代码中完成。添加控件只是创建新对象并分配属性:
的WinForms:
Button btn = new Button();
btn.Name = "Dynamic Button";
btn.Id = "DynButton"
btn.Width = 50;
btn.Click = {...};
[...]
panel.Controls.Add(btn); // panel is a parent container control. You have to have a parent for you button.
等。 WPF实际上是相同的 - 控件,父母,容器等。
在你的情况下,你可能有一组最初隐藏的面板,其中包含所有内容,显示/隐藏它们取决于你的流逻辑。
祝你好运!答案 1 :(得分:0)
在设计需要大量组件的表单时,您可以使用各种方法,以便在您发现时获得所需的结果。看看一些可能性......
方法1:为每个配置创建单独的表单
这不是一个坏主意,因为在用户进行选择后,您可以创建所需表单的新实例,但设置所有单个表单将需要一些时间,但并不困难。
方法2:为每个配置创建多个面板
这类似于方法一,除了你最初会隐藏所有面板然后显示用户选择的面板。您可以提前创建面板并隐藏或显示,也可以在运行时以编程方式执行。 (如果你以非编程方式进行面板的话,有点无法让很多组件隐藏在我看来)
方法3;以编程方式创建所需的组件
您可以根据用户选择编写代码以生成所需的组件。
示例:
if(comboBox1.SelectedIndex == 0)
{
ComboBox selection1 = new ComoboBox();
selection1.Location = new Point(XXX,YYY); //Set location
//You can add the events for the combobox, set up the properties
form1.Controls.Add(selection1); //Add the component to the form or panel that you want it displayed on
//Write code to dynamically create next object(s)....
}
else if (comboBox1.SelectedIndex == 1)
{
//Programmatically create components for selection2
}
其中我认为方法1将是最简单的,因为它只是将组件放在表单上,但这将是耗时的。在我看来,以编程方式可能是最优雅的,只要你为不同的可能性保持代码组织良好,并且你没有多种形式或面板来处理。你只是搞乱组件。但是,以编程方式创建组件时,分配属性也很耗时。
我不是百分之百确定最正式的做法是什么,但这只是一些想法。
希望这有帮助。
答案 2 :(得分:0)
不是很多C#家伙,我不能给你示例代码,但根据过去的经验,听起来你正在寻找的是Decorator Pattern。
Decorator模式将允许您在运行时动态创建对象而不是编译时。您可以使用它来创建表单/按钮/根据以前输入的任何内容创建。