首页 > 解决方案 > 从 Form2 更新 Form1 对象

问题描述

我尝试从 Form2 更新 Form1 的值,但没有任何反应。也没有错误,奇怪...

表格1:

 public static Form2 f2{ get; set; } = new Form2();

 private void addButton1_Click(object sender, EventArgs e)
        {        
            f2.Show(); 
        }

表格2:

 public void button1_Click(object sender, EventArgs e)
    {
        Form f1 = new Form();
        f1.label2.ForeColor = Color.Red;
    }

什么都没发生。我可以从 form1 向我的 form2 获取数据,但是我不能发送,我的意思是我可以,但是什么也没发生……为什么?谢谢

标签: c#inheritance

解决方案


此处提到的其他解决方案适用于您的特定情况,但我鼓励您着眼大局,并设计一个适用于大多数情况的通用解决方案。

您的问题基本上归结为基于另一种形式的事件在一种形式上做某事

在我看来,最好的方法是:

  • 让它Form1自己做所有的动作。
  • 让它Form2自己做所有的动作。
  • 如果您需要Form1根据发生的事件在 上做某事Form2,请Form2通知Form1那里发生了某事,所以去做您自己的事情。
  • 如有必要,将数据从 传递Form2Form1

所以我会为此目的使用代表。

想象一下ButtonLabel您的Form1. 单击该按钮打开Form2,您有另一个Button。单击此按钮Form2应更改标签的背景颜色Form1。所以我们的设置看起来像这样。您没有提到它是否是Winformsor WPF,所以我使用它是WPF为了方便,但两者的想法都是相同的。

表格1

在此处输入图像描述

表格2

在此处输入图像描述

在我的Form1我会声明一个带有这样签名的公共代表:

public delegate void NotifyEvent();

也就是说,这个委托代表了一个不接受参数的方法,并且具有 void 返回类型。这个想法是让Form2“调用”一个方法Form1,该方法本质上是通知按钮被单击Form2。因此,如果我们有办法调用驻留在Form1from中的方法,Form2那么我们可以通知到目前为止 With meForm1上发生的事件?Form2

现在,如果我在 中编写这样的方法Form1,并让它从 中调用Form2,那应该可以实现我们的目标。这里,lblDispLabelin Form1

public void ButtonClickedOnForm2()
{
    lblDisp.Background = new SolidColorBrush(Colors.LawnGreen);
}

为了实现这一点,我将定义一个如下所示的类型的委托,并将方法注册NotifyEvent到它。你后面的代码应该是这样的Form1ButtonClickedOnForm2()Form1

public delegate void NotifyEvent();

public partial class Form1 : Window
{
    public NotifyEvent notifyDelegate;

    Form2 form2 = null;

    public Form1()
    {
        InitializeComponent();
        // This is 'registering' the ButtonClickedOnForm2 method to the delegate.
        // So, when the delegate is invoked (called), this method gets executed.
        notifyDelegate += new NotifyEvent(ButtonClickedOnForm2);
    }

    public void ButtonClickedOnForm2()
    {
        lblDisp.Background = new SolidColorBrush(Colors.LawnGreen);
    }

    private void BtnOpen_Click(object sender, RoutedEventArgs e)
    {
        // Passing the delegate to `Form2`
        form2 = new Form2(notifyDelegate);
        form2.Show();
    }
}

因此,现在我们需要修改我们的Form2. 当按钮点击发生时,我们需要告诉我们调用哪个委托。所以要做到这一点,我会在构造函数中传递委托,Form2如下所示:

public partial class Form2 : Window
{
    NotifyEvent notifyDel;

    public Form2(NotifyEvent notify)
    {
        InitializeComponent();
        notifyDel = notify;
    }

    private void BtnOK_Click(object sender, RoutedEventArgs e)
    {
        // This invokes the delegate, which in turn calls the ButtonClickedOnForm2 method in Form1.
        notifyDel.Invoke();
    }
}

现在,当单击按钮时Form2,它会调用委托。在我们的Form1中,我们告诉它,如果委托被调用,它应该继续执行该ButtonClickedOnForm2方法。在该方法中,我们编写了代码来更改标签的背景颜色。那应该可以解决您的问题。


传递数据

此外,如果您想从 to 传递数据Form2Form1您可以简单地将参数添加到委托定义中。假设你想传递一个stringfrom Form2to Form1。然后,您将您的委托更改为如下所示:

public delegate void NotifyEvent(string data);

像这样的方法ButtonClickedOnForm2

public void ButtonClickedOnForm2(string data)
{
    lblDisp.Content = data;
    lblDisp.Background = new SolidColorBrush(Colors.LawnGreen);
}

然后Form2,通过传递一个字符串来调用委托,如下所示:

private void BtnOK_Click(object sender, RoutedEventArgs e)
{
    // This invokes the delegate, which in turn calls the ButtonClickedOnForm2 method in Form1.
    notifyDel.Invoke("I am from Form2");
}

现在点击按钮Form2应该改变标签的文本和背景颜色,Form1如下所示:

在此处输入图像描述


推荐阅读