露雨城市-南京.NET爱好者
主要讨论的为C#,ASP.NET,Sql Server2005,包括VSTS 2005的相关工具和功能。
posts - 29,  comments - 120,  trackbacks - 9

在.NET 1.0和1.1的版本中,我们要实现父窗口和子窗口之间的互操作,有两种简单的方法。
第一种,在主窗体类中定义一个静态成员,来保存当前主窗体对象,例如:

public static yourMainWindow pCurrentWin = null;  

   然后在主窗体构造函数中,给静态成员初始化,如下:

pCurrentWin = this;  

   那么在子窗体中调用父窗体,可以通过“主窗体类名. pCurrentWin”来操作当前的主窗体。 

   第二种,是在子窗体中定义一个私有成员,来保存当前主窗体对象,例如:

private yourMainWindow pParentWin = null;  

   然后在子窗体构造函数中,加一参数,如下:

public yourChildWindow( yourMainWindow WinMain )  
{  
  pParentWin 
= WinMain;  
  
//Other code  
}

   在主窗体创建子窗体的时候,要把this作为参数来构造子窗体,这样在子窗体中调用父窗体,可以直接用“this.pParentWin”就可以了 

   不过以上所作的,只是让你能够访问当前主窗体对象,那么如何操作控件,很多人直接修改控件的成员访问符,即把“private”改为“public”,我觉得这样破坏了本身类的封装,所以我比较喜欢的做法是增加公有属性或方法来供调用,例如: 

public string ButtonText  
{  
  
getreturn btn.Text;}  
  
set{ btn.Text = value;}  
}
  

public void Button_Click()  
{  
  
this.btnDConvert.PerformClick();//Execute button click  
}
 

虽然简单,不过略显得麻烦,在.NET 2.0版本中,也就是Visual C# 2005的版本中,我们可以直接使用Application.OpenForm["formname"].Controls("ControlName")来控制控件,可以说是非常的方便。
posted on 2006-10-20 07:10 露雨城市.NET2.0和Sql Server 2005开发研究 阅读(4805) 评论(12)  编辑 收藏 所属分类: C# 2.0

FeedBack:
2006-10-20 08:43 | zhh007's Bolg      
good tips!tks!
  回复  引用  查看    
2006-10-20 09:17 | 无赖.net      
我用事件委托实现的,
也是个主子窗口相互访问的例子http://www.cnblogs.com/TaeheeLive/archive/2006/09/20/509902.html

你提到的Application.OpenForm["formname"].Controls("ControlName")
我还不会,学习中~~~
  回复  引用  查看    
2006-10-20 09:22 | 沐枫      
既然博主说到类的封装了,那只有一个建议:
子窗口不要去操作主窗口,更不应该需要去知道有主窗口,尤其不应该知道主窗口里头有什么控件。


  回复  引用  查看    
2006-10-20 09:36 | 无赖.net      
又学到一招:Application.OpenForms[1].Close();
关闭主窗口打开的 多个子窗口中 最上面的一个。
类似查询分析器中的 关闭一个查询界面~~~~~,爽~
  回复  引用  查看    
2006-10-20 09:37 | omnislash      
Application.OpenForm["formname"].Controls("ControlName")
居然提供这种方式,微软简直是在唆使别人犯罪~~
  回复  引用  查看    
2006-10-20 10:20 | ※ABeen※      
前些日子做系统时还埋怨2003里这个功能不到位,2005里面可以直接这样用了。很不错!
  回复  引用  查看    
2006-10-20 11:58 | 路过 [未注册用户]
Application.OpenForm["formname"].Controls("ControlName")
连委托都省了,不知道是好事还是坏事。
  回复  引用    
2006-10-20 12:08 | 双鱼座      
读过楼主的文章以及各位参评者的评论,颇有感触。通常可以根据每个人的专业修养将.Net社区的人员分做两种:一种是以“沐枫”和“onmislash”为代表的,他们对面向对象的理解程度迫使他们在日常的分析、设计乃至思考问题都按照一些共同的原则来进行。在他们看来,在一个Form中访问另外一个Form以及使用Application.OpenForm["formname"].Controls("ControlName") 这样的手段来访问,看似捷径,实则危险。可惜他们的一番苦心楼主及其它参评者不一定能理解。不过他们是我所钦佩的人,是他们让我看到了.Net社区还有希望。
另一种是以楼主和其他参评者为代表的,他们为了达到目的可以不择手段,他们觉得“优雅”是一种毫无实际意义的标准,或者他们根本不知道什么叫“优雅”。他们总是在到处搜索各种编程密籍、寻找捷径、好高鹜远,根本不重视思想的提炼。
抛开线程同步与冲突不谈,觉得楼主的文章始终在强调一个概念:如何通过提高耦合来达到方便访问的目的,而不是支持设计中最基本的原则:降低耦合,提高内聚。当然,比较推荐的作法是定义一个接口,然后通过访问接口来实现解耦,当然,委托也是一种接口的形式。设想一下,如果有人改了一下主窗口中的控件,那每一个子窗口岂不是都要来一次重构?
至于Application.OpenForm["formname"].Controls("ControlName") 这种类似晚绑定的方式,也许方便,但非常危险。这种另外一种形式的硬编码,是无法通过重构来提高代码质量的。
  回复  引用  查看    
2006-10-20 13:12 | 无赖.net      
@双鱼座
@omnislash
使用Application.OpenForms[1].Close(); 仅仅是个人为解决关窗这个小问题。至于直接修改Application.OpenForm["formname"].Controls("ControlName") 控件属性,实则不懂得用,呵呵。在VS2005中,多线程中就 限制子线程直接改变主线程界面的属性(VS2003可以直接用)。但是提供了委托的方式去安全的访问主线程界面,以及一个类BackgroundWorker(好像就是个委托,不能自定义参数罢)。
如何:对 Windows 窗体控件进行线程安全调用
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxmclictl/html/138f38b6-1099-4fd5-910c-390b41cbad35.htm
偶最爱的还是事件委托。至于“他们为了达到目的可以不择手段”,冤~明知是危险的方式,偶宁可不用,浪费时间!应该在技术中追求软件的柔性体系,仅仅技术是:非好感。

  回复  引用  查看    
2006-10-20 14:11 | ZergTant      
我直接用的单件模式,用起来和方便,现在没出现什么问题
  回复  引用  查看    
#11楼 [楼主]
2006-10-22 08:20 | 露雨城市.NET2.0和Sql Server 2005开发研究      
.Net2.0中确实提供了非常多的“非常方便”的方法调用和语句,我也又写了一个关于如何简写委托和事件的方法,这种情况除了+=之外,更看不出那是一个委托语句,不过它只是一种简写的方式。实际上只是表面上的简化,在内部还是完整的原型 += new EventHandler(object sender,EventArgs e);。
所以包括我在这里提供的Application.OpenForm....方法,也只是个缩写方式,因为我们仍然知道它是如何工作的。所以我整篇文章并没有直接就写这么个方法来告诉别人这个捷径,只是放在了最后,就是这个道理。
  回复  引用  查看    
2007-11-07 21:39 | liyun [未注册用户]
非常感谢!
  回复  引用    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-10-22 09:07 编辑过


相关链接:
 
 网名:MOON
 博客:luyu.cnblogs.com
 网站:露雨虚拟城市
 QQ:80188871 (注明.net爱好者)
 mail:moonxp@126.com


<2006年10月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

与我联系

搜索

 

常用链接

留言簿(6)

我参与的团队

随笔分类(35)

随笔档案(29)

收藏夹(34)

个人网站

  • 露雨虚拟城市
  • 我的个人网站,欢迎大家访问交流,交个朋友吧。 本人是南京的。 :)
  • 设计资源无限网-韩国网站模版
  • 平面设计资源,韩国网页模版,韩国网页设计,韩国网站设计,韩国模版,矢量图,韩国矢量图,韩国素材,韩国设计资源,网站设计,网页设计

优秀Blog

最新随笔

积分与排名

  • 积分 - 45532
  • 排名 - 938

最新评论

阅读排行榜

评论排行榜