2017-10-07 83 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,如果有帮助的话。 –

相关问题