C#方法通过字符串动态生成表单
C# Method makes forms dynamically via string
第一次post在这里,如果我在post中有任何错误,请告诉我,以便我可以修复它
所以我试图让 类 处理大部分代码,我想做的一件事就是让一个人处理所有表单实例的打开和制作。对已经存在的实例执行 .Show();
很简单,因为我知道它们的创建顺序我可以 Form _form = Application.OpenForms[i];
来获取实例,但是当它还没有创建时我找不到处理的方法有了它,我读了一点,但找不到真正适合我想做的事情,一些关于反射的东西似乎是正确的道路,但无法让它发挥作用,所以这件事的一些亮点会不胜感激。
简而言之,我正在尝试做类似的事情:
(我知道类似的事情是不可能的,但我认为这是准确解释我所寻求的最简单的方法。我所做的一个解决方法是让代码将每个表格生成到一个开关中,然后只发送它们的号码,所以这就是如果我找不到更好的解决方案,我会使用,但我想学习一种“proper/cleaner”实现此目的的方法)
static public bool MakeForm(string name)
{
name _name = new name();
_name.Show();
}
[编辑:我意识到这与我的项目无关,因为我可以在登录时准备好每一个表单,但我仍然希望知道如何做到这一点,如果你们能告诉我如何做的话to/where阅读]
我不确定我是否理解正确,但我认为你需要一个工厂 class。
public static class Factory
{
public static Form Create(string name)
{
switch (name)
{
case "FormA":
return new FormA();
case "FormB":
return new FormB();
}
}
}
然后您可以按名称创建表单。
Factory.Create("FormA").Show();
下面是一个使用反射方法的简单示例:
private void button1_Click(object sender, EventArgs e)
{
Form f2 = TryGetFormByName("Form2");
if (f2 != null)
{
f2.Show();
}
}
public Form TryGetFormByName(string formName)
{
var formType = System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
.Where(T => (T.BaseType == typeof(Form)) && (T.Name == formName))
.FirstOrDefault();
return formType == null ? null : (Form)Activator.CreateInstance(formType);
}
这是检查表单是否已打开的替代版本:
public Form TryGetFormByName(string formName)
{
// See if it's already open:
foreach (Form frm in Application.OpenForms)
{
if (frm.Name == formName)
{
return frm;
}
}
// It's not, so attempt to create one:
var formType = System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
.Where(T => (T.BaseType == typeof(Form)) && (T.Name == formName))
.FirstOrDefault();
return formType == null ? null : (Form)Activator.CreateInstance(formType);
}
第一次post在这里,如果我在post中有任何错误,请告诉我,以便我可以修复它
所以我试图让 类 处理大部分代码,我想做的一件事就是让一个人处理所有表单实例的打开和制作。对已经存在的实例执行 .Show();
很简单,因为我知道它们的创建顺序我可以 Form _form = Application.OpenForms[i];
来获取实例,但是当它还没有创建时我找不到处理的方法有了它,我读了一点,但找不到真正适合我想做的事情,一些关于反射的东西似乎是正确的道路,但无法让它发挥作用,所以这件事的一些亮点会不胜感激。
简而言之,我正在尝试做类似的事情: (我知道类似的事情是不可能的,但我认为这是准确解释我所寻求的最简单的方法。我所做的一个解决方法是让代码将每个表格生成到一个开关中,然后只发送它们的号码,所以这就是如果我找不到更好的解决方案,我会使用,但我想学习一种“proper/cleaner”实现此目的的方法)
static public bool MakeForm(string name)
{
name _name = new name();
_name.Show();
}
[编辑:我意识到这与我的项目无关,因为我可以在登录时准备好每一个表单,但我仍然希望知道如何做到这一点,如果你们能告诉我如何做的话to/where阅读]
我不确定我是否理解正确,但我认为你需要一个工厂 class。
public static class Factory
{
public static Form Create(string name)
{
switch (name)
{
case "FormA":
return new FormA();
case "FormB":
return new FormB();
}
}
}
然后您可以按名称创建表单。
Factory.Create("FormA").Show();
下面是一个使用反射方法的简单示例:
private void button1_Click(object sender, EventArgs e)
{
Form f2 = TryGetFormByName("Form2");
if (f2 != null)
{
f2.Show();
}
}
public Form TryGetFormByName(string formName)
{
var formType = System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
.Where(T => (T.BaseType == typeof(Form)) && (T.Name == formName))
.FirstOrDefault();
return formType == null ? null : (Form)Activator.CreateInstance(formType);
}
这是检查表单是否已打开的替代版本:
public Form TryGetFormByName(string formName)
{
// See if it's already open:
foreach (Form frm in Application.OpenForms)
{
if (frm.Name == formName)
{
return frm;
}
}
// It's not, so attempt to create one:
var formType = System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
.Where(T => (T.BaseType == typeof(Form)) && (T.Name == formName))
.FirstOrDefault();
return formType == null ? null : (Form)Activator.CreateInstance(formType);
}