【问题标题】:C# Call a method from a different form class?C#从不同的表单类调用方法?
【发布时间】:2016-01-16 13:34:38
【问题描述】:

好的,所以我在一个类中有一个方法,我正在尝试从另一个类中调用它。

表格1:

    public void ChangeBack(Color clr)
    {
        this.BackColor = clr;
    }

表格2:

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

但我需要将 ChangeBack 方法设为静态才能调用它。所以:

表格1:

    public static void ChangeBack(Color clr)
    {
        this.BackColor = clr;
    }

但是我不能使用“this”。因为 void 不允许它,因为它是静态的。而且我无法创建新的 form1,因为它需要在两个窗口中整体运行。

请帮忙!C

【问题讨论】:

  • 主要形式是哪一种?

标签: c# .net winforms class methods


【解决方案1】:

当您使用多个表单时,您需要传递对第二个表单的引用,以便它“了解”第一个表单。为此,您需要更改第二个表单的构造函数,并添加对该表单的私有引用,如下所示:

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)”下说 “Form 不包含“ChangeBack”的定义
  • @NumNumDude 好的,我已经解决了这个问题,将Form2 类更改为_ParentForm,而不是Form,并将Form2 的构造函数更改为一样的。
  • 这里只是对遇到此问题的任何其他人的支持说明 - 确保方法/功能保护级别设置为“公共”,因为私有的将使其无法访问第二种形式。跨度>
【解决方案2】:

如果您使用 2 个不同的 WinForm 窗口,您应该简单地将引用从一个窗口传递到另一个窗口(通常使用构造函数)。例如:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 2013-02-17
      相关资源
      最近更新 更多