c# - 从 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 获取数据,但是我不能发送,我的意思是我可以,但是什么也没发生……为什么?谢谢
解决方案
此处提到的其他解决方案适用于您的特定情况,但我鼓励您着眼大局,并设计一个适用于大多数情况的通用解决方案。
您的问题基本上归结为基于另一种形式的事件在一种形式上做某事。
在我看来,最好的方法是:
- 让它
Form1
自己做所有的动作。 - 让它
Form2
自己做所有的动作。 - 如果您需要
Form1
根据发生的事件在 上做某事Form2
,请Form2
通知Form1
那里发生了某事,所以去做您自己的事情。 - 如有必要,将数据从 传递
Form2
到Form1
。
所以我会为此目的使用代表。
想象一下Button
,Label
您的Form1
. 单击该按钮打开Form2
,您有另一个Button
。单击此按钮Form2
应更改标签的背景颜色Form1
。所以我们的设置看起来像这样。您没有提到它是否是Winforms
or WPF
,所以我使用它是WPF
为了方便,但两者的想法都是相同的。
表格1
表格2
在我的Form1
我会声明一个带有这样签名的公共代表:
public delegate void NotifyEvent();
也就是说,这个委托代表了一个不接受参数的方法,并且具有 void 返回类型。这个想法是让Form2
“调用”一个方法Form1
,该方法本质上是通知按钮被单击Form2
。因此,如果我们有办法调用驻留在Form1
from中的方法,Form2
那么我们可以通知到目前为止 With meForm1
上发生的事件?Form2
现在,如果我在 中编写这样的方法Form1
,并让它从 中调用Form2
,那应该可以实现我们的目标。这里,lblDisp
是Label
in Form1
。
public void ButtonClickedOnForm2()
{
lblDisp.Background = new SolidColorBrush(Colors.LawnGreen);
}
为了实现这一点,我将定义一个如下所示的类型的委托,并将方法注册NotifyEvent
到它。你后面的代码应该是这样的Form1
ButtonClickedOnForm2()
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 传递数据Form2
,Form1
您可以简单地将参数添加到委托定义中。假设你想传递一个string
from Form2
to 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
如下所示:
推荐阅读
- html - WordPress 问题,带有链接 div 和主题背景
- angular - Angular 6:将 id 从一个组件传递到另一个组件
- javascript - 用对象声明的样式组件中的媒体查询
- r - 在 R 中使用 nls 时解决 minFactor 错误
- c# - 更新基于 CRM 的用户列表、名称和描述
- sql - SQL 查询除然后选择 TOP 10
- azure - 使用来自 Spring Boot 测试的模拟器
- arduino - 如何在迭代次数后使程序停止
- javascript - React / Webpack / TypeScript - 未动态导入的组件
- php - Laravel store() 方法不会提交数据