最近在公司开发一个winform 应用程序, MDI 模式。具体功能是实现串口通讯,用Chart演示数据。
在开发这个项目过程中的体会:
(1)当new 一个Form窗体类或其他类时,在构造函数中最好不要做与业务逻辑或稍复杂功能的处理,最多
做些参数初始化,事件注册,简单赋值处理。
理由:用一缺点说明。在构造函数中做复杂处理的话,当有异常发生时,系统容易崩溃,try...
catch 也不能避免这种运行中发生的异常。
(2)由于MDI窗体中一般会用菜单模式,所以MainForm中的设计时,使用几十种模式中的command模
式比较好。
主要代码如下:
using System;
namespace CsglChart.Common.Class
{
public delegate void MenuCommandHandler(System.Windows.Forms.MenuItem menuItem, string command);
public class clsMenuCommandSender
{
public clsMenuCommandSender()
{
this.m_Handler = new EventHandler(this.MenuClick);
}
}
public void Registe(ICommandHandler command, System.Windows.Forms.MenuItem menuItem)
{
BindItem item = new BindItem();
item.Command = command;
item.MenuItem = menuItem;
menuItem.Click += m_Handler;
m_Items.Add(item);
}
public ICommandHandler GetCommand(System.Windows.Forms.MenuItem menuItem)
{
foreach(BindItem item in m_Items)
{
if (item.MenuItem == menuItem)
{
return item.Command;
}
}
return null;
}
public System.Windows.Forms.MenuItem GetMenuItem(ICommandHandler command)
{
foreach(BindItem item in m_Items)
{
if (item.Command == command)
{
return item.MenuItem;
}
}
return null;
}
#region Inner code
private System.Collections.ArrayList m_Items = new System.Collections.ArrayList();
private class BindItem
{
public System.Windows.Forms.MenuItem MenuItem = null;
public ICommandHandler Command = null;
}
private System.EventHandler m_Handler = null;
private void MenuClick(object sender, System.EventArgs e)
{
foreach(BindItem item in m_Items)
{
if (item.MenuItem == sender)
{
item.Command.excute(sender);
break;
}
}
}
#endregion
}
public interface ICommandHandler
{
void excute(object sender);
}
}
由于工具条上的快捷按钮与菜单中的某些按钮功能一样,所以注册完菜单按钮之后,再把工具条的快捷按钮
与对应菜单按钮邦定即可。
this.toolBar.Buttons[15].Tag = this.mtWindow_Arrange;
toolBar.ButtonClick += new ToolBarButtonClickEventHandler(toolBar_ButtonClick);
private void toolBar_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
System.Windows.Forms.ToolBarButton toolBtn = e.Button;
if (toolBtn.Tag != null)
{
MenuItem item = (MenuItem)toolBtn.Tag;
item.PerformClick();
}
}
再有其他心得继续写。。。