【问题标题】:Passing data between forms using custom event handlers使用自定义事件处理程序在表单之间传递数据
【发布时间】:2017-10-07 03:57:31
【问题描述】:

我有两个表单(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;

然后很快。除了没有。不幸的是,这对我不起作用。我做了一些研究,发现这种方法并不是最佳实践,并读到使用事件处理程序是更实用的方法。所以我研究了这些。我知道我必须创建一个新的 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;

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

【问题讨论】:

  • 您是在使用 MVVM,还是所有这些都是在代码隐藏中完成的?
  • 这一切都在代码隐藏文件中完成
  • Form2什么时候打开?
  • 它可以在进程完成之前或之后打开。在流程开始之前确保它是打开的并不难

标签: c# wpf events delegates


【解决方案1】:

无需创建自己的 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 中,现在是 Action
  • 我认为你翻转了 Form1 和 Form2。该列表框位于 Form2 上。 Form2是辅助窗体,Form1是主窗体。
  • @ZachYarid 那么,您希望将 Form2 的值通知给 Form1 吗? Form1 是否有 Form2 的实例?
【解决方案2】:

在不同的表单之间传递数据的方式有很多种,看看这个:

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

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

  1. 要访问该字符串,请使用以下代码:

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

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

【讨论】:

  • 为此,我得到应用程序不包含当前的定义。如果有帮助,目标 .NET 框架是 4.6.1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多