如何处理 窗口引用 及 父子级窗口?

clming327 2008-10-30 12:58:05
首先我来说一下父子级的窗口:
一个Form1是父窗口,一个Form2是子窗口。
我是这样在Form1处理Form2的关系的
Form1里

Form2 frm = new Form2();
frm.Owner = this;
frm.Show();

Form2里

Form1 frm = null;
frm = (Form1)this.Owner;


这样做确实完成了某一组功能,但是当另外一组功能也需要Form2一样的功能的时间,我发现我只能再写一份像Form2一样的窗口,原因是在Form2里的定义语句里指定了父窗口,所以我不知道怎么样来让别的窗口来调用Form2。

说的有点拗口,简单地说就像是一个业务单据的“输入”和“编辑”窗口,都需要一个“商品选择”子窗口,假设我先做好的子窗口是“输入”的,那么子窗口中的定义语句就指定为“输入”父窗口,当我想让“编辑”窗口也使用这个子窗口时就不行了。

另外一个问题是关于同一级别的窗口引用,比如说有一个业务流程有“采购单”和“收货单”,当我在输入“收货单”的时候想从“采购单”引入数据,这时如果能在“采购单”.Show()的过程中把“收货单”传递过去的那操作会方便很多,但因为“采购单”并不是“收货单”的子窗口,所以我不知道如何处理它们的关系,现在我只是使用一个全局变量来传递“采购单”的ID,然后“收货单”接收到值之后再进行处理。

不知道各位牛人、高手、前辈有什么好的办法或思路没有?
...全文
196 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
不懂必须要问 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 clming327 的回复:]
感谢Jenemy8023!


引用 1 楼 jenemy8023 的回复:
为什么不行?没看懂
Form1 frm = null;
frm = (Form1)this.Owner;
干啊要这样写?

子窗口中根本就不用定义父窗口的。


这样写的原因是在子窗口中要操作父窗口的控件。
上面的代码我是根据下面改写的。

C# code

//先将父窗口中的控件设为p……
[/Quote]

明白了!!!

原来是这样,因为重新创建一个窗口对象,一切是空的。

因为程序现在正在运行,新创建那个等于新窗口了,与当前的父窗口无关。

所以要在显示子窗时给出父窗口是那个,然后在子窗口中this.Owner.Function();

明白了!!!



因为如果新实例一个窗口对象,是新的窗口,与你想操作的窗口无关。

所以只能 From f = null;

f = this.Owner;

这时的f才是你的父窗口。

如果 Form f = null;
f = new MyParent();

这样的话是一个新实例。
不懂必须要问 2010-08-26
  • 打赏
  • 举报
回复
明白了!!!

原来是这样,因为重新创建一个窗口对象,一切是空的。

因为程序现在正在运行,新创建那个等于新窗口了,与当前的父窗口无关。

所以要在显示子窗时给出父窗口是那个,然后在子窗口中this.Owner.Function();

明白了!!!
nsource 2008-11-05
  • 打赏
  • 举报
回复
父用子 直接调用实例变量

子用父 用 this.Parent
litgle 2008-11-05
  • 打赏
  • 举报
回复
你把父窗口传递过去,而且操作也针对父窗口,那当然不能共用了。

你完全可以把操作放到父窗口,而子窗口去调用并传参,这样就可以共用了。

你的第二个问题我也不清楚,还是等别人来回答吧。
clming327 2008-11-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 greystar 的回复:]
Form1:IMyInterface
{
public void do();
}

IMyInterface frm =this.Owner as IMyInterface ;
frm.do();
[/Quote]

感觉这个思路挺好的。
clming327 2008-11-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chenshuaijunsfsf 的回复:]
//先将父窗口中的控件设为public
//然后实例化子窗口时,将当前的父窗口传进去
Form2 frm = new Form2(this);
Form2.show();
//Form2为新弹出来的子窗口,this为当前打开的主窗体
//子窗口中的构造方法改下
private Form1 main=null;
public Form2(Form1 form)
{
this.main = form;
}

就这样,
你调用时,
写个
Form2 f2=new Form2(this);
这样就实现了你说的“传入参数”
[/Quote]

呵,这个方法跟我所讲的方法并没有本质区别。
假若我有一个Form3要和Form1一样使用Form2作为子窗口,那要怎么做?
像上面的这种办法是不行的,因为Form2中指定了main是Form1类的实例。
gongsun 2008-10-30
  • 打赏
  • 举报
回复
up..
greystar 2008-10-30
  • 打赏
  • 举报
回复
Form1:IMyInterface
{
public void do();
}

IMyInterface frm =this.Owner as IMyInterface ;
frm.do();
clming327 2008-10-30
  • 打赏
  • 举报
回复
感谢Jenemy8023!

[Quote=引用 1 楼 jenemy8023 的回复:]
为什么不行?没看懂
Form1 frm = null;
frm = (Form1)this.Owner;
干啊要这样写?

子窗口中根本就不用定义父窗口的。

[/Quote]
这样写的原因是在子窗口中要操作父窗口的控件。
上面的代码我是根据下面改写的。

//先将父窗口中的控件设为public
//然后实例化子窗口时,将当前的父窗口传进去
Form2 frm = new Form2(this);
Form2.show();
//Form2为新弹出来的子窗口,this为当前打开的主窗体
//子窗口中的构造方法改下
private Form1 main=null;
public Form2(Form1 form)
{
this.main = form;
}


[Quote=引用 1 楼 jenemy8023 的回复:]
mdi父窗口点击按钮打开子窗口:
if (!(frm == null))
{
frm.Close();
frm.Dispose();
}
frm = new form1();
frm.WindowState = FormWindowState.Maximized;
frm.MdiParent = this; …
[/Quote]
你所写的“传入参数”这一步我没看懂,不知道什么意思?
花落_ 2008-10-30
  • 打赏
  • 举报
回复
//先将父窗口中的控件设为public
//然后实例化子窗口时,将当前的父窗口传进去
Form2 frm = new Form2(this);
Form2.show();
//Form2为新弹出来的子窗口,this为当前打开的主窗体
//子窗口中的构造方法改下
private Form1 main=null;
public Form2(Form1 form)
{
this.main = form;
}

就这样,
你调用时,
写个
Form2 f2=new Form2(this);
这样就实现了你说的“传入参数”
jenemy8023 2008-10-30
  • 打赏
  • 举报
回复
为什么不行?没看懂
Form1 frm = null;
frm = (Form1)this.Owner;
干啊要这样写?


子窗口中根本就不用定义父窗口的。

mdi父窗口点击按钮打开子窗口:
if (!(frm == null))
{
frm.Close();
frm.Dispose();
}
frm = new form1();
frm.WindowState = FormWindowState.Maximized;
frm.MdiParent = this;
frm.Show();

非mdi窗口可以直接这样写:
form1 frm = new form1 ();
frm.proCardID = int.Parse(sId);//传入参数
frm.ShowDialog(); //也可以用show 一回事
frm.Dispose();
传参数么,子form里做个public变量,new之后show之前传入就可以,哪里要弄得这么麻烦??!!

110,567

社区成员

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

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

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