zoukankan      html  css  js  c++  java
  • 大量文本框非空判断,如何提高灵活性?

    做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好像还没有,觉得有必要也加上。以上只是个人思考,如有不当或可改进之处,还望不吝赐教。

  • 相关阅读:
    LeetCode Binary Tree Inorder Traversal
    LeetCode Populating Next Right Pointers in Each Node
    LeetCode Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode Reverse Linked List II
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Pascal's Triangle
    Palindrome Construct Binary Tree from Preorder and Inorder Traversal
    Pascal's Triangle II
    LeetCode Word Ladder
    LeetCode Binary Tree Zigzag Level Order Traversal
  • 原文地址:https://www.cnblogs.com/daley/p/8065834.html
Copyright © 2011-2022 走看看