关于利用委托实现两个窗体互相调用方法

老潇 2012-06-27 11:47:46
有A、B两个窗口,A窗口中有一个按钮和一个方法,A中的方法需要使用B窗口返回的数据
1、单击A窗口中的按钮打开B
2、B关闭时执行A窗口中的事件

需要用委托来完成,不能使用showdialog(),B窗口打开是非模式的(Show()),最好是能应用到多个窗口,比如C窗口也有按钮和事件,也需要打开C窗口执行同上的操作。
...全文
361 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
effun 2012-06-28
  • 打赏
  • 举报
回复
少写一句:

b.Show();
threenewbee 2012-06-28
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20110407/19/c1068d69-7331-4d02-bc0b-f5ba7a5f8dd8.html
effun 2012-06-28
  • 打赏
  • 举报
回复
FormB b = new FormB();

b.FormClosed += (s, e) =>
{
string data = b.Data; // 获取B的数据
AMethod(data); // 将B的数据用来调用方法
}
__天涯寻梦 2012-06-28
  • 打赏
  • 举报
回复
代码可以这样写,注册窗体的 FormClosed 事件
frmB B = new frmB();
B.MdiParent = this.MdiParent;
B.FormClosed += (sender, e) =>
{
frmB fb = (frmB)sender;
// 访问 fb 的字段属性方法
MessageBox.Show("B窗口已关闭!");
};
B.Show();
老潇 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 12 楼 的回复:
引用 11 楼 的回复:

那你就这样吧
C# code
frmB B = new frmB();
B.MdiParent = this.MdiParent;
B.Show();
while (!f.IsDisposed)
{
Application.DoEvents();
}
MessageBox.Show("B窗口已关闭!");


……
[/Quote]

我不是想找最优代码才来问的吗,大哥,不然我来提问干嘛,
__天涯寻梦 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
引用 11 楼 的回复:

那你就这样吧
C# code
frmB B = new frmB();
B.MdiParent = this.MdiParent;
B.Show();
while (!f.IsDisposed)
{
Application.DoEvents();
}
MessageBox.Show("B窗口已关闭!");


无限循环,这样只要窗口没关闭就一……
[/Quote]
这个不行,那个嫌麻烦,还想代码等着你,怎么可能
老潇 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

那你就这样吧
C# code
frmB B = new frmB();
B.MdiParent = this.MdiParent;
B.Show();
while (!f.IsDisposed)
{
Application.DoEvents();
}
MessageBox.Show("B窗口已关闭!");
[/Quote]

无限循环,这样只要窗口没关闭就一直在执行,性能有影响啊~这个基本不考虑。。
__天涯寻梦 2012-06-28
  • 打赏
  • 举报
回复
那你就这样吧
frmB B = new frmB();
B.MdiParent = this.MdiParent;
B.Show();
while (!f.IsDisposed)
{
Application.DoEvents();
}
MessageBox.Show("B窗口已关闭!");
老潇 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:
引用 3 楼 的回复:

代码可以这样写,注册窗体的 FormClosed 事件
C# code
frmB B = new frmB();
B.MdiParent = this.MdiParent;
B.FormClosed += (sender, e) =>
{
frmB fb = (frmB)sender;
// 访问 fb 的字段属性方法
M……
[/Quote]

最好是能阻塞消息,就是show之后的代码要在窗口关闭后再执行
老潇 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

http://topic.csdn.net/u/20110407/19/c1068d69-7331-4d02-bc0b-f5ba7a5f8dd8.html
[/Quote]

看了你的帖子,我想问下MDI下的子窗口,A打开B,如果其中有判断语句存在,判断之外的代码也要在B关闭后执行怎么写?
if(i = 1)
{
frmB B = new frmB();
B.mdiparent = this.mdiParent;
B.Show();
}
else
{
frmC C = new frmC();
C.mdiparent = this.mdiParent;
C.Show();
}
MessageBox.Show("弹出窗口已关闭!");
这里的MessageBox.Show("弹出窗口已关闭!") 需要在B或者C关闭后执行,难道要注册关闭事件里面写两次?
__天涯寻梦 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 3 楼 的回复:

代码可以这样写,注册窗体的 FormClosed 事件
C# code
frmB B = new frmB();
B.MdiParent = this.MdiParent;
B.FormClosed += (sender, e) =>
{
frmB fb = (frmB)sender;
// 访问 fb 的字段属性方法
MessageBox.Show(……
[/Quote]
你觉得注册事件麻烦,那什么方便呢
老潇 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

代码可以这样写,注册窗体的 FormClosed 事件
C# code
frmB B = new frmB();
B.MdiParent = this.MdiParent;
B.FormClosed += (sender, e) =>
{
frmB fb = (frmB)sender;
// 访问 fb 的字段属性方法
MessageBox.Show("B窗口已关闭!……
[/Quote]

这样的话在每次需要这样做得时候都需要注册在当前窗口注册FrmClosed事件,还能有其他方法实现么,
老潇 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

引用 16 楼 的回复:
public static void ShowMyDialg(Form form)
{
using (System.Threading.ManualResetEvent mRest = new System.Threading.ManualResetEvent(false))
{
form.FormClosed += delegate(object send……
[/Quote]

不对吧,这个比11楼那个性能应该要号
__天涯寻梦 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]
public static void ShowMyDialg(Form form)
{
using (System.Threading.ManualResetEvent mRest = new System.Threading.ManualResetEvent(false))
{
form.FormClosed += delegate(object sender1, For……
[/Quote]
这是 3楼和 11楼的合体写法,集缺点于一身
老潇 2012-06-28
  • 打赏
  • 举报
回复
public static void ShowMyDialg(Form form)
{
using (System.Threading.ManualResetEvent mRest = new System.Threading.ManualResetEvent(false))
{
form.FormClosed += delegate(object sender1, FormClosedEventArgs e1)
{
mRest.Set();
};
form.Show();
while (!mRest.WaitOne(20, false))
{
Application.DoEvents();
}
mRest.Close();
}
}

帮看看这个咋样?
__天涯寻梦 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
引用 13 楼 的回复:

引用 12 楼 的回复:
引用 11 楼 的回复:

那你就这样吧
C# code
frmB B = new frmB();
B.MdiParent = this.MdiParent;
B.Show();
while (!f.IsDisposed)
{
Application.DoEvents();
}
MessageBox.Show("B窗……
[/Quote]
Show 最合适就是注册事件,不论系统提供的还是自定义的
老潇 2012-06-27
  • 打赏
  • 举报
回复
假如A窗口的按钮事件中代码如下:
frmB B = new frmB();
B.mdiparent = this.mdiParent;
B.Show();
MessageBox.Show("B窗口已关闭!");

这里怎么样能使B在show之后不执行后面那段代码,只有当B关闭时才执行,类似showdialog,但是不能用showdialog,因为用这个的话其他MDI子窗口在B显示时无法操作
老潇 2012-06-27
  • 打赏
  • 举报
回复
补充下,后面那个事打开B窗口; 还有C窗口中的方法与A窗口不一样
与前版功能基本相似,修正了部分bug,对界面进行了美化,目前这个美化相信应该够用了,因为时间问题没有增加可自定义界面功能,等有时间再提供吧,压缩文件使用“好压”做的,里面有一个例子,图片资源编辑工具,大家可以测试一下效果,里面也有详细说明,图片资源编辑器大家也可以用到自己的程序中,方便程序的图片统一管理和调用,菜鸟,达人们别笑话我了。 这里还是在说一下等待窗体的具体使用方法吧 首先将LOADing.dll,DevComponents.DotNetBar2.dll两个dll文件复制到你程序目录中,在程序项目中引用LOADing.dll,在要使用的地方 //先实例 LOADing.FORMshow FRload = new LOADing.FORMshow(); //再调用showto方法,其中的参数this为你调用等待窗体的主窗体对象,delegate { }为委托,IMGclass_AddFlie_r()为功能处理函数,其中所传递的参数第一的FRload必须为固定的创建等待窗体的实例对象,后面跟所需要传递的对象参数。 FRload.showto(this, delegate { IMGclass_AddFlie_r(new object[] { FRload, iclass, fileDialog1.FileNames, _at.SelectedNode.Text }); },true); //这个为数据处理部分 private void IMGclass_AddFlie_r(object[] d) { for (int i = 0; i <= ((string[])d[2]).Length - 1; i++) { ((IMGclass)d[1]).top[d[3].ToString()].Add("标" + ((IMGclass)d[1]).top[d[3].ToString()].Count, BinToCmd(((string[])d[2])[i])); f_new_hand(new object[] { ((IMGclass)d[1]).top[d[3].ToString()], "标" + (((IMGclass)d[1]).top[d[3].ToString()].Count - 1) }); ((LOADing.FORMshow)d[0]).send("加载图片文件:", Convert.ToInt32((Convert.ToSingle(i) / (Convert.ToSingle(((string[])d[2]).Length) / Convert.ToSingle(100))))); } BinToclass(((IMGclass)d[1]), _path[_at.SelectedNode.Parent.Text]); } 好了,使用起来很简单,看看上面的例子就会了,如需索要源码或者要提问的话,请联系QQ76230454.

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧