`

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、断一容器控件内某控件的值是否可以为空?

        /// <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属性。

 

 

文章之外请关注

RDIFramework.NET官方网站:http://www.rdiframework.net/

RDIFramework.NET官方博客:http://blog.rdiframework.net/

      同时需要说明的,以后的所有技术文章以官方网站为准,欢迎大家收藏!

RDIFramework.NET框架由专业团队长期打造、一直在更新、一直在升级,请放心使用!

欢迎关注RDIFramework.NET框架官方公众微信(微信号:rdiframework-net),及时了解最新动态。

扫描二维码立即关注

RDIFramework.NET 官方微信

0
1
分享到:
评论

相关推荐

    C# 批量设置WinForm界面上的所有控件不可编辑

    本例中,为WinForm提供方法,批量设置其界面上所有的控件为不可编辑状态 方法: SetReadOnly( Control.ControlCollection , List, Boolean&gt;&gt; , List) 说明: 当窗体内的控件存在[ReadOnly]属性时,只设置...

    winform 自定义image控件

    在Winform中,自定义控件通常是从System.Windows.Forms.Control类派生的,或者从已有的控件如Button、Label等派生。这样可以继承已有控件的功能,并根据需求添加新的属性、方法和事件。在这个案例中,"bigbtn"可能是...

    WinForm可空日期控件

    在C#的Windows Forms(WinForm)开发中,经常需要使用日期选择控件(DateTimePicker)来让用户输入或选择日期。然而,在实际应用中,有时我们希望用户必须选择一个日期,不能留空。标题提到的"WinForm可空日期控件...

    winform图片轮播控件.zip

    在Windows Forms(Winform)应用开发中,图片轮播控件是一种常见的功能,它能够以动画效果展示一系列图片,常用于展示产品、演示或者作为背景显示。本项目提供的"winform图片轮播控件.zip"文件包含了一个用C#语言...

    C# WinForm实现窗体上控件自由拖动功能示例

    在Form1_Paint事件中,我们判断了rect变量是否为空,如果不为空,则绘制一个矩形,用于显示控件的拖动效果。 四、示例代码分析 在示例代码中,我们使用了多种技术来实现控件的自由拖动功能,包括: 1. 使用...

    C#Winform温度计控件

    总之,创建一个C# Winform温度计控件涉及到自定义控件的设计、属性定义、绘图逻辑、实时更新机制等多方面的知识。通过理解并实践这一过程,开发者可以更好地掌握Windows Forms的高级特性,并为自己的应用提供更丰富...

    winform自定义日历控件

    另外,我们可以为控件添加公共方法和属性,比如设置默认颜色、字体、大小等,使得在其他WinForm应用中可以灵活配置。例如,设置`SelectedDate`属性可以改变控件上显示的高亮日期,而`Events`属性则可以用来存储和...

    WinForm自定义分页控件

    你可以使用WinForm的控件如Button、Label、ComboBox等来构建这个界面。 2. **事件处理**:为控件添加事件处理器,例如“上一页”和“下一页”按钮的Click事件,当用户点击时,会触发数据源的翻页。同时,每页条数...

    C#WinForm开发:将控件背景色设置为透明

    在C# WinForm开发中,将控件的背景色设置为透明是一项常见的需求,这可以使界面设计更加灵活,用户界面也更加美观。本教程将详细讲解如何实现这一功能,以一个具体的例子——在pictureBox控件上设置label控件的背景...

    C# Winform清空界面控件值小技巧

    如果窗体里面控件,尤其是TextBox控件比较多的时候,代码里面是不是要设置每个控件的Text属性值为空呢?下面我用这个例子,来探讨下清空界面控件值的小技巧。而且还能复用。不必每个窗体都做这些枯燥、无聊的工作。 ...

    Winform自定义日历控件

    4. **可配置性**:为了让控件适应不同的需求,可以提供设置选项,如是否显示星期、是否启用特定日期等。 5. **数据绑定**:为了实现考勤、日程等功能,控件应支持与数据源的绑定,可以是数据库、XML文件或其他数据...

    Winform调用WPF控件

    ElementHost是Winform用来承载WPF控件的容器,它允许WPF元素在Winform窗口中运行。以下步骤展示了如何在Winform中使用WPF的DataGrid控件: 1. 引入必要的库:确保项目引用了`System.Windows.Forms`和`...

    winform 分页控件 DevExpress版

    总之,DevExpress的Winform分页控件为.NET开发人员提供了强大的数据展示和管理工具,通过丰富的功能和优秀的性能,简化了数据分页的实现过程。利用提供的源码实例,开发者可以快速上手并根据需求进行个性化定制。

    Winform 自定义颜色控件

    在Windows Forms(Winform)开发中...总之,创建一个Winform自定义颜色控件涉及到了控件设计、颜色管理、用户交互等多个方面。通过以上步骤,我们可以实现一个功能完备、易用的颜色选择工具,提升应用程序的用户体验。

    基于C#的WinForm中DataGridView控件操作汇总

    "基于C#的WinForm中...DataGridView控件提供了多种操作方法,包括获取当前单元格的内容、设置当前单元格、遍历单元格、设置控件的只读性等。通过正确地使用这些方法,可以提高DataGridView控件的使用效率和灵活性。

    非常好看的winform 自定义日期控件

    例如,设置日期显示格式的属性,获取或设置当前选中日期的方法。 在创建自定义日期控件的过程中,你可能会用到以下技术: - **Windows窗体控件基础知识**:理解控件的生命周期、事件模型、布局和绘制机制。 - **...

    Winform仪表盘控件_C#_仪表盘_winform_

    "Winform仪表盘控件"就是一种专门用于此类目的的组件,它允许开发者在C#应用程序中构建动态、交互式的仪表盘界面。这个标题暗示了我们讨论的是一个用于Winform应用的特定类型控件,该控件设计用于显示数据指标,如...

    c# winform 自定义折叠容器

    在C# WinForm开发中,有时我们希望创建一个可以折叠展开的容器控件,以便更好地组织和管理界面元素。本文将深入探讨如何实现一个自定义的折叠容器,重点关注其动画效果。 首先,折叠容器通常由两个主要部分组成:...

    WinForm窗体及其控件的自适应,winform控件随窗口自适应,C#

    这里可以使用递归方法遍历窗体的所有子控件,包括嵌套的容器控件,如Panel或GroupBox。以下是一个简单的例子: ```csharp private void Form1_Resize(object sender, EventArgs e) { float scaleWidth = (float)...

    WinForm页面布局 控件

    WinForm窗体本身就是一个布局容器,可以通过调整窗体属性(如AutoSizeMode、AutoScaleMode等)来控制窗体及其中控件的大小和位置。窗体还可以包含多个容器控件,实现更复杂的布局组合。 4. **面板布局(Panel)** ...

Global site tag (gtag.js) - Google Analytics