我确定我的标题错得离谱(请随意改正),但示例代码会消除混淆。
我有这样的事情要做:
private void a_Click(object sender, EventArgs e)
{
if (abc = "cat")
return;
Form1 f = new Form1(abc);
f.ShowDialog()
}
private void b_Click(object sender, EventArgs e)
{
if (abc = "cat")
return;
Form2 f = new Form2(abc);
f.ShowDialog()
}
private void c_Click(object sender, EventArgs e)
{
if (abc = "cat")
return;
Form3 f = new Form3(abc);
f.ShowDialog()
}
现在我如何编写一个方法来通过传递表单类本身来显示这样的表单。还是我破坏了类和对象的概念?像这样:
private void ShowForms(Form F)
{
if (abc = "cat")
return;
F f = new F(abc);
f.Showdialog();
}
然后
private void a_Click(object sender, EventArgs e)
{
ShowForms(Form1); // I cant pass string abc from here..
}
谢谢。没有它我也能活下去,但如果我能拥有它会很有帮助。
编辑:我稍微修改了我的示例以使我的要求更清楚,因为第一个答案并没有完全解决我的问题。抱歉。
EDIT2:我的问题不是如何让我的程序运行(那太微不足道了),而是如何通过将表单作为参数传递(如上所述)来精确地使用第三个常用函数来显示表单。
最佳答案
有一种方法可以做到这一点,但它变得更难,因为它看起来像你使用的是 C# v2(从问题的标签)。
更改您的 ShowForms
方法以接受 Func
的实例,该实例可以使用提供的参数创建 Form
的实例:
private void ShowForms(Func<string, Form> formCreator)
{
if (abc == "cat")
{
return;
}
Form form = formCreator(abc);
form.ShowDialog();
}
然后您可以调用它传递一个 Func
的实例,该实例将用于创建每个单独的表单实例:
private void a_Click(object sender, EventArgs e)
{
ShowForms(p => new Form1(p));
}
private void b_Click(object sender, EventArgs e)
{
ShowForms(p => new Form2(p));
}
因为您使用的是 C# v2,所以您还需要声明 Func
定义:
public delegate TResult Func<TParameter, TResult>(TParameter parameter);
如果您可以使用更高版本的 C#,则不需要声明这最后一部分。 然而,您将需要使用更高版本的编译器来编译它(VS2010 应该没问题)——它利用了更高版本的编译器理解 lamda 语法这一事实。
这样做的好处不是仅仅创建表单并将其传入(例如 ShowForms(new Form1(abc));
)是表单只会在您需要时创建用它做点什么。
关于c# - 如何将表单作为参数传递给方法? (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6727232/