您的位置:首页 > 其它

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

2011-01-15 18:04 477 查看
该写几篇文章啦~

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


这里,这个问题还是请教了老师一下。主要还是一个面向对象思想的问题。我们想让所有的窗体都做一些共同的事情,而这些事情具体怎么做取决于他们自己,这显然会用到多态、继承等面向对象的特征。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐