打开基于int的表单

时间:2014-07-27 17:30:58

标签: c# winforms

我刚刚启动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。

谢谢!

4 个答案:

答案 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);
}