• WinForm容器内控件批量效验是否同意为空?设置是否仅仅读?设置是否可用等方法分享


    WinForm容器内控件批量效验是否同意为空?设置是否仅仅读?设置是否可用等方法分享

     

      在WinForm程序中,我们有时须要对某容器内的全部控件做批量操作、如批量推断是否同意为空?批量设置为仅仅读、批量设置为可用或不可用等经常使用操作。本文分享这几种方法,起抛砖引玉的作用。欢迎讨论。

     1、  清除容器控件内里面指定控件的值的方法

    /// <summary>
    /// 清除容器里面指定控件的值(通过控件的AccessibleName属性设置为"EmptyValue")
    /// </summary>
    /// <param name="parContainer">容器控件</param>
    public static void EmptyControlValue(Control parContainer)
    {
        for (int index = 0; index < parContainer.Controls.Count; index++)
        {
            //假设是容器类控件,递归调用自己
            if (parContainer.Controls[index].HasChildren && !parContainer.Controls[index].GetType().Name.ToLower().StartsWith("uc"))
            {
                EmptyControlValue(parContainer.Controls[index]);
            }
            else
            {
                if (parContainer.Controls[index].AccessibleName == null ||
                    !parContainer.Controls[index].AccessibleName.ToLower().Contains("emptyvalue"))
                {
                    continue;
                }
     
                switch (parContainer.Controls[index].GetType().Name)
                {
                    case "Label":
                        break;
                    //case "ComboBox":
                    //    ((ComboBox)(parContainer.Controls[index])).Text = "";                          
                    //    break;
                    case "TextBox":
                        ((TextBox)(parContainer.Controls[index])).Text = "";
                        break;
                    case "UcTextBox":
                        ((UcTextBox)(parContainer.Controls[index])).Text = "";
                        break;
                    case "RichTextBox":
                        ((RichTextBox)(parContainer.Controls[index])).Text = "";
                        break;
                    case "MaskedTextBox":
                        ((MaskedTextBox)(parContainer.Controls[index])).Text = "";
                        break;
                    case "UcMaskTextBox":
                        ((UcMaskTextBox)(parContainer.Controls[index])).Text = "";
                        break;
                    case "RadioButton":
                        ((RadioButton)(parContainer.Controls[index])).Checked = false;
                        break;
                    case "CheckBox":
                        ((CheckBox)(parContainer.Controls[index])).Checked = false;
                        break;
                }
            }
        }
    }

      

      要清空控件的值、仅仅需调用:  

    EmptyControlValue(容器控件名称);

     2、断一容器控件内某控件的值能否够为空?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    /// <summary>
    /// 推断一容器控件内某控件的值能否够为空(通过控件的AccessibleName属性设置为"NotNull")
    /// <remarks>
    ///     说明:
    ///         此方法显示提示信息,对于对应取值不能为空的控件。应设置其“Tag”属性。以友好提示信息。
    /// </remarks>
    /// </summary>
    /// <param name="parContainer">容器控件</param>
    public static bool ControlValueIsEmpty(Control parContainer)
    {
        bool returnValue = true;
        string hintInfo = string.Empty;
        for (int index = 0; index < parContainer.Controls.Count; index++)
        {
            //假设是容器类控件。递归调用自己
     
            if (parContainer.Controls[index].HasChildren && !parContainer.Controls[index].GetType().Name.ToLower().StartsWith("uc"))
            {
                ControlValueIsEmpty(parContainer.Controls[index]);
            }
            else
            {
                if (string.IsNullOrEmpty(parContainer.Controls[index].AccessibleName))
                {
                    continue;
                }
     
                if (!parContainer.Controls[index].AccessibleName.ToLower().Contains("notnull")
                    && !parContainer.Controls[index].GetType().Name.ToLower().Contains("mask"))
                {
                    continue;
                }
     
                switch (parContainer.Controls[index].GetType().Name)
                {
                    case "Label"://排除Label
                        break;
                    case "ComboBox":
                    case "ComboBoxEx":
                    case "UcComboBoxEx":
                        if (parContainer.Controls[index] is ComboBox)
                        {
                            if (((ComboBox)(parContainer.Controls[index])).Text.Trim() == string.Empty)
                            {
                                hintInfo += GetControlName((ComboBox)parContainer.Controls[index]) + " ";
                                //ShowInfo((ComboBox)parContainer.Controls[index], " 不能为空!");
                                //((ComboBox)(parContainer.Controls[index])).Focus();
                                returnValue = false;
                            }
                        }
                        else
                        {
                            if (((UcComboBoxEx)(parContainer.Controls[index])).Text.Trim() == string.Empty)
                            {
                                hintInfo += GetControlName((UcComboBoxEx)parContainer.Controls[index]) + " ";
                                //ShowInfo((UcComboBoxEx)parContainer.Controls[index], " 不能为空!");
                                //((UcComboBoxEx)(parContainer.Controls[index])).Focus();
                                returnValue = false;
                            }
                        }
                        break;
                    case "TextBox":
                    case "UcTextBox":
                        if (parContainer.Controls[index] is TextBox)
                        {
                            if (((TextBox)(parContainer.Controls[index])).Text.Trim() == string.Empty)
                            {
                                hintInfo += GetControlName((TextBox)parContainer.Controls[index]) + " ";
                                //ShowInfo((TextBox)parContainer.Controls[index], " 不能为空!");
                                //((TextBox)(parContainer.Controls[index])).Focus();
                                returnValue = false;
                            }
                        }
                        else
                        {
                            if (((UcTextBox)(parContainer.Controls[index])).Text.Trim() == string.Empty)
                            {
                                hintInfo += GetControlName((UcTextBox)parContainer.Controls[index]) + " ";
                                //ShowInfo((UcTextBox)parContainer.Controls[index], " 不能为空!");
                                //((UcTextBox)(parContainer.Controls[index])).Focus();
                                returnValue = false;
                            }
                        }
                        break;
                    case "RichTextBox":
                        if (((RichTextBox)(parContainer.Controls[index])).Text.Trim() == string.Empty)
                        {
                            hintInfo += GetControlName((RichTextBox)parContainer.Controls[index]) + " ";
                            //ShowInfo((RichTextBox)parContainer.Controls[index], " 不能为空!");
                            //((RichTextBox)(parContainer.Controls[index])).Focus();
                            returnValue = false;
                        }
                        break;
                    case "MaskedTextBox":
                    case "UcMaskTextBox":
                        string mskTxtValue = string.Empty;
                        object controlChinaeseName = null;
                        if (parContainer.Controls[index] is MaskedTextBox)
                        {
                            mskTxtValue = ((MaskedTextBox)(parContainer.Controls[index])).Text;
                            controlChinaeseName = ((MaskedTextBox)(parContainer.Controls[index])).Tag ?

    ? ((MaskedTextBox)(parContainer.Controls[index])).Name;

                        }
                        else
                        {
                            mskTxtValue = ((UcMaskTextBox)(parContainer.Controls[index])).Text;
                            controlChinaeseName = ((UcMaskTextBox)(parContainer.Controls[index])).Tag ?

    ? ((UcMaskTextBox)(parContainer.Controls[index])).Name;

                        }
     
                        if (mskTxtValue.Substring(0, 4).Trim().Length > 0) //假设有有值。则要对输入的日期进行格式推断
                        {
                            if (DateTimeHelper.IsDate(mskTxtValue))
                            {
                                //把用户输入的日期数据控制在(1754-01-01 至 9999-12-31这间),这主要解决SqlServer与C#日期范围的冲突
                                if (DateTimeHelper.ToDate(mskTxtValue) < DateTimeHelper.ToDate("1754-01-01") ||
                                    DateTimeHelper.ToDate(mskTxtValue) >= DateTimeHelper.ToDate("9999-12-31"))
                                {
                                    MessageBoxHelper.ShowErrorMsg("[" + controlChinaeseName + "] 日期范围不对! /n正确日期范围为:1754-01-01 至 9999-12-31");
                                    returnValue = false;
                                }
                            }
                            else
                            {
                                MessageBoxHelper.ShowErrorMsg("[" + controlChinaeseName + "] 日期格式不对! 正确格式如:2012-01-01");
                                returnValue = false;
                            }
                        }
                        else
                        {
                            if (mskTxtValue.Substring(0, 5).Equals("    -") && parContainer.Controls[index].AccessibleName.ToLower() == "notnull")
                            {
                                MessageBoxHelper.ShowErrorMsg("[" + controlChinaeseName + "]不能为空!");
                                returnValue = false;
                            }
                        }
                        break;
                    default:
                        break;
                }
            }
        }
        if (!string.IsNullOrEmpty(hintInfo.Trim()))
        {
            MessageBoxHelper.ShowWarningMsg(hintInfo + "不能为空!

    ");

        }
        return returnValue;
    }
     
    private static string GetControlName(Control ctr)
    {
        if (ctr.Tag == null)
        {
            return ctr.Name;
        }
        else
        {
            return ctr.Tag.ToString();
        }
    }
     
    private static void ShowInfo(Control ctr, string info)
    {
        if (ctr.Tag == null)
        {
            MessageBoxHelper.ShowWarningMsg(ctr.Name + info);
        }
        else
        {
            MessageBoxHelper.ShowWarningMsg(ctr.Tag + info);
        }
    }

      方法“ControlValueIsEmpty”能够用于批量推断指定容器内的全部控件能否够为空,对于不为空的能够做批量提示显示,设置例如以下图所看到的:

     3、设置容器控件中包括的控件为仅仅读?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    /// <summary>
    /// 设置容器控件中包括的控件为仅仅读(通过控件的AccessibleName属性设置为"CanReadOnly")
    /// </summary>
    /// <param name="parContainer">容器控件</param>
    /// <param name="isReadOnly">是否为仅仅读,true是仅仅读,false则相反</param>>
    public static void SetControlReadOnly(Control parContainer, bool isReadOnly)
    {
        for (int index = 0; index < parContainer.Controls.Count; index++)
        {
            //假设是容器类控件,递归调用自己
            if (parContainer.Controls[index].HasChildren)
            {
                SetControlReadOnly(parContainer.Controls[index], isReadOnly);
            }
            else
            {
                if (parContainer.Controls[index].AccessibleName == null &&
                  !parContainer.Controls[index].AccessibleName.ToLower().Contains("canreadonly"))
                {
                    continue;
                }
     
                switch (parContainer.Controls[index].GetType().Name)
                {
                    case "TextBox":
                    case "UcTextBox":
                        if (parContainer.Controls[index] is TextBox)
                        {
                            ((TextBox)(parContainer.Controls[index])).ReadOnly = isReadOnly;
                        }
                        else
                        {
                            ((UcTextBox)(parContainer.Controls[index])).ReadOnly = isReadOnly;
                        }
     
                        break;
                    case "RichTextBox":
                        ((RichTextBox)(parContainer.Controls[index])).ReadOnly = isReadOnly;
                        break;
                    case "MaskedTextBox":
                    case "UcMaskTextBox":
                        if (parContainer.Controls[index] is MaskedTextBox)
                        {
                            ((MaskedTextBox)(parContainer.Controls[index])).ReadOnly = isReadOnly;
                        }
                        else
                        {
                            ((UcMaskTextBox)(parContainer.Controls[index])).ReadOnly = isReadOnly;
                        }
                        break;
                    case "ComboBox":
                        ((ComboBox)(parContainer.Controls[index])).Enabled = !isReadOnly;
                        break;
                    case "Button":
                    case "UcButton":
                        if (parContainer.Controls[index] is Button)
                        {
                            ((Button)(parContainer.Controls[index])).Enabled = !isReadOnly;
                        }
                        else
                        {
                            ((UcButton)(parContainer.Controls[index])).Enabled = !isReadOnly;
                        }
                        break;
                    default:
                        break;
                }
            }
        }
    }

      方法“SetControlReadOnly”的使用方式与上面的方法同样,仅仅要设置控件的“AccessibleName”属性为“CanReadOnly”就可以。

     4、设置容器控件中包括的控件是否可用?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    /// <summary>
    /// 设置容器控件中包括的控件是否可用(通过控件的AccessibleName属性设置为"Enabled")
    /// </summary>
    /// <param name="parContainer">容器控件</param>
    /// <param name="isEnabled">是否为用可。true:可用,false:不可用</param>>
    public static void SetControlEnabled(Control parContainer, bool isEnabled)
    {
        for (int index = 0; index < parContainer.Controls.Count; index++)
        {
            //假设是容器类控件。递归调用自己
            if (parContainer.Controls[index].HasChildren)
    Copyright © 2020-2023  润新知