C#如何在不同的窗体类中调用方法?

3
好的,所以我有一个类中的方法,我正在尝试从另一个类中调用它。
Form1:
    public void ChangeBack(Color clr)
    {
        this.BackColor = clr;
    }

Form2:
    public void ChangBackColor_Click(object sender, EventArgs e)
    {
        if (ColorDialog.ShowDialog() == DialogResult.OK)
        {
            Form1.ChangeBack(ColorDialog.Color);
        }
    }

但我需要将ChangeBack方法改为静态方法才能调用它。因此:
Form1:
    public static void ChangeBack(Color clr)
    {
        this.BackColor = clr;
    }

但是,我不能使用“this.”,因为void不允许它,因为它是静态的。而且我也不能创建一个新的form1,因为它需要在两个窗口中运行。请帮帮我!

哪一个是主窗体? - John Alexiou
3个回答

3
当您使用多个表单时,需要传递对第二个表单的引用,以便它“知道”第一个表单。为此,您需要更改第二个表单的构造函数,并添加对该表单的私有引用,例如:
当你使用多个表单时,你需要传递一个引用到第二个表单,这样它就可以“了解”第一个表单。为此,你需要改变第二个表单的构造函数,并添加一个对该表单的私有引用,如下所示:
class Form2 : Form
{
    //Variables
    private Form1 _ParentForm; //Add this here

    //Constructor
    public Form2(Form1 parentForm)
    {
        InitalizeComponent();
        _ParentForm = parentForm; //Add this here
    }
}

当您在主表单上创建第二个表单时,您可以使用this将自身的引用传递给新表单:
class Form1 : Form
{

    public void ChangeBack(Color clr) //No longer needs to be static
    {
        this.BackColor = clr;
    }

    public void CreateSecondForm()
    {
        Form2 secondForm = new Form2(this);
        secondForm.Show();
    }
}

然后,您可以像下面这样从第二个表单调用父表单(即Form1)上的任何函数:

public void ChangBackColor_Click(object sender, EventArgs e)
{
    if (ColorDialog.ShowDialog() == DialogResult.OK)
    {
        //Access Form1's reference with _ParentForm instead of Form1
        _ParentForm.ChangeBack(ColorDialog.Color);
    }
}

我按照你说的做了,但在colorDialog部分出现了错误。它在"_ParentForm.ChangeBack(ColorDialog.Color)"下面说“表单不包含“ChangeBack”的定义” - Xephyr
@NumNumDude 好的,我已经解决了那个问题,将 Form2 类更改为 _ParentForm 作为 Form1 而不是仅仅使用 Form,并将 Form2 的构造函数更改为相同的方式。 - Shadow
这里只是为了支持其他遇到此问题的人而提供一条提示 - 确保方法/函数的保护级别设置为“public”,因为私有级别会使其对第二个表单不可访问。 - IamSierraCharlie

2

如果你在使用两个不同的WinForm窗口,你应该简单地从一个窗口传递一个引用到另一个窗口(通常使用构造器)。例如:

var childForm = new ChildForm(this); // where this is your main WinForm

之后,您可以使用对主WinForm的引用来调用其方法。


0

没错,您不能将该方法设置为静态的并访问对象实例。

BackColor更改为静态属性,或将您的方法更改为非静态方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接