如何将表单作为参数传递给方法?(c#)

本文关键字:方法 参数传递 表单 | 更新日期: 2023-09-27 18:02:26

我确定我把标题弄错了(请随意修改),但是示例代码将消除混乱。

我有这样的事情要做:

    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..
    }

谢谢。没有它我也能生活,但如果我能有一个,那就太有帮助了。

编辑:我稍微修改了我的例子,使我的要求更清楚,因为第一个答案并没有完全解决我的问题。道歉。

如何将表单作为参数传递给方法?(c#)

我的问题不是如何让我的程序运行(这将是太琐碎),但如何准确地使用第三个常用函数来显示表单通过传递表单作为参数(如上所述)。

有一种方法可以做到这一点,但它变得更加困难,因为它看起来像你在使用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));)是,表单将只创建,如果你需要做些什么

您可以使用泛型和interface来完成此任务,而无需vs2010和。net 2.0。

接口应该类似于

public interface IAbcForm { public string Abc {get;set;} }

,因为你需要一个属性或setter方法来设置你的参数。

ShowForm方法如下:

private void ShowForm<T>(string parameter) where T:IAbcForm, new
{
    if(parameter == "cat") return;
    var form = new T();
    form.Abc = parameter;
    form.ShowDialog();
}

用法如下:

ShowForm<Form1>("abc");
ShowForm<Form2>("abc");
ShowForm<Form3>("abc");

你的表单必须实现接口:

public class Form1 : Form, IAbcForm
{
    // use backing field when .net 2.0 does not support auto properties
    public string Abc { get;set; }
    public Form1() {}
    // I think your current constructor looks something like this:
    public Form1(string abc) { Abc = abc; }
}

}