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

WinForm容器内控件批量效验是否允许为空?设置是否只读?设置是否可用等方法分享的更多相关文章

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

    WinForm容器内控件批量效验是否同意为空?设置是否仅仅读?设置是否可用等方法分享 在WinForm程序中,我们有时须要对某容器内的全部控件做批量操作.如批量推断是否同意为空?批量设置为仅仅读.批量 ...

  2. Winform禁止容器内控件获得焦点时改变容器显示范围坐标

    在Winform中当容器的可视高度无法显示所有控件并且容器的AutoScroll属性设置为True的情况下,但点击容器内某个未显示完整的控件时,会出现容器的滚动条自动下滚的情况. 这是由于控件获得焦点 ...

  3. WinForm窗体及其控件的自适应

    3步骤: 1.在需要自适应的Form中实例化全局变量   AutoSizeFormClass.cs源码在下方 AutoSizeFormClass asc = new AutoSizeFormClass ...

  4. 转:C# WinForm窗体及其控件的自适应

    一.说明 2012-11-30 曾经写过 <C# WinForm窗体及其控件自适应各种屏幕分辨率>  ,其中也讲解了控件自适应的原理.近期有网友说,装在panel里面的控件,没有效果? 这 ...

  5. C# LIstbox 解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题

    解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题 分类: winform2008-05-24 02:33 2592人阅读 评论(11) 收藏 举报 winf ...

  6. DevExpress winform XtraEditor常用控件

    最近在公司里面开始使用DevExpress winform的第三方控件进行开发和维护,这里整理一些常用控件的资料以便于后续查看 ComboBoxEdit 这个控件和winform自带的控件差不多,使用 ...

  7. Winform中checklistbox控件的常用方法

    Winform中checklistbox控件的常用方法最近用到checklistbox控件,在使用其过程中,收集了其相关的代码段1.添加项checkedListBox1.Items.Add(" ...

  8. {VS2010C#}{WinForm}{ActiveX}VS2010C#开发基于WinForm的ActiveX控件

    在VS2010中使用C#开发基于WinForm的ActiveX控件 常见的一些ActiveX大部分是使用VB.Delphi.C++开发,使用C#开发ActiveX要解决下面三个问题: 使.NET组件可 ...

  9. Atitit. .net c# web 跟客户端winform 的ui控件结构比较

    Atitit. .net c# web 跟客户端winform 的ui控件结构比较 .net   4.5 webform Winform 命名空间 System.Web.UI.WebControls ...

随机推荐

  1. Android 摇一摇 之 震动片

    声明:import android.os.Vibrator; Vibrator mVibrator; 取得震动服务的句柄: mVibrator = (Vibrator)getApplication() ...

  2. BZOJ4184: shallot

    Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱 ...

  3. MySQL 服务无法启动。服务没有报告任何错误。

    MySQL数据库在升级到5.7版本后,和之前的版本有些不一样,没有data文件夹,我们都知道MySQL数据库文件是保存在data文件夹中的,网上有人说把5.6版本的data文件夹拷贝一个,这种说法听听 ...

  4. 接口测试之soupui&groovy

    原著地址:http://www.cnblogs.com/wade-xu/p/4236295.html#3334654 需注意下方code的设置

  5. Jenkins 2.7.3 LTS 发布

    更新如下: Stop A/B testing of the remoting JNLP3 protocol due to the known issues. The protocol can be e ...

  6. python生成器

    eg1: >>> (i*i for i in range(5))<generator object <genexpr> at 0x16b8fa0>>&g ...

  7. AspCms标签手册

    网站通用标签 基本标签 {aspcms:sitepath} 网站终极目录(可放在二级目录,其它语言则在三级目录) {aspcms:languagepath} 语言目录 {aspcms:siteurl} ...

  8. json转换数据后面参数要带ture,代码

    强大的PHP已经提供了内置函数:json_encode() 和 json_decode().很容易理解,json_encode()就是将PHP数组转换成Json.相反,json_decode()就是将 ...

  9. Struts2的Action(二)

    Struts2的Action可以是一个POJO(即简单的javaBean),也实现Action接口,或者继承ActionSupport类. 1.Action接口: public interface A ...

  10. requirejs解决异步模块加载方案

    他首先会遍历enableRegistry取出其中定义的模块,并且将没有加载成功的模块标识注入noLoads数组,如果过期了这里就会报错 如果上述没问题还会做循环依赖的判断,主要逻辑在breakCycl ...