用事件,方法:
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 通知其更新数据。

解决方案 »

  1.   

    如果你的 FORM A 不是 MDI 窗体,也可以不用过度,前面试过了。
    前提是你的 FORM B 是这样 show 的:FormB fb = new FormB() { Text = "B" };
    fb.Show(this); // 注意这个 this 不能少,当然,这样显示会变成相对于 FORM A 以 TOP MOST 方式显示。接下来就是 FORM C 在构造函数中的判断,如果存在就绑定事件:var child1Forms = Owner.OwnedForms.OfType<FormB>();
    MessageBox.Show("Exist? " + (child1Forms.Count() > 0)); // 此处只是测试
      

  2.   

    楼主的意思是不是这样:C窗体在显示着,然后打开弹出B窗体,这时C中显示的是表table1中的数据,再操作B窗体,比如修改一个字段,然后C中明显会看到字段的变化,过程是这个意思吧?
    还有这个弹出的是非模态的窗口吧,
      

  3.   

    不明白什么事非模态的窗口,不过你的意思是对的
    B和C不存在父子关系,都是主窗体A的子窗体。
      

  4.   


    # 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;    // 传入改变的值
            }
      

  5.   


    是的,我当时看版主写的那个委托传值的帖子,也是看不懂。自己抄了一遍,调试了一下,就懂了。这东西还得动手才行啊。B中一定一个委托。C用自定义函数对B的委托赋值,保存事件判断委托是否为空,不为空,调用委托。懂了就很简单了