基于int的开放表单

本文关键字:表单 int 基于 | 更新日期: 2023-09-27 18:15:10

我刚刚开始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,但如上所述,我想打开form+problemNumber。

谢谢!

基于int的开放表单

一种可能性是创建一个静态类,它有一个带有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类型,并将相应的表单放入其中:

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!

我制作了一个小的示例应用程序来根据名称查找表单。查找表单的代码是

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();
}

可能有比使用类名更好的方法来处理启动多个表单。不过,这里有一些代码可以满足您的要求,展示如何调用除了Show之外的其他方法。改变"yourNamespace。"

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

您可以创建一个简单的方法,它接受表单的名称(您可以将名称空间更改为项目的名称,我只是使用默认的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();