关于主窗体与子窗体之间的通信以及面向对象思想的一些应用
2011-01-15 18:04
477 查看
该写几篇文章啦~
最近在搞winForm,开始的时候遇到点问题。其实也不算什么大问题,归结起来还是主窗体与子窗体之间传值、通信的问题;
这个问题在网上的解决方案有很多,一搜一大堆,比如将主窗体自身作为子窗体构造函数的参数。使用委托,事件,接口等都可以实现让子窗体与父窗体的通信。
但是,像使用事件等方式的前提一般是在子窗体的实例已经能够被父窗体引用的情况下。我遇到的问题是,如果子窗体的实例甚至是类型,父窗体一开始就不知道。在这种情况下,要能更好地实现通信,最好的方式还是利用面向对象的继承特性。
功能如下图:
如果我们想要——打开不同的窗体时,不同的菜单按钮要灰掉这个功能,并且打开的窗体不可预知(是在用户点击不同按钮时自动创建的,比如你点人事跟踪管理,出现的是人事跟踪作业的窗体,点考勤管理,是考勤作业的窗体)。我们应该怎么做呢?
我们可以让这些子窗体,共同继承自同一个窗体的基类。在这个窗体的基类中定义一些虚属性:
而继承自这个基类的子窗体,需要让哪个图标可用哪个图标不可用,只需重写这些虚属性,按自己的逻辑实现。
同样,这些菜单对应的功能——“增、删、改、查”,也可以同样用虚方法予以实现,子窗体根据自己的逻辑予以重写。
这样,在主窗体的MdiChildActivate事件中,我们就可以利用多态的特性(因为所有的这些子窗体都是继承自一个基窗体类)。所有我们可以将所有创建的子窗体的引用赋给这个基窗体,让这个基窗体根据运行时多态,来决定实现哪个子窗体的语义逻辑。
大体实现如下(这里只是简单实现了修改主窗体的Text和,设置两个菜单的Enable属性):
这里,这个问题还是请教了老师一下。主要还是一个面向对象思想的问题。我们想让所有的窗体都做一些共同的事情,而这些事情具体怎么做取决于他们自己,这显然会用到多态、继承等面向对象的特征。
最近在搞winForm,开始的时候遇到点问题。其实也不算什么大问题,归结起来还是主窗体与子窗体之间传值、通信的问题;
这个问题在网上的解决方案有很多,一搜一大堆,比如将主窗体自身作为子窗体构造函数的参数。使用委托,事件,接口等都可以实现让子窗体与父窗体的通信。
但是,像使用事件等方式的前提一般是在子窗体的实例已经能够被父窗体引用的情况下。我遇到的问题是,如果子窗体的实例甚至是类型,父窗体一开始就不知道。在这种情况下,要能更好地实现通信,最好的方式还是利用面向对象的继承特性。
功能如下图:
如果我们想要——打开不同的窗体时,不同的菜单按钮要灰掉这个功能,并且打开的窗体不可预知(是在用户点击不同按钮时自动创建的,比如你点人事跟踪管理,出现的是人事跟踪作业的窗体,点考勤管理,是考勤作业的窗体)。我们应该怎么做呢?
我们可以让这些子窗体,共同继承自同一个窗体的基类。在这个窗体的基类中定义一些虚属性:
#region virtual properties public virtual Boolean New_Enable { get; set; } public virtual Boolean Open_Enable { get; set; } public virtual Boolean Edit_Enable { get; set; } public virtual Boolean Delete_Enable { get; set; } public virtual Boolean Save_Enable { get; set; } public virtual Boolean Refresh_Enable { get; set; } #endregion
而继承自这个基类的子窗体,需要让哪个图标可用哪个图标不可用,只需重写这些虚属性,按自己的逻辑实现。
同样,这些菜单对应的功能——“增、删、改、查”,也可以同样用虚方法予以实现,子窗体根据自己的逻辑予以重写。
#region Virtual Methods public virtual void Remove() { } public virtual void RefreshData() { } public virtual void Create() { } public virtual void Edit() { } public virtual void Save() { } public virtual string ChangeTitle() { return this.Text; } #endregion
这样,在主窗体的MdiChildActivate事件中,我们就可以利用多态的特性(因为所有的这些子窗体都是继承自一个基窗体类)。所有我们可以将所有创建的子窗体的引用赋给这个基窗体,让这个基窗体根据运行时多态,来决定实现哪个子窗体的语义逻辑。
大体实现如下(这里只是简单实现了修改主窗体的Text和,设置两个菜单的Enable属性):
private void MainForm_MdiChildActivate(object sender, EventArgs e) { if (this.ActiveMdiChild != null) { //set title activeForm = this.ActiveMdiChild as SubFormBase; if (activeForm != null) { this.Text = string.Format("Nikita-{0}", activeForm.ChangeTitle()); this.labActivedForm.Text = string.Format("Nikita-{0}", activeForm.ChangeTitle()); //set toolbarbuttons can be enable this.toolBarButtonDelete.Enabled = activeForm.Delete_Enable; this.toolBarButtonEdit.Enabled = activeForm.Edit_Enable; } else { MessageBox.Show("activeForm is null."); } } else { this.Text = "Nikita"; this.labActivedForm.Text = "Nikita"; } }
这里,这个问题还是请教了老师一下。主要还是一个面向对象思想的问题。我们想让所有的窗体都做一些共同的事情,而这些事情具体怎么做取决于他们自己,这显然会用到多态、继承等面向对象的特征。
相关文章推荐
- 关于面向对象思想在程序开发中的应用
- 黑马程序员_学习笔记2交通灯系统中面向对象思想的理解以及工厂模式的应用
- 前端通信:SSE设计方案(二)--- 服务器推送技术的实践以及一些应用场景的demo(包括在线及时聊天系统以及线上缓存更新,代码热修复案例)
- 面向对象思想 - 关于对象(材料来自thinking in Java,这些东西是跟C#相通的,跟语言无关)
- php面向对象中的单例与静态方法的对比,以及关于class自动加载的分析
- 学生成绩管理系统2(java类的运用,面向对象思想的应用)
- 对象之间的通信,面向对象的三大特征,封装,继承,多态;以及重写,重载
- 面向对象,构造以及static应用整理
- 面向对象思想解决的问题以及面向对象的三个特征
- 关于面向对象思想
- 依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦(转good)
- 学生成绩管理系统2(java类的运用,面向对象思想的应用)
- 关于面向对象思想中二维数组如何与对象映射思路的思考
- 黑马程序员——Java语言基础——03.面向对象(1)思想和一些概念
- 关于两个GPRS之间点对点通信的一些说明。
- 面向对象程序设计思想 在单片机中的应用
- [转]关于Iframe之间以及与父窗体的值传递
- 关于对象之间通信的一点思考
- 关于递归思想与prolog中的一些递归应用总结
- Android的跨进程通信介绍----------------aidl,传递复杂对象以及Server和Clicent之间的回调