大量文本框非空判斷,如何提升靈活性?

作Winform界面的時候,上面有六個文本框須要判空,以前的思路大體是這樣的,代碼以下:spa

 1 if (txtUserName.Text.Trim() == "")
 2 {
 3     MessageBox.Show("用戶名不能夠爲空!", "舒適提示");
 4     txtUserName.Focus();
 5 }
 6 else if (txtPassword.Text.Trim() == "")
 7 {
 8     MessageBox.Show("密碼不能夠爲空!", "舒適提示");
 9     txtPassword.Focus();
10 }
11 else if (txtConfirmPassword.Text.Trim() == "")
12 {
13     MessageBox.Show("確認密碼不能夠爲空!", "舒適提示");
14     txtConfirmPassword.Focus();
15 }
16 else
17 {
18     MessageBox.Show("註冊成功!", "舒適提示");
19 }

代碼中寫了三個判斷,大概就是作一個註冊功能時所須要作的判空操做。但是,當我界面有六個文本框須要判空時,就以爲有點麻煩了,還要加三個if else判斷。因而,就想能不能將判空操做提取出一個方法來進行呢,這樣至少代碼看起來不會那麼冗餘。因而,就有了下面的代碼:code

 1 bool isEmpty = CheckEmpty(txtUserName, txtPassword, txtConfirmPassword);
 2 if (isEmpty)
 3 {
 4     MessageBox.Show("註冊成功!", "舒適提示");
 5 }
 

7 /// <summary> 8 /// 自定義方法,判斷某文本框是否爲空 9 /// </summary> 10 /// <param name="txt">要進行判斷的標籤</param> 11 /// <returns>是否全都不爲空</returns> 12 public bool CheckEmpty(params TextBox[] txt) 13 { 14 bool flag = true; 15 for (int i = 0; i < txt.Length; i++) 16 { 17 if (txt[i].Text.Trim() == "") 18 { 19 string name = txt[i].Name; 20 //將name轉換爲對應label的值 21 name = Change(name); 22 MessageBox.Show(name + "不能夠爲空,請從新輸入!","舒適提示"); 23 txt[i].Focus(); 24 flag = false; 25 break; 26 } 27 } 28 return flag; 29 } 30 31 /// <summary> 32 /// 將文本框Name值轉換成對應的Label文本 33 /// </summary> 34 /// <param name="name"></param> 35 /// <returns></returns> 36 private string Change(string name) 37 { 38 switch (name) 39 { 40 case "txtUserName": 41 name = "用戶名"; 42 break; 43 case "txtPassword": 44 name = "密碼"; 45 break; 46 case "txtConfirmPassword": 47 name = "確認密碼"; 48 break; 49 default: 50 break; 51 } 52 return name; 53 }

這樣一來,判空的代碼看起來就清晰多了,將須要判空的文本框當作參數傳過去便可。不過,又有一個問題,咱們能夠看到,Change方法中將文本框Name屬性值轉換爲對應的label文本時,每添加一個判斷,必需要增長一個case,這樣一來,若是有一百個判斷,那代碼就太長了。那麼,有沒有一種方法,便可以替代Switch….Case又能夠縮短代碼行呢?答案是:有的,用Dictionary來代替。代碼以下:orm

 1 /// <summary>
 2 /// 將文本框Name值轉換成對應的Label文本
 3 /// </summary>
 4 /// <param name="name"></param>
 5 /// <returns></returns>
 6 private string Change(string name)
 7 {
 8     Dictionary<string, string> myDic = new Dictionary<string, string>();
 9     myDic.Add("txtUserName", "用戶名");
10     myDic.Add("txtPassword", "密碼");
11     myDic.Add("txtConfirmPassword", "確認密碼");
12     return myDic[name];
13 }

咱們能夠看到,Dictionary實現了同Switch同樣的功能,代碼從15行變成了5行,並且Switch每增長一個判斷,須要增長三行代碼,而Dictionary只需增長一行代碼便可。到如今爲止,判斷這個操做看起來算是不那麼麻煩了。咱們知道,優秀的代碼通常都是可擴展,可複用的。而目前,上面的代碼並無作到可複用。CheckEmpty方法中須要用到Change方法來轉換提示信息,而Change方法中的字典是寫死的。這個時候,若是想複用CheckEmpty方法就必須將Change方法拿掉,將其當作參數傳過來。代碼以下:blog

 1 bool isEmpty = CheckEmpty(TopMessage(), txtUserName, txtPassword, txtConfirmPassword);
 2 if (isEmpty)
 3 {
 4     MessageBox.Show("註冊成功!", "舒適提示");
 5 }
 6 
 7 /// <summary>
 8 /// 提示信息轉換
 9 /// </summary>
10 /// <returns></returns>
11 private Dictionary<string, string> TopMessage()
12 {
13     Dictionary<string, string> myDic = new Dictionary<string, string>();
14     myDic.Add("txtUserName", "用戶名");
15     myDic.Add("txtPassword", "密碼");
16     myDic.Add("txtConfirmPassword", "確認密碼");
17     return myDic;
18 }
19 
20 /// <summary>
21 /// 自定義方法,判斷某文本框是否爲空
22 /// </summary>
23 /// <param name="txt">要進行判斷的標籤</param>
24 /// <returns>是否全都不爲空</returns>
25 public bool CheckEmpty(Dictionary<string,string> myDic,params TextBox[] txt)
26 {
27     bool flag = true;
28     for (int i = 0; i < txt.Length; i++)
29     {
30         if (txt[i].Text.Trim() == "")
31         {
32             string name = txt[i].Name;
33             //將name轉換爲對應label的值
34             name = myDic[name];
35             MessageBox.Show(name + "不能爲空,請從新輸入","舒適提示");
36             txt[i].Focus();
37             flag = false;
38             break;
39         }
40     }
41     return flag;
42 }

這樣,CheckEmpty方法就能夠複用了。在Web應用中,文本框是有一個屬性能夠設置是否容許爲空的,不過Winform好像尚未,以爲有必要也加上。以上只是我的思考,若有不當或可改進之處,還望不吝賜教。string

相關文章
相關標籤/搜索