2017-10-07 103 views
2

我有兩種窗體(Form1和Form2),我希望在Form1上的一個過程完成後傳遞一串字符。使用自定義事件處理程序在窗體之間傳遞數據

在Form1上,有一個文本框,我想用此字符串進行更新。在Form2上,我有一個列表框,其中包含最終將在完成每個過程之後加載到Form1上的此文本框中的值。基本上我試圖做的是排列下一個將放置在Form1上的文本框中的字符串。

我曾嘗試在Form 2上創建一個公共屬性,如下圖所示:

public string NextString { get { return ListBox1.Items[ListBox1.TopIndex].ToString(); } } 

然後,在Form1中:

Form2 frm = new Form2(); 
string next = frm.NextString; 
TextBox1.Text = next; 

而且急。除外。不幸的是,這並不適合我。我做了一些研究,看到這種方法並不是最好的做法,並且認爲使用事件處理程序是更實用的方法。所以我研究了這些。我知道我必須創建一個新的EventArgs類,一個新的公共事件,一個觸發方法,我想如何處理該事件,然後創建Form1中的處理程序方法。 This post is where I read into that.

我打得四處操縱回答適合我的需要:

public class StringEventArgs : EventArgs 
{ 
    public string NextString { get; set; } 
    public StringEventArgs(string data) 
    { 
     NextString = data; 
    } 
} 

一個新的事件:

public event EventHandler<ListEventArgs> NewFileAdded; 

這是我迷路了。我很難理解現在發生了什麼。如果有人能幫我完成我想要做的事,我會非常感激!

+0

你是否在使用MVVM,或者是所有這些都被做代碼隱藏? –

+0

這是代碼隱藏文件 –

+0

什麼時候打開Form2? –

回答

2

沒有必要創建自己的Args類。您可以使用Form2訂閱的Action來完成此操作。

喜歡的東西:

public class Form1 
{ 
    private Form2 _form2; 

    public event Action<string> NextStringChanged; 

    public class Form1() 
    { 
     _form2 = new Form2(this); 
    } 

    private void LongProcess() 
    { 
     _form2.Show(); 

     // do long process 

    if (NextStringChanged != null) 
    { 
     NextStringChanged.Invoke(ListBox1.Items[ListBox1.TopIndex].ToString()); 
    } 
    } 
} 

public class Form2 
{ 
    public class Form2(Form1 form1) 
    { 
     form1.NextStringChanged += OnNextStringChanged; 
    } 

    private void OnNextStringChanged(string value) 
    { 
     // Update WPF user control here 
    } 
} 
+0

我不確定這是否會對此解決方案產生影響,但是我希望獲取下一個值的列表框位於Form2上。看起來這可能會改變這兩者。然而,當我試圖實現這一點時,我得到了「OnNextStringChanged」沒有重載匹配委託'Action'「。有任何想法嗎? –

+0

對不起,請參閱更新。請注意,在Form1中,它現在是行動

+0

我認爲你翻轉Form1和Form2。列表框位於Form2上。 Form2是輔助表單,Form1是主要表單。 –

0

有很多方法來傳遞不同形式之間的數據數量,檢查了這一點:

  1. 首先創建要在窗體2共用字符串:

public string NextString { get { return ListBox1.Items[ListBox1.TopIndex].ToString(); } }

  1. 訪問字符串使用此代碼:

string Testing = ((Form2)Application.Current.Windows[2]).NextString;

附:您可能必須爲Form2使用不同的索引編號,因爲我不確定它在您的應用中的位置。

+0

爲此,我得到應用程序不包含Current的定義。目標.NET框架是4.6.1,如果有幫助的話。 –

相關問題