簡體   English   中英

如何將值從子表單傳遞回父表單?

[英]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; }

好吧,我剛剛在這里遇到了同樣的問題 - 也許有點不同。 但是,我認為這就是我解決它的方法:

  1. 在我的父表單中,我聲明了沒有實例的子表單,例如RefDateSelect myDateFrm; 所以這可用於我在這個類/表單中的其他方法

  2. 接下來,一個方法通過新實例顯示子項:

     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()); }

我希望這有幫助。

對於 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;

最快和更靈活的方法是將父級從構造函數傳遞給子級,如下所示:

  1. 在父表單中聲明一個屬性:

    public string MyProperty {get; set;}

  2. 在子窗體中從父級聲明一個屬性:

    private ParentForm ParentProperty {get; set;}

  3. 像這樣編寫孩子的構造函數:

     public ChildForm(ParentForm parent){ ParentProperty= parent; }
  4. 在子窗體中隨處更改父屬性的值:

    ParentProperty.MyProperty = "New value";

完成。 父窗體中的屬性MyProperty已更改。 使用此解決方案,您可以從子窗體更改多個屬性。 太好吃了,不是嗎?!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM