使用C#中的代理将数据从第二个表单和类传递回第一个表单

时间:2012-01-20 07:22:24

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

我从FormA使用frmB.Show();

调用FormB

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

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

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

我无法在FormA中为Class1创建实例,因为在FormB中创建了Class1实例。我试图将Class1委托实例分配给FormB实例,但它无法正常工作。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

我会在您需要更新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以获取更多帮助!