• 大量文本框非空判断,如何提高灵活性?


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

  • 相关阅读:
    OOAD-2 UML建模、类、接口、类图的详细介绍
    OOAD-1 GOF中的23种设计模式的分类和功能
    java核心技术第四章疑问点
    数据结构中的遇到的一些小知识整理
    springboot中一次坑爹的打包体验
    mybatis中@param的使用与否
    mybatis 防止sql注入
    java窗口
    java异常处理
    第三次上级作业
  • 原文地址:https://www.cnblogs.com/daley/p/8065834.html
Copyright © 2020-2023  润新知