现在的位置: 首页 > 综合 > 正文

一种窗体消息分发机制

2012年05月25日 ⁄ 综合 ⁄ 共 3155字 ⁄ 字号 评论关闭

        这种机制来自于我看到的一个datagrid操作范例(来自codeproject——using the datagrid control),自己觉得还不错,而且以前也没用到,所以就在这里分享一下,我也没在博客园上搜,不知道别人介绍过没有,就献个丑了。
        窗体图:
        

    平常我们编写一个窗体事件的处理程序时通常是使用该事件的默认函数,比如button1_click(...),之类的。但这样做的话会出现界面元素与业务逻辑代码过度耦合的情况,比如我们在设计菜单的时候,想将一个菜单项的功能换到另一个菜单项里面,就比较麻烦了,需要进行大量的代码剪切复制,然后又要测试。在我看的例子里面,作者用同一个函数fnAllButtonsClicks作为每个窗体函数的响应事件函数。
    例如:
    this.btInsertnew.Click += new System.EventHandler(this.fnAllButtonsClicks);
    this.btUpdate.Click += new System.EventHandler(this.fnAllButtonsClicks);
    this.btDelete.Click += new System.EventHandler(this.fnAllButtonsClicks);
    ……

    在fnAllButtonsClicks里面,用switch if根据不同的事件调用不同的函数:

 1    //这个程序的事件基本只涉及到按钮点击事件
 2          private void fnAllButtonsClicks(object sender, System.EventArgs e)
 3      {
 4          Button bt=(Button)sender; //get which button clicked
 5          switch (bt.Text) //button-text
 6          {
 7          
 8             case "Insert"      : fnInsertNew();
 9                                     break;
10            
11             case "Save/Update"      
12                                  : fnSaveUpdate();                        
13
14             
15                                     break;    
16                         
17             case "Delete"      : fnDelete();                                    
18                                     break;    
19                     
20             case "ReadFromXML"      
21                                  : fnDataReadingFromXMLFile("C:\\MyXMLdata.xml");        
22
23                            
24                                     break;
25             
26             case "Refresh"  : fnRefresh();
27                                     fnEnableDisableAllButtons(true);            
28
29                 
30                                     break;
31                                                                 
32
33   
34             case "CopyToXML": fnCopyToXMLandTextFile();                                
35
36     
37                                     break;                            
38
39                                                                      
40
41            
42          
43             case "WriteToTextFile"   
44                                  : fnWriteToTextFile();
45                                     break;
46          
47             case "Exit"      : Application.Exit();                 
48                                     break;                            
49                                
50          }
//switch
51      }

     然后编写每个处理函数的代码:
     fnSaveUpdate(){……}
     fnDelete(){……}
     ……

     由此可见,对界面上的改动就限制到fnAllButtonsClicks里面了。

     另外它的启用/禁用全部按钮的方法也不错(我以前的方法真的很笨的):

 1      //- This is the way to enable or disable ALL the buttons on the Form
 2      //- if flag true all buttons enabled, if false buttons disabled
 3      public void fnEnableDisableAllButtons(bool flag) 
 4      {
 5         string str;
 6         foreach(Control ctrl in this.Controls) 
 7         {
 8            str = Convert.ToString(ctrl.GetType());
 9            if(str == "System.Windows.Forms.Button"
10            {
11              ctrl.Enabled = flag;
12            }
//if
13         }
//foreach
14      }

      同时这个例子对学习dataset/xml互操作也挺有帮助的。

抱歉!评论已关闭.