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()から呼び出すことができるようにするにはどうすればよいですか?MainUpdateDialog

LE:Styxxyによって提案された方法は正しいように見えますが、それが原因で私のアプリではうまく機能しないため、 CuongLeによって提案された方法cross-thread invalid operationを使用するdelegate workaroundことになりました。

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.。これは2つの方法で解決できます。

  1. TopLevelメインフォームでプロパティをに設定できfalseます(私はこれの大ファンではありません)。
  2. Ownerこのプロパティをメインフォーム( )に使用できますthis。それを行う2つの方法を以下に示します。

Owner手動で設定できます。

updateDialog.Owner = this;

または、またはメソッドthisにパラメーターとして追加できます。このように、も設定されています。Show(owner)ShowDialog(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このようにして、これら2つのクラスをより適切に分離できます。

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
}

UpdateDialogの場合:

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()メソッドは、ダイアログが閉じられた後にfunction1を呼び出すことができるDialogResultを返します。

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メソッドにすることができ、このようにしてすべての部分クラスで使用できます。

部分メソッドを使用すると、メソッドの定義を1つのファイルに配置し、メソッドの本体をオプションで別のファイルに定義できます。これらは部分的なクラスでのみ使用でき、.NET Framework3.5およびVisualStudio2008に付属しているバージョンであるC#3.0およびVisualBasic9.0で言語機能として導入されました。

だからあなたができることはこのように変更することです

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 に答える