做Winform界面的時候,上面有六個文本框需要判空,之前的思路大致是這樣的,代碼如下: 代碼中寫了三個判斷,大概就是做一個註冊功能時所需要做的判空操作。可是,當我界面有六個文本框需要判空時,就覺得有點麻煩了,還要加三個if else判斷。於是,就想能不能將判空操作提取出一個方法來進行呢,這樣至少代 ...
做Winform界面的時候,上面有六個文本框需要判空,之前的思路大致是這樣的,代碼如下:
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判斷。於是,就想能不能將判空操作提取出一個方法來進行呢,這樣至少代碼看起來不會那麼冗餘。於是,就有了下麵的代碼:
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來代替。代碼如下:
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方法拿掉,將其當做參數傳過來。代碼如下:
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好像還沒有,覺得有必要也加上。以上只是個人思考,如有不當或可改進之處,還望不吝賜教。