使用自定义事件处理程序在表单之间传递数据

时间:2017-10-07 03:57:31

标签: c# wpf events delegates

我有两个表单(Form1和Form2),我希望在Form1上的一个进程完成后传递一串字符。

在Form1上,有一个文本框,我想用这个字符串更新。在Form2上,我有一个列表框,其中包含在完成每个进程后最终将加载到Form1上的此文本框中的值。基本上我要做的是排队将放置在Form1上的文本框中的下一个字符串。

我已尝试在Form2中创建公共属性,如下所示:

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

然后,在Form1中:

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

并且presto。除外。不幸的是,这对我不起作用。我做了一些研究,发现这种方法不是最好的做法,并且认为使用事件处理程序是更实用的方法。所以我研究了那些。我知道我必须创建一个新的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;

这是我迷路的地方。我很难理解现在发生了什么。如果有人能帮助我完成我想做的事情,我将非常感激!

2 个答案:

答案 0 :(得分: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
   }
}

答案 1 :(得分:0)

有多种方法可以在不同的表单之间传递数据,请查看:

  1. 首先在Form2中创建要共享的字符串:
  2. ==

    1. 访问该字符串使用此代码:
    2. public string NextString { get { return ListBox1.Items[ListBox1.TopIndex].ToString(); } }

      P.S。您可能必须为Form2使用不同的索引号,因为我不确定它在您的应用中的确切位置。