用事件,方法:
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 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 通知其更新数据。
前提是你的 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)); // 此处只是测试
还有这个弹出的是非模态的窗口吧,
B和C不存在父子关系,都是主窗体A的子窗体。
# 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; // 传入改变的值
}
是的,我当时看版主写的那个委托传值的帖子,也是看不懂。自己抄了一遍,调试了一下,就懂了。这东西还得动手才行啊。B中一定一个委托。C用自定义函数对B的委托赋值,保存事件判断委托是否为空,不为空,调用委托。懂了就很简单了