簡體   English   中英

將數據從C#中的第二個表單傳回第一個表單

[英]Passing Data back to First Form from Second Form in C#

我有兩個表格。 FormAFormB

從FormA我使用frmB.Show()調用FormB ;

在FormB中,我有兩個文本框和一個組合框控件。 假設用戶在這兩個文本框中輸入一些數據,並從Form2中的組合框中選擇一個項目,然后單擊確定按鈕。

點擊后我希望那些文本框用戶輸入值,組合框選擇項目值返回到FormA

我如何使用C#實現這一目標。

我接近簡單的方式..點綴小裝飾..

  1. 在表單類中創建公共變量即

    public string passVariable1 =“”;

  2. 如果您有文本框轉到屬性,然后單擊閃電並雙擊空TextChanged事件處理程序。 這將在代碼中創建一個代碼片段,當文本框的內容發生變化時執行該代碼片段。在此代碼塊中,將文本框的內容分配給相應的公共變量。

  3. 即我的公共變量是

    public string issue =“”;

    private void txtIssue_TextChanged(object sender,EventArgs e){issue = txtIssue.Text; }

  4. 添加一個按鈕並為此按鈕創建一個單擊事件(只需雙擊設計窗格中的按鈕)。 在點擊事件代碼塊中,將dilog結果設置為ok並隱藏

    this.DialogResult = DialogResult.OK;

    this.Hide();

  5. 在父窗口代碼中檢查對話框結果,並從子窗體的公共變量中獲取窗體數據

 if (f.ShowDialog() == DialogResult.OK) { string b = f.issue; string e = f.year; string f = f.month; }; 

在您描述的場景中,我可能會調用frmB.ShowDialog()而不是frmB.Show()

// Inside FormA open frmB as a modal dialog waiting for 
// OK or Cancel result using the following  statement

if (frmB.ShowDialog() == DialogResult.OK)
{
   // Retrieve selected values from frmB here (while frmB is still not disposed)
}

ShowDialog()的好處是你:

  1. 從表單中輕松獲取返回值,允許您確定單擊確定(而不是取消)以關閉它。
  2. 關閉時不會立即處理表單,從而允許您檢索所需的值。
  3. 通過將frmB作為模態對話框打開,您可以避免在frmB打開時用戶開始與formA交互時檢查可能發生的復雜性。

注意:在設計frmB時,你必須將OK按鈕控件的DialogResult屬性設置為DialogResult.OK ,以便在按下該按鈕時表單返回正確的DialogResult(或者也可以在OK按鈕的Click中設置this.DialogResult事件處理程序

您可以在FormA將訂閱的FormB上創建一個EventHandler。 此外,向FormB添加幾個公共屬性,表示您希望FormA能夠使用的數據。 然后,當FormB觸發事件時,FormA將知道刷新他的數據。

注意:此示例中的關鍵原則是實現EventHandler(您可以創建自己的事件處理程序類型),當數據准備好刷新/查看/等時,它會通知FormA。 希望這個例子可以讓你看到如何為你的特定情況實現一個事件處理程序。

例:

FormA -

public partial class FormA : Form
{
    //FormA has a private instance of FormB
    private FormB formB = null;
    public FormA()
    {
        InitializeComponent();
    }

    void formB_OnDataAvailable(object sender, EventArgs e)
    {
        //Event handler for when FormB fires off the event
        this.label1.Text = string.Format("Text1: {0}\r\nText2: {1}", 
            formB.Text1, formB.Text2);
    }

    private void InitializeFormB()
    {
        this.formB = new FormB();

        //FormA subscribes to FormB's event
        formB.OnDataAvailable += new EventHandler(formB_OnDataAvailable);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.InitializeFormB();
        formB.Show();
    }
}

FormB -

public partial class FormB : Form
{
    //Event that fires when data is available
    public event EventHandler OnDataAvailable;

    //Properties that expose FormB's data
    public string Text1 { get; private set; }
    public string Text2 { get; private set; }

    public FormB()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //Set the exposed properties, then fire off the event.
        this.Text1 = this.textBox1.Text;
        this.Text2 = this.textBox2.Text;

        if (OnDataAvailable != null)
            OnDataAvailable(this, EventArgs.Empty);
    }
}

或者,您可以將FormA中的對象傳遞給FormB,並將其屬性綁定到FormB中的控件。 如果您希望在單擊“確定”按鈕時通知FormA,您可以在數據容器類中聲明一個事件,在FormA中訂閱它並從FormB中激活它。

是DataContainer你定義的一些類

public class DataContainer
{
    public event EventHandler AcceptedChanges;
    protected virtual void OnAcceptedChanges()
    {
        if ((this.AcceptedChanges != null))
        {
            this.AcceptedChanges(this, EventArgs.Empty);
        }
    }

    public void AcceptChanges()
    {
        this.OnAcceptedChanges();
    }

    public string Text1 { get; set; }
    public string Text2 { get; set; }
}

在FormA中:

    private void button4_Click(object sender, EventArgs e)
{
    DataContainer data = new DataContainer();
    data.Text1 = "text1";
    data.Text1 = "text2";

    Form2 frm = new Form2();
    frm.Data = new DataContainer();
    data.AcceptedChanges += new EventHandler(data_AcceptedChanges);
    frm.Show();
}

void data_AcceptedChanges(object sender, EventArgs e)
{
    // your code here
}

並在FormB中:

public DataContainer Data { get; set; }

private void Form2_Load(object sender, EventArgs e)
{
    textBox1.DataBindings.Add(new Binding("Text", Data, "Text1"));
    textBox2.DataBindings.Add(new Binding("Text", Data, "Text2"));
}

private void button1_Click(object sender, EventArgs e)
{
    Data.AcceptChanges();
}

您還應該在DataContainer類上實現INotifyPropertyChanging和INotifyPropertyChanged以便與綁定一起使用。

我遇到了同樣的問題,想出了一個有點不同的想法。 在我的場景中,我正在為我最小的兩個孩子制作一個flashcard程序,我希望能夠將提供給父表單的答案(每個新的flashcard問題的新子表單)帶回來,以便父表單可以更新多少個左,多少正確,多少不正確等等,而不必向數據庫添加值。 對於應該簡單的事情來說似乎有些過分。 我所做的是創建一個每個變量類型3的類。 我認為每種類型中的三種對於大多數工作來說都足夠了。

這是我的新課程的一個例子:

namespace ClassNamespace
{
  public class ValueHolder
  {
    public int intValue1 { get; set; }
    public int intValue2 { get; set; }
    public int intValue3 { get; set; }
    public long longValue1 { get; set; }
    .
    .
    .
  }
}

我從父表單創建一個新的ValueHolder(ValueHolder vh;)並將其傳遞給子表單。 在子窗體中,我創建一個新的ValueHolder,然后將其設置為等於子窗體的類構造函數中發送的ValueHolder對象。 現在,當按下回車鍵(給出回答)時,我可以將vh.intValue1設置為等於this.answerBox.text; ...好吧,我必須使用int.tryparse(); 但是你明白了。 然后我只需要從父窗體中引用vh.intValue1來獲取輸入的值。

家長表格:

for (int i = 0; i < limit; i++)
{
  ValueHolder vh = new ValueHolder();

  ChildClass cc = new ChildClass(vh);
  MessageBox.Show(vh.intValue1.ToString()); //to test that it works
}

和兒童形式:

ValueHolder vh;

public ChildClass (ValueHolder vhIncoming)
{
  vh = vhIncoming;
}

private void answerBox_KeyDown(object sender, KeyEventArgs e)
{
  if (e.KeyCode == Keys.Enter)
  {
    vh.intValue1 = 1234;
  }
}

這似乎是我的方案最簡單的解決方案。 我知道這個問題已經過時了,但是想為類似位置的任何人添加此選項。 只需將類添加到項目中,根據需要向類中添加更多類型或更多類型,為將來的項目重復沖洗。

一個骯臟但也是最快的解決方案是將這些控件公開。 這可以通過在Form2.Decisgner.cs文件中添加單詞public來實現。 如果FormA具有FormB的成員變量或局部變量,則可以使用以下命令訪問該控件(例如TextBox1):

frmB.TextBox1.Text

現在也可以在FormB外部訪問。

如果它在同一頁面上你應該能夠直接從控件中讀取它,如Textbox1.Text,Textbox2.Text,Combobox.SelectedValue(我猜)但是如果它在不同的頁面上使用Session變量,如:Session [“date1”] = TextBox1.Text; Session [“date2”] = TextBox2.Text; Session [“comboValue”] = Combobox.SelectedValue; 並使用它們來填充表單

這取決於您通常如何設計應用程序。

  • 您可以使用事件驅動系統來創建事件和委托。 @ Dave81提到
  • 或者您可以創建返回給定/選定值的屬性,以便父級可以從對象中檢索它們(想要說出Dialog但不確定您使用的是什么)。
  • 或者你可以關注@zmilojko並將它們公開,這與創建屬性基本相同,但更多的是編碼實踐的黑暗面:D

所有這些都可以工作,但這一切都取決於您希望如何構建應用程序。

暫無
暫無

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

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