子から親フォームに値を渡すにはどうすればよいですか?親に戻したい文字列があります。
私は以下を使用して子供を立ち上げました:
FormOptions formOptions = new FormOptions();
formOptions.ShowDialog();
FormOptions
、たとえばGetMyResult
にプロパティ(またはメソッド)を作成します。
using (FormOptions formOptions = new FormOptions())
{
formOptions.ShowDialog();
string result = formOptions.GetMyResult;
// do what ever with result...
}
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としてキャストする必要があるため)。ただし、これは自動的に悪いことではありません。
パブリックプロパティを作成することもできます。
// 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;
また、子クラスにShowDialogのオーバーロードを作成して、結果を返すoutパラメーターを取得することもできます。
public partial class FormOptions : Form
{
public DialogResult ShowDialog(out string result)
{
DialogResult dialogResult = base.ShowDialog();
result = m_Result;
return dialogResult;
}
}
子フォームのパブリックプロパティを使用する
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; }
さて、私はここで同じ問題に出くわしました-少し違うかもしれません。しかし、私はこれが私がそれを解決した方法だと思います:
私の親フォームでは、インスタンスなしで子フォームを宣言しました。 _RefDateSelect myDateFrm;
_したがって、これはこのクラス/フォーム内の他のメソッドで使用できます
次に、メソッドは新しいインスタンスごとに子を表示します。
_myDateFrm = new RefDateSelect();
myDateFrm.MdiParent = this;
myDateFrm.Show();
myDateFrm.Focus();
_
3番目の方法(子からの結果を必要とする)はいつでも使用でき、結果を取得できます。
_PDateEnd = myDateFrm.JustGetDateEnd();
pDateStart = myDateFrm.JustGetDateStart();`
_
注:子メソッドJustGetDateStart()
はCHILD内で次のようにパブリックです:
_public DateTime JustGetDateStart()
{
return DateTime.Parse(this.dtpStart.EditValue.ToString());
}
_
これがお役に立てば幸いです。
子フォームをモーダルダイアログボックスとして表示している場合、子フォームのDialogResultプロパティにDialogResult列挙の値を設定できます。これにより、モーダルダイアログボックスが非表示になり、呼び出しフォームに制御が戻ります。この時点で、親は子フォームのデータにアクセスして、必要な情報を取得できます。
詳細については、このリンクを確認してください: http://msdn.Microsoft.com/en-us/library/system.windows.forms.form.dialogresult(v = vs.110).aspx
Picrofo EDYの場合
フォームを表示する方法としてShowDialog()
を使用し、それを閉じるには、this.Close()
の代わりに閉じるボタンを使用するかどうかによります。フォームは破棄も破棄もされず、非表示になり、変更後は変更できます。適切に閉じるには、Dispose()
またはClose()
メソッドが必要です。一方、Show()
メソッドを使用して閉じた場合、フォームは破棄され、その後変更することはできません。
ここで猫の皮をむく多くの方法と @ Mitchの提案 は良い方法です。クライアントフォームにさらに「コントロール」を持たせたい場合は、作成時に親のインスタンスを子に渡し、子のパブリック親メソッドを呼び出すことができます。
最も簡単な方法は、FormOptionsクラスのTagプロパティを使用して、渡す必要のあるTag =値を設定し、ShowDialogメソッドがそれを読み取った後に
myvalue x=(myvalue)formoptions.Tag;
ShowDialog()
またはShow()
メソッドを使用してフォームを閉じると、フォームオブジェクトは完全には破棄されません(closing!= destruction)。それは「閉じた」状態にあるだけで、生きたままであり、あなたはまだそれに対して何かをすることができます。
私はそのようにそれを解決した同じ問題を抱えていました、ここに初心者がステップバイステップの指示があります
最初にフォームクラスの最上位に子フォームのオブジェクトを作成し、次に子オブジェクトの表示や値の読み取りなど、子フォームのすべての操作にそのオブジェクトを使用します。
例
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