web-dev-qa-db-ja.com

子から親フォームに値を渡すにはどうすればよいですか?

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

私は以下を使用して子供を立ち上げました:

FormOptions formOptions = new FormOptions();
formOptions.ShowDialog();
47
Jayne M

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

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

    string result = formOptions.GetMyResult;

    // do what ever with result...
}
60
Mitch Wheat

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としてキャストする必要があるため)。ただし、これは自動的に悪いことではありません。

33
MusiGenesis

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

// 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;
23
stiduck

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

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

    result = m_Result;
    return dialogResult;
  }
}
9
Ali Ersöz

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

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; }
3
abatishchev

さて、私はここで同じ問題に出くわしました-少し違うかもしれません。しかし、私はこれが私がそれを解決した方法だと思います:

  1. 私の親フォームでは、インスタンスなしで子フォームを宣言しました。 _RefDateSelect myDateFrm;_したがって、これはこのクラス/フォーム内の他のメソッドで使用できます

  2. 次に、メソッドは新しいインスタンスごとに子を表示します。

    _myDateFrm = new RefDateSelect();
    myDateFrm.MdiParent = this;
    myDateFrm.Show();
    myDateFrm.Focus();
    _
  3. 3番目の方法(子からの結果を必要とする)はいつでも使用でき、結果を取得できます。

    _PDateEnd = myDateFrm.JustGetDateEnd();
    pDateStart = myDateFrm.JustGetDateStart();`
    _

    注:子メソッドJustGetDateStart()はCHILD内で次のようにパブリックです:

    _public DateTime JustGetDateStart()
    {
        return DateTime.Parse(this.dtpStart.EditValue.ToString());
    }
    _

これがお役に立てば幸いです。

2
Chagbert

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

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

1
ghfarzad

Picrofo EDYの場合

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

1
Bravo Mike

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

0
kenny

最も簡単な方法は、FormOptionsクラスのTagプロパティを使用して、渡す必要のあるTag =値を設定し、ShowDialogメソッドがそれを読み取った後に

myvalue x=(myvalue)formoptions.Tag;
0
Ahmed Said

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

0
Odin

私はそのようにそれを解決した同じ問題を抱えていました、ここに初心者がステップバイステップの指示があります

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

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
0
user889030