使用自定义事件处理程序在窗体之间传递数据
我有两种窗体(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;
这是我迷路了。我很难理解现在发生了什么。如果有人能帮我完成我想要做的事,我会非常感激!
没有必要创建自己的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
}
}
我不确定这是否会对此解决方案产生影响,但是我希望获取下一个值的列表框位于Form2上。看起来这可能会改变这两者。然而,当我试图实现这一点时,我得到了“OnNextStringChanged”没有重载匹配委托'Action'“。有任何想法吗? –
对不起,请参阅更新。请注意,在Form1中,它现在是行动
我认为你翻转Form1和Form2。列表框位于Form2上。 Form2是辅助表单,Form1是主要表单。 –
有很多方法来传递不同形式之间的数据数量,检查了这一点:
- 首先创建要在窗体2共用字符串:
public string NextString { get { return ListBox1.Items[ListBox1.TopIndex].ToString(); } }
- 访问字符串使用此代码:
string Testing = ((Form2)Application.Current.Windows[2]).NextString;
附:您可能必须为Form2使用不同的索引编号,因为我不确定它在您的应用中的位置。
为此,我得到应用程序不包含Current的定义。目标.NET框架是4.6.1,如果有帮助的话。 –
你是否在使用MVVM,或者是所有这些都被做代码隐藏? –
这是代码隐藏文件 –
什么时候打开Form2? –