两个窗体数据同步的有关问题

两个窗体数据同步的有关问题

两个窗体数据同步的问题
主窗体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;    // 传入改变的值
        }