[英]How do I pass a value from a child back to the parent form?
如何將值從子表單傳遞回父表單? 我有一個字符串,我想傳回給父級。
我使用以下方法啟動了孩子:
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");
此示例中的代碼更適合用於工具箱窗口之類的東西,該窗口旨在浮動在主窗體上方。 在這種情況下,您將使用 .Show() 而不是 .ShowDialog() 打開子窗體(使用 .TopMost = true)。
這樣的設計意味着子窗體與父窗體緊密耦合(因為子窗體必須將其所有者強制轉換為 ParentForm 才能調用其 NotifyMe 方法)。 然而,這並不自然是一件壞事。
您還可以創建公共屬性。
// 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();
我的第三種方法(需要孩子的結果)可以隨時出現並簡單地獲得結果:
PDateEnd = myDateFrm.JustGetDateEnd(); pDateStart = myDateFrm.JustGetDateStart();`
注意:子方法JustGetDateStart()
在 CHILD 中是公開的:
public DateTime JustGetDateStart() { return DateTime.Parse(this.dtpStart.EditValue.ToString()); }
我希望這有幫助。
對於 Picrofo EDY
這取決於,如果您使用ShowDialog()
作為顯示表單的方式並關閉它,您可以使用關閉按鈕而不是this.Close()
。 表單不會被處理或銷毀,它只會被隱藏並且在消失后可以進行更改。 為了正確關閉它,您將需要Dispose()
或Close()
方法。 另一方面,如果您使用Show()
方法並關閉它,則表單將被處理並且之后無法修改。
如果將子窗體顯示為模式對話框,則可以使用 DialogResult 枚舉中的值設置子窗體的 DialogResult 屬性,該值又會隱藏模式對話框,並將控制權返回給調用窗體。 此時父表單可以訪問子表單的數據以獲取所需的信息。
有關更多信息,請查看此鏈接: http : //msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult(v=vs.110).aspx
我有同樣的問題,我是這樣解決的,這里是新手一步一步的說明
首先在表單類的頂部創建子表單的對象,然后將該對象用於子表單的每個操作,例如顯示子表單和從中讀取值。
例子
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()
方法,然后關閉表單時,表單對象不會完全銷毀(關閉 != destroy )。 它會保持活動狀態,只是處於“關閉”狀態,您仍然可以對其進行操作。
在這里給貓剝皮的方法有很多, @Mitch 的建議是一個好方法。 如果您希望客戶端表單具有更多的“控制”,您可能希望在創建時將父表單的實例傳遞給子表單,然后您可以在子表單上調用任何公共父方法。
我認為最簡單的方法是在 FormOptions 類中使用 Tag 屬性設置需要傳遞的 Tag = 值,然后在 ShowDialog 方法將其讀取為
myvalue x=(myvalue)formoptions.Tag;
最快和更靈活的方法是將父級從構造函數傳遞給子級,如下所示:
在父表單中聲明一個屬性:
public string MyProperty {get; set;}
在子窗體中從父級聲明一個屬性:
private ParentForm ParentProperty {get; set;}
像這樣編寫孩子的構造函數:
public ChildForm(ParentForm parent){ ParentProperty= parent; }
在子窗體中隨處更改父屬性的值:
ParentProperty.MyProperty = "New value";
完成。 父窗體中的屬性MyProperty
已更改。 使用此解決方案,您可以從子窗體更改多個屬性。 太好吃了,不是嗎?!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.