我刚刚启动Project Euler,我已经遇到了第一个问题。我想为每个欧拉问题都有一个单独的表格,但我无法弄清楚如何以一种好的方式打开表格。我想要做的是使用变量problemNumber打开一个表单。例如,如果我将problemNumber设置为54并按下按钮,则应打开form54。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int problemNumber = int.Parse(numericUpDown1.Text);
}
}
}
我知道如何打开特定表单,例如form2。
form2 f2 = new form2();
f2.Show();
这会打开form2,但如上所述,我想打开表单+ problemNumber。
谢谢!
答案 0 :(得分:2)
一种可能性是创建一个静态类,它有一个带有switch case的静态方法并返回一个Form
对象。在该方法中,您可以创建有关指定数字的新表单对象:
public static class FormStarter
{
public static Form OpenForm(int formNumber)
{
Form form = null;
switch (formNumber)
{
case 1: form = new Form1(); break;
case 2: form = new Form2(); break;
//case 3: form = new Form3(); break;
// ...
default: throw new ArgumentException();
}
return form;
}
}
然后你可以使用这样的类:
var f = FormStarter.OpenForm(2);
f.ShowDialog(); // Form2 is started!
获得新表单后,您只需要在一个方法中添加实例的创建 - OpenForm
。
没有静态类的另一种可能的解决方案是保存数字的Dictionary
对象和这样的表单实例:
Dictionary<int, Form> forms = new Dictionary<int, Form>();
forms.Add(1, new Form1());
forms.Add(2, new Form2());
forms[2].ShowDialog(); // Form2 is started!
如果您只想在字典中引用表单的类型并仅在需要时创建实例,则将字典的值更改为Type
类型并将相应的表单放入其中:< / p>
Dictionary<int, Type> forms = new Dictionary<int, Type>();
forms.Add(1, typeof(Form1));
forms.Add(2, typeof(Form2));
((Form)Activator.CreateInstance(forms[2])).ShowDialog(); // Form2 is started!
答案 1 :(得分:1)
我已经制作了一个小型示例应用程序来按名称查找表单。找到表单的代码是
var types = Assembly.GetExecutingAssembly().GetTypes();
var targetForm = types.FirstOrDefault(t => t.IsClass && t.Name == string.Format("Form{0}", formNumber);
if (targetForm != null)
{
var form = (Form)Activator.CreateInstance(targetForm);
form.ShowDialog();
}
答案 2 :(得分:0)
您可以创建一个简单的方法来获取表单的名称(您可以将名称空间更改为项目的名称,我只使用了默认的WindowsFormApplication1
)。然后,您可以为每个表单命名Project{x}
。
public static Form GetForm(string id)
{
return Assembly.GetExecutingAssembly().CreateInstance(String.Format("WindowsFormsApplication1.Project{0}", id)) as Form;
}
并像这样使用
Form firstProjectForm = GetForm("1");
if(firstProjectForm != null)
firstProjectForm.Show();
答案 3 :(得分:0)
与使用类名相比,可能有更好的方法来处理启动多个表单。但是,这里有一些代码可以完成您的要求,显示如何调用除Show之外的其他方法。更改&#34; yourNamespace。&#34;
using System.Reflection;
Type t = Type.GetType("yourNamespace.Form" + numericUpDown1.Text);
if (t!=null)
{
object instance = Activator.CreateInstance(t);
MethodInfo mI = t.GetMethod("Show", new Type[0]);
mI.Invoke(instance, null);
}