刚刚.Net相关知识技术互动平台(绿色天堂)
.Net知识技术交流、探讨、请教与共享(Visual Studio.Net、Asp.Net、VB/C#、.NetWindows应用程序、Windows服务、Socket通信、GIS、ArcGIS、JavaScript、Sql Server和Oracle等)
posts - 81,  comments - 948,  trackbacks - 41
      看到这个题目相信有很多人都会说:“这个还用说,早会了!”
      没错,无可否认有很多人肯定都知道了。然而最近突然有人问我,说他在网上查找了半天不是没有找到合适的文章就是找到的文章不是很清楚。于是我想就此问题的解决发表到我的博客中,让更多的人能够清楚实现方法。
      因为主要是窗体回调问题,所以就不过多阐述了,给出详细的代码应该就可以理解了。

      我们这里假设已经存在了两个窗体分别为:FormFather(父窗体)和FormChild(子窗体),而父窗体中有一个名为Btn_OpenChild的按钮,用来打开子窗体,子窗体中也有个名为Btn_IsTrue按钮和一个TextBox控件。当TextBox控件中输入“True”时,父窗体的Btn_OpenChild可用,并关闭子窗体,当输入其它任何字符或字符串父窗体的Btn_OpenChild都不可用而不关闭子窗体,当然刚启动程序时的父窗体的Btn_OpenChild按钮是可用的。下面是实现的代码:
 1//下面是主窗体的代码
 2using System;
 3using System.Collections.Generic;
 4using System.ComponentModel;
 5using System.Data;
 6using System.Drawing;
 7using System.Text;
 8using System.Windows.Forms;
 9
10namespace MDIFormDemo
11{
12    public partial class FormFather : Form
13    {
14        public FormFather()
15        {
16            InitializeComponent();
17        }

18
19        private void OpenChild()//在MDI父窗体中显示子窗体
20        {
21            foreach (Form f in this.MdiChildren)
22            {
23                if ((f) is FormChild)
24                {
25                    f.Activate();
26                    return;
27                }

28            }

29            FormChild frm = new FormChild(this);
30            frm.MdiParent = this;
31            frm.Show();
32        }

33
34        private void FormFather_Load(object sender, EventArgs e)
35        {
36            OpenChild();//父窗体被打开时,子窗体也同时被打开
37        }

38        private void Btn_OpenChild_Click(object sender, EventArgs e)
39        {
40            OpenChild();//如果Btn_OpenChild可用,则点击此按钮也能打开子窗体
41        }

42}
主窗体中没有什么特别的,只是注意第29行的代码中的“this”,接合子窗体的代码你就能明白为何要加上这个“this”了(平时只为了打开子窗体时,我们都不会需要在括号中输入“this”)。
//下面是子窗体的代码 
1
using System;
 2using System.Collections.Generic;
 3using System.ComponentModel;
 4using System.Data;
 5using System.Drawing;
 6using System.Text;
 7using System.Windows.Forms;
 8
 9namespace MDIFormDemo
10{
11    public partial class FormChild : Form
12    {
13        private FormFather MyForm;
14        public FormChild (FormFather f)
15        {
16            InitializeComponent();
17            MyForm = f;
18        }

19
20        private void FormChild_Load(object sender, EventArgs e)
21        {
22
23        }

24
25        private void Btn_IsTrue_Click(object sender, EventArgs e)
26        {
27             if (this.textBox1.text == "True")
28             {
29                   MyForm.Btn_OpenChild.Enabled = true;
30                  this.Close();
31             }

32             else
33             {
34                  MyForm.Btn_OpenChild.Enabled = false;
35             }

36        }

37}
主窗体的按钮能用暂且不说,你先在子窗体的TextBox控件中输入一个非“True”的字符或字符串,此时你看看主窗体的Btn_OpenChild是否变成灰色的不可用的状态了呢?

以上代码运行环境为VS.NET2005,本人在此下面运行通过,你不妨建立一个MDIFormDemo工程试验一下。

作者对转载者要求说明(以下简称本说明):

1、确保您已经遵守了《中华人民共和国信息网络传播权保护条例》,且必须遵守《刚刚网络作品版权声明》(若两文件有冲突内容以《中华人民共和国信息网络传播权保护条例》为准,但其他非冲突内容依然各自有效),再转载。

2、“本说明、作者、作者博客网址及作者博客坐落,本文中提及的各种说明、备注或附录性文字”必须被转载,且不得改变其原有内容和要表达的意图!
作者:刚刚   作者博客网址:http://lijigang.cnblogs.com/   作者博客坐落在博客园


把握现实生活,培养自身能力
掌握新型技术,提高自我力量

posted on 2007-01-14 04:34 刚刚 阅读(3879) 评论(24)  编辑 收藏 网摘 所属分类: ASP.Net技术

FeedBack:
2007-01-14 09:36 | Warren Buffett      
是否可以使用观察者模式去实现呢?
  回复  引用  查看    
#2楼[楼主]
2007-01-14 11:32 | 刚刚      
应该是可以的吧,我没有用观察者模式做过,不知道你是否做过类似的程序,可以将方法发表到此,让我们大家研究一下如何呢?
  回复  引用  查看    
2007-01-14 11:46 | Cat Chen      
Form对象自身有个MidParent的属性的,不过是需要你手动设置的。
  回复  引用  查看    
2007-01-14 12:57 | 俺在找工作。。。[未注册用户]
有空还是写写你的GIS开发实在些
  回复  引用    
#5楼[楼主]
2007-01-14 13:17 | 刚刚      
@Cat Chen
应该是MdiParent属性吧,相信是你笔误了,呵呵……

@俺在找工作。。。
你说的对!不过现在项目正在开发数据库。还没有碰见什么疑难的问题需要解决和讨论!

  回复  引用  查看    
2007-01-14 14:48 | Cat Chen      
@刚刚
汗……这么弱智的笔误我也能写出来,真的不知道自己刚刚在想什么。那个属性是要自己手动设置的,不会自动甚至为调用方的,这点比较不好。

  回复  引用  查看    
#7楼[楼主]
2007-01-14 16:48 | 刚刚      
@Cat Chen
呵呵,笔误而已,也没什么了。你说的没错,其实方法还有很多!写这随笔也只是为一些为此还在困惑的人解闷罢了。因为现在初学.Net和Java的人也有不少,所以可能会帮助到他们!

  回复  引用  查看    
2007-01-14 17:50 | ColdDog      
进度条什么的例子可以用到,比如进度到一半的时候,点击进度条上的“取消”,然后控制父窗体的流程。
  回复  引用  查看    
#9楼[楼主]
2007-01-14 21:53 | 刚刚      
@ColdDog
哦!谢谢!有机会可以研究探讨……

  回复  引用  查看    
2007-01-15 09:36 | [csdn.net]Oriesmap[未注册用户]
这个例子举的很差。
如果初学者照这样写程序,那肯定是走错了方向,子窗体中压根儿就不应该直接这样写,
MyForm.Btn_OpenChild.Enabled = true;
这简直会把这两个窗体死死的捆绑在一起的。

  回复  引用    
2007-01-15 09:59 | Frank[未注册用户]
这样做的话子窗体和父窗体间耦合度太紧密了,用事件回调比较好。
  回复  引用    
2007-01-15 16:21 | 阿水      
确实耦合度高了点。
我觉得应该对父窗体进行抽象,把所有的功能定义好。
然后子窗体只是需要调用父窗体的相应的功能。当然
可能需要 FORM到自定义FORM的强制转换,感觉有点
生涩 。

  回复  引用  查看    
#13楼[楼主]
2007-01-15 22:05 | 刚刚      
@[csdn.net]Oriesmap
@Frank
@阿水
谢谢大家给出的建议、意见和评论,多谢你们的支持!

  回复  引用  查看    
2007-01-15 22:22 | pp1982[未注册用户]
用委托来实现用观察者模式

1. 在FormFather类里定义一个方法private void DisableMenu(bool flag)

2. FormChild类里定义一个委托
public delegate void InputTrueHandler(bool flag);
public InputTrueHandler MyHandler;

3. 在OpenChild()方法里实例化FormChild后将DisableMenu方法注册到实例化后的FormChild对象的InputTrueHandler类型委托MyHandler上
FormChild frm = new FormChild();
frm.MdiParent = this;
frm.MyHandler+= new FormChild.InputTrueHandler(DisableMenu)
frm.Show();



4. Btn_IsTrue_Click改为如下:
private void Btn_IsTrue_Click(object sender, EventArgs e)
{
if (this.textBox1.text == "True")
{
if(MyHandler!=null)
MyHandler(true);
this.Close();
}
else
{
if(MyHandler!=null)
MyHandler(true);
}
}


这样子窗体就不用知道父窗体的存在,从而解除2个窗体间的偶合,让子窗体复用性更高

  回复  引用    
2007-01-15 22:24 | pp1982[未注册用户]
最后else里的代码应该是:
if(MyHandler!=null)
MyHandler(false);

  回复  引用    
2007-01-16 00:39 | Jeffrey Zhao      
这些不是Atlas的内容阿。:)
  回复  引用  查看    
#17楼[楼主]
2007-01-16 12:55 | 刚刚      
@pp1982
谢谢您给出的这个不错的另一种解决方法。我想你说的FormFather类中的方法private void DisableMenu(bool flag)的代码, 应该就是控制菜单是否可用的方法了,再次万分感谢您!

@Jeffrey Zhao
这个确实不是Atlas的内容,只是想多研究一下,把这个帖子发到Atlas的团队中实在是不好意思,希望不要介意,主要还是希望能有更多的人来此出谋划策而已!呵呵…… :)

  回复  引用  查看    
2007-01-29 22:34 | Giddens      
这种方式在 MainForm 和 ChildForm 不在同一个 DLL(程序集) 时会出现循环引用的问题,而一般在一个大的项目中,MainForm和ChildForm一定不是在同一个程序集中的。
  回复  引用  查看    
#19楼[楼主]
2007-01-30 15:20 | 刚刚      
@Giddens
我这个只是一个方法。不知道你还有否其他高见!

  回复  引用  查看    
2007-02-05 16:15 | superdullwolf[未注册用户]
观察者模式,其实就是实例化老鼠时候把猫当参数带上。

猫大叫,窜,主人惊醒。

  回复  引用    
#21楼[楼主]
2007-02-08 01:16 | 刚刚      
@superdullwolf
你的解释很生动,谢谢!

  回复  引用  查看    
2007-02-20 21:57 | JesseZhao      
小技巧总是要收场以下的
  回复  引用  查看    
2007-02-28 20:54 | 33[未注册用户]
11
  回复  引用    
#24楼[楼主]
2007-03-05 10:41 | 刚刚      
@JesseZhao
呵呵……,2月20日我不在乌鲁木齐,没有网络,你怎么初三就上网了,年过得如何?

@33
谢谢关注。

  回复  引用  查看    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 619878




相关文章:

相关链接:
IT新闻:
郑重声明:
本博客的所有内容均使用
{中华人民共和国国务院令信息网络传播权保护条例}
{刚刚网络作品版权声明}
保护本博客网络作品版权
    非常欢迎您的到来!Asp.Net Ajax已经出台正式的第3.5版了,现将有关下载放在了本博客的置顶随笔中,有需要者请大家浏览此置顶随笔或者点击此处,因博客园上传附件大小和空间容量有限,刚刚(也就是本人)决定将最新版本放在CSDN资源上,望广大博友谅解。如果有人希望最新动态,请关注官方网站,网址请点击此处
本人其他博客:超越自我de博客刚刚.Net相关知识技术互动平台(粉色回忆)163博客百度博客

     ——刚刚 (公告)

搜索

 

常用链接

留言簿

我管理的小组

我参与的团队

随笔分类(89)

随笔档案(81)

文章分类(2)

文章档案(2)

收藏夹(158)

本人其他博客

园子里的优秀博客

最新随笔

积分与排名

  • 积分 - 173969
  • 排名 - 285

最新评论

阅读排行榜

评论排行榜