3

在我的Main方法中,我UpdateDialog根据用户是否按下按钮来实例化其中的类,我需要function1()Main. 这是代码:

public partial class Main : Form
{
  public void function1()
  {
    doing_stuff_here();
  }

  private void button1_Click(Object sender, EventArgs e)
  {
    var update = new UpdateDialog();
    update.ShowDialog();
  } 
}

public partial class UpdateDialog : Form
{
  private void button2_Click(object sender, EventArgs e)
  {
    //call here function1() from Main
  }
}

我应该怎么做才能function1()Main部分类内部调用UpdateDialog

LE:虽然 Styxxy 建议的方法看起来是对的,但它在我的应用程序中效果不佳,cross-thread invalid operation因此我最终使用了delegate workaroundCuong Le 建议的方法。

4

8 回答 8

15

您必须在Main表单中有一个表单实例UpdateDialog。正如您所说,UpdateDialog 是主窗体的子窗体,我想您在主窗体中创建 UpdateDialog 并在那里进行展示。在显示该表单之前,您可以分配Parent属性

var updateDialog = new UpdateDialog();
// Or use "UpdateDialog updateDialog = new UpdateDialog();" as people like Andreas Johansson don't like the "var" keyword
// Do other stuff here as well
updateDialog.Parent = this;
// Or use Show() for non modal window
updateDialog.ShowDialog();

你得到错误ArgumentException: Top-level control cannot be added to a control.。现在这可以通过两种方式解决。

  1. 您可以在主窗体上将TopLevel属性设置为false(我不是这个的超级粉丝)。
  2. 您可以在Owner主窗体 ( this) 中使用该属性。下面有两种方法。

您可以Owner手动设置:

updateDialog.Owner = this;

或者您可以将this作为参数添加到Show(owner)orShowDialog(owner)方法;这样,Owner也正在设置中。

updateDialog.Show(this);
// or
updateDialog.ShowDialog(this);

“完整”代码使这个:

var updateDialog = new UpdateDialog();
// Do other stuff here as well
updateDialog.Owner= this;
updateDialog.ShowDialog(); // or use .Show()
// or
updateDialog.ShowDialog(this); // or use .Show(this)
于 2012-10-24T07:23:00.807 回答
4

我建议您创建一个事件,UpdateDialog然后在类中创建一个实例后订阅它Main。这样,您可以更好地分离这两个类。

public partial class Main
{
    public void function1()
    {
        doing_stuff_here();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var update = new UpdateDialog();
        update.OnButton2Click += OnUpdateDialogButton2Click;

        update.ShowDialog();
    }

    void OnUpdateDialogButton2Click(object sender, EventArgs e)
    {
        function1();
    }
}

public partial class UpdateDialog
{
    public event EventHandler<EventArgs> OnButton2Click;

    private void button2_Click(object sender, EventArgs e)
    {
        //call here function1() from Main  

        if (OnButton2Click != null)
        {
            this.OnButton2Click(this, e);
        }
    }
}
于 2012-10-24T07:26:51.587 回答
3

将类实例传递Main给您的更新表单并将其存储在实例变量中 -

Main mainWindow = null;
public UpdateDialog(Main mainForm)
{
   mainWindow = mainForm;
}

private void button2_Click(object sender, EventArgs e)
{
   mainWindow.function1();
}

而从主要方法 -

private void button1_Click(Object sender, EventArgs e)
{
    var update = new UpdateDialog(this);
    update.ShowDialog();
}
于 2012-10-24T07:24:41.623 回答
2

你可以把它转过来,让主窗体监听来自 UpdateDialog 的点击。

在主要:

private void button1_Click(Object sender, EventArgs e)
{
    var update = new UpdateDialog();
    update.OnSomethingClicked += function1;
    update.ShowDialog();
} 

void form_OnSomethingHappened(object sender, EventArgs e)
{
    // Do the stuff you want
}

在更新对话框中:

public event EventHandler OnSomethingHappened;

private void button2_Click(object sender, EventArgs e)
{
     EventHandler handler = OnSomethingHappened;
     if (handler != null) handler(this, e);
}
于 2012-10-24T07:29:19.980 回答
1

ShowDialog() 方法返回一个 DialogResult,您可以在对话框关闭后调用 function1 之一。

http://msdn.microsoft.com/en-us/library/c7ykbedk.aspx

于 2012-10-24T07:26:23.277 回答
0

可以像引用一样传递 Main 类。

例如:

public partial class Main : Form
{
     //make it internal, if UpdateDialog in the same assembly, and it only one that        would use it. In other words hide it for outside world.
     internal void function1()  
     {
         doing_stuff_here();
     }
 ....
}


public partial class UpdateDialog : Form        
{
      private MainForm _main = null;
      public UpdateDialog (MainForm main) { //Accept only MainForm type, _not_ just a Form
        _main = main;
      }

      private void button2_Click(object sender, EventArgs e)
      {
            _main.function1(); //CALL
      }
}

像这样的东西。您可以根据您的精确要求更改此设置,但这是一个普遍的想法。

于 2012-10-24T07:26:42.120 回答
-1

方法#1

您需要创建一个类的实例Main

Main foo = new Main();
foo.function1();

方法#2

您需要将该方法声明为静态。

public static function1(){ ... }
....
Main.function1();
于 2012-10-24T07:23:44.660 回答
-1

您可以使您的 function1 成为 Partial 方法,这样您就可以在所有部分类中使用它。

部分方法允许方法的定义位于一个文件中,而方法的主体可以选择性地定义在另一个文件中。它们只能在部分类中使用,并在 C# 3.0 和 Visual Basic 9.0(随 .NET Framework 3.5 和 Visual Studio 2008 附带的版本)中作为语言功能引入。

所以你可以做的就是这样修改

public partial class Main : Form

        {
            public partial void function1()
            {
                doing_stuff_here();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                var update = new UpdateDialog();
                update.ShowDialog();
            }   
        }

public partial class UpdateDialog : Form
        {
            public partial void function1();
            private void button2_Click(object sender, EventArgs e)
            {
            function1();
            }
        }
于 2012-10-24T07:30:54.843 回答