【问题标题】:Passing Data back to First Form from Second Form and a class using delegates in C#在 C# 中使用委托将数据从第二个表单和一个类传递回第一个表单
【发布时间】:2012-02-14 19:39:31
【问题描述】:

在 FormA 中,我使用 frmB.Show(); 调用 FormB

在 FormB 中,我有两个文本框。假设用户在这两个文本框中输入了一些数据。 我需要将此添加到 FormA 上的 ListBox 中。

为了实现这一点,我创建了一个委托实例,并在创建 frmB 对象后在 FormA 中调用它 - 效果很好。

在 FormB 中,创建 Class1 对象并调用其方法之一,该方法还需要访问/更新 FormA 中的 ListBox。

我无法在 FormA 中为 Class1 创建实例,因为 Class1 实例是在 FormB 中创建的。我试图将 Class1 委托实例分配给 FormB 实例,但它不起作用。

我怎样才能做到这一点?

【问题讨论】:

  • 在什么方面它“不起作用”?

标签: c# winforms delegates windows-forms-designer


【解决方案1】:

当您需要更新 FormA 时,我会在您调用的 FormB 中公开一个事件。在 FormA 调用 formBInstance.Show() 之前,您可以将委托连接到事件处理程序以处理您需要在 FormA 中执行的操作:formBInstance.UpdateEvent += myDelegateEventHandler。 因此,当 FormB 需要更新 FormA 时,您只需触发该事件,委托就会在 FormA 下按预期运行。

编辑以显示更多代码!

FormB.cs:

    // You can add more parameters to this to pass any data you need
    // in addition to the object sender you pass back
    public delegate void UpdateEventHandler(object sender, EventArgs e)

    public class FormB : Form
    {

        public event UpdateEventHandler Update;

        private void update()
        {
            // do your updates to formB here
            InvokeUpdateEvent(objectThatContainsUsefulData);
        }

        protected void InvokeUpdateEvent(object sender)
        {
            var handler = UpdateEvent;
            if (handler != null)
                handler(sender, null);
        }
    }

FormA.cs:

    public class FormA : Form
    {

        private void myUpdateDelegate(object sender, EventArgs e)
        {
            // Do your updates that formA will require here
        }

        public void methodCallingFormB()
        {
            // Do whatever you need to set up for creating form B
            var formB = new FormB();
            formB.UpdateEvent += myUpdateDelegate;
            formB.Show();
        }
    }

我希望这一切对你来说都有意义。查看MSDN Events Tutorial 以获得更多帮助!

【讨论】:

  • 我没有使用事件,但委托我能够为 formB 执行此操作,但对于在 formB 中调用的新类对象,我无法做到。
  • 使用事件,它会让你的生活变得更轻松。在需要时推送数据并调用事件比尝试在构造函数等中传递引用更有效,并且代码更简单。
  • 感谢 alexander,我尽力参与了活动,好的,我现在就试试。
  • 它正在工作(对于第二个表单数据到第一个表单),但对于我的问题,如果另一个类从第二个表单调用并且它也想将数据发送到第一个表单。该怎么做?
  • 好吧,新类总是可以引用 FormB。将 InvokeEventHandler 设为公开,以便您从类中调用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
相关资源
最近更新 更多