关于主窗体与子窗体之间的通信以及面向对象思想的一些应用

该写几篇文章啦~

 

最近在搞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"; } }

这里,这个问题还是请教了老师一下。主要还是一个面向对象思想的问题。我们想让所有的窗体都做一些共同的事情,而这些事情具体怎么做取决于他们自己,这显然会用到多态、继承等面向对象的特征。

 

转载于:https://www.cnblogs.com/wdpp/archive/2011/01/15/2386636.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值