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、斷一容器控件內某控件的值是否可以爲空?

    /// <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]) + "\n";
                                //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]) + "\n";
                                //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]) + "\n";
                                //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]) + "\n";
                                //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]) + "\n";
                            //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、設置容器控件中包含的控件爲只讀?

    /// <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、設置容器控件中包含的控件是否可用?

    /// <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)
            {
                SetControlEnabled(parContainer.Controls[index], isEnabled);
            }
            else
            {
                if (parContainer.Controls[index].AccessibleName == null &&
                   !parContainer.Controls[index].AccessibleName.ToLower().Contains("Enabled"))
                {
                    continue;
                }

                //(parContainer.Controls[index]).BackColor = System.Drawing.Color.White;//設置當前控件的背景色爲白色

                switch (parContainer.Controls[index].GetType().Name)
                {
                    case "Label":
                        break;
                    default:
                        parContainer.Controls[index].Enabled = isEnabled;
                        break;
                }
            }
        }
    }

方法“SetControlEnabled”用於設置容器控件內的指定控件的Enabled屬性。

同時需要說明的時,這些方法可以同時設置,只需要設置控件的“AccessibleName”爲這種類型即可:EmptyValue| NotNull |Enabled|CanReadOnly,這樣設置即可,對於提示信息的顯示,我們可以設置控件的Tag屬性。

發佈了24 篇原創文章 · 獲贊 9 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章