子フォームから親フォームに値を渡すにはどうすればよいですか? 親に返したい文字列があります。
次を使用して子を起動しました:
FormOptions formOptions = new FormOptions();
formOptions.ShowDialog();
子フォームから親フォームに値を渡すにはどうすればよいですか? 親に返したい文字列があります。
次を使用して子を起動しました:
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;
結果を返す out パラメータを取得する子クラスに ShowDialog のオーバーロードを作成することもできます。
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; }
子フォームをモーダル ダイアログ ボックスとして表示している場合、子フォームの DialogResult プロパティに DialogResult 列挙の値を設定すると、モーダル ダイアログ ボックスが非表示になり、コントロールが呼び出し元のフォームに返されます。この時点で、親は子フォームのデータにアクセスして、必要な情報を取得できます。
詳細については、次のリンクを確認してください: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult(v=vs.110).aspx
ピクロフォEDYの場合
フォームを表示する方法としてを使用しShowDialog()
、フォームを閉じる場合は、 の代わりに閉じるボタンを使用しますthis.Close()
。フォームは破棄または破棄されません。非表示になるだけで、削除後に変更を加えることができます。適切に閉じるには、Dispose()
orClose()
メソッドが必要です。一方、Show()
メソッドを使用して閉じると、フォームは破棄され、後で変更できなくなります。
私は同じ問題を抱えていたので、そのように解決しました。初心者向けのステップバイステップの説明があります
最初に子フォームのオブジェクトをフォームクラスの一番上に作成し、次にそのオブジェクトを子フォームの表示や値の読み取りなどの子フォームのすべての操作に使用します。
例
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
ShowDialog()
またはメソッドを使用してShow()
からフォームを閉じると、フォーム オブジェクトは完全に破棄されません ( != 破棄を閉じる)。それは生きたままですが、「閉じた」状態にあるだけで、あなたはそれに対して何かをすることができます.
最も簡単な方法は、FormOptions クラスで Tag プロパティを使用して、渡す必要がある Tag = 値を設定し、ShowDialog メソッドの後にそれを次のように読み取ることだと思います。
myvalue x=(myvalue)formoptions.Tag;
ここで猫の皮をむく方法はたくさんありますが、@Mitch の提案は良い方法です。クライアント フォームにさらに「制御」を持たせたい場合は、作成時に親のインスタンスを子に渡し、子のパブリック親メソッドを呼び出すことができます。