两个窗体数据同步的有关问题
主窗体A,点击菜单B 弹出窗体B,点击菜单C弹出窗体C
窗体B里增删改数据并且有按钮“保存”,窗体C里只能查看数据,两个窗体用的是同一个表。
当两个窗体同时都打开的时候,B窗体数据修改并点击“保存”按钮,C窗体自动刷新数据,这要怎么实现。
在B窗体的“保存”按钮里添加 formC frmc = new formC(); frmc.show() 这种方法就不要说了,我试了,这种情况下窗口B被当成了窗口A的子窗体。窗口B不关闭就无法操作窗体A。
看到网上说用委托,我不会用,不过大致应该是两种思路
1: 在“保存”按钮里添加菜单B的方法的委托,这样相当于重新打开窗口C;
2: 在“保存”按钮里添加窗体C的 FormC_Load的方法的委托;
两种方法都行,请高手指点
------解决方案--------------------
用事件,方法:
1. 在 FORM B 里面定义事件 OnDataChanged,然后当数据更改的时候,内部触发该事件,比如:
public event EventHandler OnDataChanged(object o, EventArgs e);
// 触发
OnDataChanged(this, EventArgs.Empty);
2. 在 FORM C 里面添加代码逻辑,该逻辑判断如果 MDI 父窗体打开了 FORM B,则绑定 FORM B 的 OnDataChanged 事件,并写内部处理代码。
注意,如果你的 FORM A 不是 MDI 窗体,则需要将事件触发过渡给 FORM A,再由 FORM A 传递给 FORM C 通知其更新数据。
------解决方案--------------------
# FormA.cs
private FormC fc = null;
//为其构造函数增加一个主窗口的参数来初始化,子窗体中调用,用"this.pParentWin"
public static FormA pParentWin = null;
public FormA ()
{
InitializeComponent();
pParentWin = this;
}
/// 改变FormC中控件的值
public void ChangeFormC(string value)
{
if (fc == null
------解决方案--------------------
fc.IsDisposed)
{
fc= new FormC();
}
this.Invoke(new Mydelegate(fc.UpdateValue),value );
}
private delegate void Mydelegate(string value);
# FormB.cs
private void btnsave_Click(object sender, EventArgs e)
{
string value = textBox1.Text; // 某字段变化
FormA.pParentWin.ChangeFormC(value); // 调用主窗体A的方法
}
# FormC.cs
public void UpdateValue(string value)
{
textBox1.Text = value; // 传入改变的值
}