49

子フォームから親フォームに値を渡すにはどうすればよいですか? 親に返したい文字列があります。

次を使用して子を起動しました:

FormOptions formOptions = new FormOptions();
formOptions.ShowDialog();
4

13 に答える 13

66

でプロパティ(またはメソッド)を作成しますFormOptions。たとえば、次のようにしますGetMyResult

using (FormOptions formOptions = new FormOptions())
{
    formOptions.ShowDialog();

    string result = formOptions.GetMyResult;

    // do what ever with result...
}
于 2008-11-11T10:52:13.213 に答える
36

formOptions を使用して単一の値を選択してから閉じるだけの場合は、Mitch の提案が適しています。ここでの私の例は、子供が開いたまま親に通信する必要がある場合に使用されます。

親フォームに、子フォームが呼び出すパブリック メソッドを追加します。

public void NotifyMe(string s)
{
    // Do whatever you need to do with the string
}

次に、親ウィンドウから子ウィンドウを起動する必要がある場合は、次のコードを使用します。

using (FormOptions formOptions = new FormOptions())
{
    // passing this in ShowDialog will set the .Owner 
    // property of the child form
    formOptions.ShowDialog(this);
}

子フォームで、次のコードを使用して値を親に返します。

ParentForm parent = (ParentForm)this.Owner;
parent.NotifyMe("whatever");

この例のコードは、メイン フォームの上に浮かぶように意図されたツールボックス ウィンドウのようなものに使用することをお勧めします。この場合、.ShowDialog() の代わりに .Show() を使用して、(.TopMost = true で) 子フォームを開きます。

このような設計は、子フォームが親フォームに緊密に結合されていることを意味します (子は NotifyMe メソッドを呼び出すために、その所有者を ParentForm としてキャストする必要があるため)。ただし、これは自動的に悪いことではありません。

于 2008-11-11T11:47:44.707 に答える
23

パブリック プロパティを作成することもできます。

// Using and namespace...

public partial class FormOptions : Form
{
    private string _MyString;    //  Use this
    public string MyString {     //  in 
      get { return _MyString; }  //  .NET
    }                            //  2.0

    public string MyString { get; } // In .NET 3.0 or newer

    // The rest of the form code
}

次に、次の方法で取得できます。

FormOptions formOptions = new FormOptions();
formOptions.ShowDialog();

string myString = formOptions.MyString;
于 2008-11-11T11:10:26.017 に答える
10

結果を返す out パラメータを取得する子クラスに ShowDialog のオーバーロードを作成することもできます。

public partial class FormOptions : Form
{
  public DialogResult ShowDialog(out string result)
  {
    DialogResult dialogResult = base.ShowDialog();

    result = m_Result;
    return dialogResult;
  }
}
于 2008-11-11T12:13:13.893 に答える
3

子フォームのパブリック プロパティを使用する

frmOptions {
     public string Result; }

frmMain {
     frmOptions.ShowDialog(); string r = frmOptions.Result; }

イベントを使用する

frmMain {
     frmOptions.OnResult += new ResultEventHandler(frmMain.frmOptions_Resukt);
     frmOptions.ShowDialog(); }

メイン フォームのパブリック プロパティを使用する

frmOptions {
     public frmMain MainForm; MainForm.Result = "result"; }

frmMain {
     public string Result;
     frmOptions.MainForm = this;
     frmOptions.ShowDialog();
     string r = this.Result; }

オブジェクト Control.Tag を使用します。これは、System.Object を含むことができるすべてのコントロールのパブリック プロパティに共通です。そこに文字列、MyClass、または MainForm を保持できます。

frmOptions {
     this.Tag = "result": }
frmMain {
     frmOptions.ShowDialog();
     string r = frmOptions.Tag as string; }
于 2008-12-27T15:54:43.103 に答える
1

子フォームをモーダル ダイアログ ボックスとして表示している場合、子フォームの DialogResult プロパティに DialogResult 列挙の値を設定すると、モーダル ダイアログ ボックスが非表示になり、コントロールが呼び出し元のフォームに返されます。この時点で、親は子フォームのデータにアクセスして、必要な情報を取得できます。

詳細については、次のリンクを確認してください: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult(v=vs.110).aspx

于 2014-02-22T02:06:33.043 に答える
1

ピクロフォEDYの場合

フォームを表示する方法としてを使用しShowDialog()、フォームを閉じる場合は、 の代わりに閉じるボタンを使用しますthis.Close()。フォームは破棄または破棄されません。非表示になるだけで、削除後に変更を加えることができます。適切に閉じるには、Dispose()orClose()メソッドが必要です。一方、Show()メソッドを使用して閉じると、フォームは破棄され、後で変更できなくなります。

于 2012-11-29T12:22:35.017 に答える
1

私は同じ問題を抱えていたので、そのように解決しました。初心者向けのステップバイステップの説明があります

最初に子フォームのオブジェクトをフォームクラスの一番上に作成し、次にそのオブジェクトを子フォームの表示や値の読み取りなどの子フォームのすべての操作に使用します。

namespace ParentChild
{
   // Parent Form Class
    public partial class ParentForm : Form
    {
        // Forms Objects
        ChildForm child_obj = new ChildForm();


        // Show Child Forrm
        private void ShowChildForm_Click(object sender, EventArgs e)
        {
            child_obj.ShowDialog();
        }

       // Read Data from Child Form 
        private void ReadChildFormData_Click(object sender, EventArgs e)
        {
            int ChildData = child_obj.child_value;  // it will have 12345
        }

   }  // parent form class end point


   // Child Form Class
    public partial class ChildForm : Form
    {

        public int child_value = 0;   //  variable where we will store value to be read by parent form  

        // save something into child_value  variable and close child form 
        private void SaveData_Click(object sender, EventArgs e)
        {
            child_value = 12345;   // save 12345 value to variable
            this.Close();  // close child form
        }

   }  // child form class end point


}  // name space end point
于 2019-06-27T09:39:37.717 に答える
0

ShowDialog()またはメソッドを使用してShow()からフォームを閉じると、フォーム オブジェクトは完全に破棄されません ( != 破棄を閉じる)。それは生きたままですが、「閉じた」状態にあるだけで、あなたはそれに対して何かをすることができます.

于 2012-06-13T10:57:33.320 に答える
0

最も簡単な方法は、FormOptions クラスで Tag プロパティを使用して、渡す必要がある Tag = 値を設定し、ShowDialog メソッドの後にそれを次のように読み取ることだと思います。

myvalue x=(myvalue)formoptions.Tag;
于 2008-12-27T14:17:09.273 に答える
0

ここで猫の皮をむく方法はたくさんありますが、@Mitch の提案は良い方法です。クライアント フォームにさらに「制御」を持たせたい場合は、作成時に親のインスタンスを子に渡し、子のパブリック親メソッドを呼び出すことができます。

于 2008-11-11T10:55:53.580 に答える