【问题标题】:Call a method from another form从另一个表单调用方法
【发布时间】:2012-10-15 07:06:10
【问题描述】:

我尝试从另一个表单调用一个方法。我的尝试:

public partial class newLedPopUp : Form
{
    Form1 back = new Form1();
    back.output();
    Close();
}

public partial class Form1 : Form
{
    newLedPopUp popup = new newLedPopUp();

    public void output()
    {
        button3_Click(null, null);
    }
}

有人可以帮助我吗?我真的找不到我的错误,我已经找了很长时间了。

【问题讨论】:

  • 那么错误信息是什么?
  • 没有错误信息,但在调试器中没有执行输出

标签: c# winforms


【解决方案1】:

您可能需要一个已经打开的表单的实例并从那里调用方法,而不是创建一个新表单的实例。你可以试试:

if (System.Windows.Forms.Application.OpenForms["yourForm"] != null)
    {
        (System.Windows.Forms.Application.OpenForms["yourForm"] as Form1).Output();
    }

另外,您可以通过将事件代码放在单独的方法中,然后针对您的按钮单击事件或公共输出方法调用该方法来替换在您的 Output 方法中调用 button3_Click(null,null)

【讨论】:

  • 它有效.. 我从来没有听说过 Application.Openforms 类...谢谢你:)
  • @Pengu,不客气,Application.OpenForms 是 Application 类的属性
  • +1 我也从未听说过 Application.OpernForms[""],一定是在你的新项目中学到的 ;)。
  • 这很好用,但它是标准/唯一访问表单打开实例的方法吗?
  • 在“if statement”里面“your Form”应该用什么代替?
【解决方案2】:

您在调用output 方法后立即关闭Form1。因此,我假设您在那里有一些与业务相关的或数据访问逻辑。尝试将在button3_Click 事件处理程序上执行的代码移动到分离对象

public class Foo
{
    public void Output()
    {
       // move here button3_Click code
    }
}

然后创建 Foo 并将其传递给两个表单(或者您可以在没有依赖注入的情况下在表单中实例化它)

Foo foo = new Foo();
Form1 form1 = new Form1(foo);
LedPopUp form2 = new LedPopUp(foo);

并像这样使用它:

public partial class Form1 : Form
{
     private Foo _foo;
     // without dependency injection: private Foo _foo = new Foo();         

     public Form1(Foo foo)
     {
         _foo = foo;
     }

     protected void button3_Click(object sender, EventArgs e)
     {
         _foo.Output();
     }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    相关资源
    最近更新 更多