WinForm容器内控件批量效驗是否允許為空?設定是否隻讀?設定是否可用等方法分享
在WinForm程式中,我們有時需要對某容器内的所有控件做批量操作、如批量判斷是否允許為空?批量設定為隻讀、批量設定為可用或不可用等常用操作,本文分享這幾種方法,起抛磚引玉的作用,歡迎讨論!
<a href="http://blog.51cto.com/yonghu/1683244#">?</a>
<code> </code><code>/// <summary></code>
<code> </code><code>/// 清除容器裡面指定控件的值(通過控件的AccessibleName屬性設定為"EmptyValue")</code>
<code> </code><code>/// </summary></code>
<code> </code><code>/// <param name="parContainer">容器控件</param></code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>EmptyControlValue(Control parContainer)</code>
<code> </code><code>{</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>index = 0; index < parContainer.Controls.Count; index++)</code>
<code> </code><code>{</code>
<code> </code><code>//如果是容器類控件,遞歸調用自己</code>
<code> </code><code>if</code> <code>(parContainer.Controls[index].HasChildren && !parContainer.Controls[index].GetType().Name.ToLower().StartsWith(</code><code>"uc"</code><code>))</code>
<code> </code><code>{</code>
<code> </code><code>EmptyControlValue(parContainer.Controls[index]);</code>
<code> </code><code>}</code>
<code> </code><code>else</code>
<code> </code><code>if</code> <code>(parContainer.Controls[index].AccessibleName == </code><code>null</code> <code>||</code>
<code> </code><code>!parContainer.Controls[index].AccessibleName.ToLower().Contains(</code><code>"emptyvalue"</code><code>))</code>
<code> </code><code>{</code>
<code> </code><code>continue</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>switch</code> <code>(parContainer.Controls[index].GetType().Name)</code>
<code> </code><code>case</code> <code>"Label"</code><code>:</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>//case "ComboBox":</code>
<code> </code><code>// ((ComboBox)(parContainer.Controls[index])).Text = ""; </code>
<code> </code><code>// break;</code>
<code> </code><code>case</code> <code>"TextBox"</code><code>:</code>
<code> </code><code>((TextBox)(parContainer.Controls[index])).Text = </code><code>""</code><code>;</code>
<code> </code><code>case</code> <code>"UcTextBox"</code><code>:</code>
<code> </code><code>((UcTextBox)(parContainer.Controls[index])).Text = </code><code>""</code><code>;</code>
<code> </code><code>case</code> <code>"RichTextBox"</code><code>:</code>
<code> </code><code>((RichTextBox)(parContainer.Controls[index])).Text = </code><code>""</code><code>;</code>
<code> </code><code>case</code> <code>"MaskedTextBox"</code><code>:</code>
<code> </code><code>((MaskedTextBox)(parContainer.Controls[index])).Text = </code><code>""</code><code>;</code>
<code> </code><code>case</code> <code>"UcMaskTextBox"</code><code>:</code>
<code> </code><code>((UcMaskTextBox)(parContainer.Controls[index])).Text = </code><code>""</code><code>;</code>
<code> </code><code>case</code> <code>"RadioButton"</code><code>:</code>
<code> </code><code>((RadioButton)(parContainer.Controls[index])).Checked = </code><code>false</code><code>;</code>
<code> </code><code>case</code> <code>"CheckBox"</code><code>:</code>
<code> </code><code>((CheckBox)(parContainer.Controls[index])).Checked = </code><code>false</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>}</code>

要清空控件的值、隻需調用:
<code>EmptyControlValue(容器控件名稱);</code>
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
<code> </code><code>/// 判斷一容器控件内某控件的值是否可以為空(通過控件的AccessibleName屬性設定為"NotNull")</code>
<code> </code><code>/// <remarks></code>
<code> </code><code>/// 說明:</code>
<code> </code><code>/// 此方法顯示提示資訊,對于相應取值不能為空的控件,應設定其“Tag”屬性,以友好提示資訊。</code>
<code> </code><code>/// </remarks></code>
<code> </code><code>public</code> <code>static</code> <code>bool</code> <code>ControlValueIsEmpty(Control parContainer)</code>
<code> </code><code>bool</code> <code>returnValue = </code><code>true</code><code>;</code>
<code> </code><code>string</code> <code>hintInfo = </code><code>string</code><code>.Empty;</code>
<code> </code><code>ControlValueIsEmpty(parContainer.Controls[index]);</code>
<code> </code><code>if</code> <code>(</code><code>string</code><code>.IsNullOrEmpty(parContainer.Controls[index].AccessibleName))</code>
<code> </code><code>if</code> <code>(!parContainer.Controls[index].AccessibleName.ToLower().Contains(</code><code>"notnull"</code><code>)</code>
<code> </code><code>&& !parContainer.Controls[index].GetType().Name.ToLower().Contains(</code><code>"mask"</code><code>))</code>
<code> </code><code>case</code> <code>"Label"</code><code>:</code><code>//排除Label</code>
<code> </code><code>case</code> <code>"ComboBox"</code><code>:</code>
<code> </code><code>case</code> <code>"ComboBoxEx"</code><code>:</code>
<code> </code><code>case</code> <code>"UcComboBoxEx"</code><code>:</code>
<code> </code><code>if</code> <code>(parContainer.Controls[index] </code><code>is</code> <code>ComboBox)</code>
<code> </code><code>{</code>
<code> </code><code>if</code> <code>(((ComboBox)(parContainer.Controls[index])).Text.Trim() == </code><code>string</code><code>.Empty)</code>
<code> </code><code>{</code>
<code> </code><code>hintInfo += GetControlName((ComboBox)parContainer.Controls[index]) + </code><code>"\n"</code><code>;</code>
<code> </code><code>//ShowInfo((ComboBox)parContainer.Controls[index], " 不能為空!");</code>
<code> </code><code>//((ComboBox)(parContainer.Controls[index])).Focus();</code>
<code> </code><code>returnValue = </code><code>false</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>else</code>
<code> </code><code>if</code> <code>(((UcComboBoxEx)(parContainer.Controls[index])).Text.Trim() == </code><code>string</code><code>.Empty)</code>
<code> </code><code>hintInfo += GetControlName((UcComboBoxEx)parContainer.Controls[index]) + </code><code>"\n"</code><code>;</code>
<code> </code><code>//ShowInfo((UcComboBoxEx)parContainer.Controls[index], " 不能為空!");</code>
<code> </code><code>//((UcComboBoxEx)(parContainer.Controls[index])).Focus();</code>
<code> </code><code>if</code> <code>(parContainer.Controls[index] </code><code>is</code> <code>TextBox)</code>
<code> </code><code>if</code> <code>(((TextBox)(parContainer.Controls[index])).Text.Trim() == </code><code>string</code><code>.Empty)</code>
<code> </code><code>hintInfo += GetControlName((TextBox)parContainer.Controls[index]) + </code><code>"\n"</code><code>;</code>
<code> </code><code>//ShowInfo((TextBox)parContainer.Controls[index], " 不能為空!");</code>
<code> </code><code>//((TextBox)(parContainer.Controls[index])).Focus();</code>
<code> </code><code>if</code> <code>(((UcTextBox)(parContainer.Controls[index])).Text.Trim() == </code><code>string</code><code>.Empty)</code>
<code> </code><code>hintInfo += GetControlName((UcTextBox)parContainer.Controls[index]) + </code><code>"\n"</code><code>;</code>
<code> </code><code>//ShowInfo((UcTextBox)parContainer.Controls[index], " 不能為空!");</code>
<code> </code><code>//((UcTextBox)(parContainer.Controls[index])).Focus();</code>
<code> </code><code>if</code> <code>(((RichTextBox)(parContainer.Controls[index])).Text.Trim() == </code><code>string</code><code>.Empty)</code>
<code> </code><code>hintInfo += GetControlName((RichTextBox)parContainer.Controls[index]) + </code><code>"\n"</code><code>;</code>
<code> </code><code>//ShowInfo((RichTextBox)parContainer.Controls[index], " 不能為空!");</code>
<code> </code><code>//((RichTextBox)(parContainer.Controls[index])).Focus();</code>
<code> </code><code>returnValue = </code><code>false</code><code>;</code>
<code> </code><code>string</code> <code>mskTxtValue = </code><code>string</code><code>.Empty;</code>
<code> </code><code>object</code> <code>controlChinaeseName = </code><code>null</code><code>;</code>
<code> </code><code>if</code> <code>(parContainer.Controls[index] </code><code>is</code> <code>MaskedTextBox)</code>
<code> </code><code>mskTxtValue = ((MaskedTextBox)(parContainer.Controls[index])).Text;</code>
<code> </code><code>controlChinaeseName = ((MaskedTextBox)(parContainer.Controls[index])).Tag ?? ((MaskedTextBox)(parContainer.Controls[index])).Name;</code>
<code> </code><code>mskTxtValue = ((UcMaskTextBox)(parContainer.Controls[index])).Text;</code>
<code> </code><code>controlChinaeseName = ((UcMaskTextBox)(parContainer.Controls[index])).Tag ?? ((UcMaskTextBox)(parContainer.Controls[index])).Name;</code>
<code> </code><code>if</code> <code>(mskTxtValue.Substring(0, 4).Trim().Length > 0) </code><code>//如果有有值,則要對輸入的日期進行格式判斷</code>
<code> </code><code>if</code> <code>(DateTimeHelper.IsDate(mskTxtValue))</code>
<code> </code><code>//把使用者輸入的日期資料控制在(1754-01-01 至 9999-12-31這間),這主要解決SqlServer與C#日期範圍的沖突</code>
<code> </code><code>if</code> <code>(DateTimeHelper.ToDate(mskTxtValue) < DateTimeHelper.ToDate(</code><code>"1754-01-01"</code><code>) ||</code>
<code> </code><code>DateTimeHelper.ToDate(mskTxtValue) >= DateTimeHelper.ToDate(</code><code>"9999-12-31"</code><code>))</code>
<code> </code><code>{</code>
<code> </code><code>MessageBoxHelper.ShowErrorMsg(</code><code>"["</code> <code>+ controlChinaeseName + </code><code>"] 日期範圍不正确! /n正确日期範圍為:1754-01-01 至 9999-12-31"</code><code>);</code>
<code> </code><code>returnValue = </code><code>false</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>else</code>
<code> </code><code>MessageBoxHelper.ShowErrorMsg(</code><code>"["</code> <code>+ controlChinaeseName + </code><code>"] 日期格式不正确! 正确格式如:2012-01-01"</code><code>);</code>
<code> </code><code>if</code> <code>(mskTxtValue.Substring(0, 5).Equals(</code><code>" -"</code><code>) && parContainer.Controls[index].AccessibleName.ToLower() == </code><code>"notnull"</code><code>)</code>
<code> </code><code>MessageBoxHelper.ShowErrorMsg(</code><code>"["</code> <code>+ controlChinaeseName + </code><code>"]不能為空!"</code><code>);</code>
<code> </code><code>default</code><code>:</code>
<code> </code><code>if</code> <code>(!</code><code>string</code><code>.IsNullOrEmpty(hintInfo.Trim()))</code>
<code> </code><code>MessageBoxHelper.ShowWarningMsg(hintInfo + </code><code>"不能為空!"</code><code>);</code>
<code> </code><code>return</code> <code>returnValue;</code>
<code> </code><code>private</code> <code>static</code> <code>string</code> <code>GetControlName(Control ctr)</code>
<code> </code><code>if</code> <code>(ctr.Tag == </code><code>null</code><code>)</code>
<code> </code><code>return</code> <code>ctr.Name;</code>
<code> </code><code>else</code>
<code> </code><code>return</code> <code>ctr.Tag.ToString();</code>
<code> </code><code>private</code> <code>static</code> <code>void</code> <code>ShowInfo(Control ctr, </code><code>string</code> <code>info)</code>
<code> </code><code>MessageBoxHelper.ShowWarningMsg(ctr.Name + info);</code>
<code> </code><code>MessageBoxHelper.ShowWarningMsg(ctr.Tag + info);</code>
方法“ControlValueIsEmpty”可以用于批量判斷指定容器内的所有控件是否可以為空,對于不為空的可以做批量提示顯示,設定如下圖所示:
<code> </code><code>/// 設定容器控件中包含的控件為隻讀(通過控件的AccessibleName屬性設定為"CanReadOnly")</code>
<code> </code><code>/// <param name="isReadOnly">是否為隻讀,true是隻讀,false則相反</param>></code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>SetControlReadOnly(Control parContainer, </code><code>bool</code> <code>isReadOnly)</code>
<code> </code><code>if</code> <code>(parContainer.Controls[index].HasChildren)</code>
<code> </code><code>SetControlReadOnly(parContainer.Controls[index], isReadOnly);</code>
<code> </code><code>if</code> <code>(parContainer.Controls[index].AccessibleName == </code><code>null</code> <code>&&</code>
<code> </code><code>!parContainer.Controls[index].AccessibleName.ToLower().Contains(</code><code>"canreadonly"</code><code>))</code>
<code> </code><code>((TextBox)(parContainer.Controls[index])).ReadOnly = isReadOnly;</code>
<code> </code><code>((UcTextBox)(parContainer.Controls[index])).ReadOnly = isReadOnly;</code>
<code> </code><code>((RichTextBox)(parContainer.Controls[index])).ReadOnly = isReadOnly;</code>
<code> </code><code>((MaskedTextBox)(parContainer.Controls[index])).ReadOnly = isReadOnly;</code>
<code> </code><code>((UcMaskTextBox)(parContainer.Controls[index])).ReadOnly = isReadOnly;</code>
<code> </code><code>((ComboBox)(parContainer.Controls[index])).Enabled = !isReadOnly;</code>
<code> </code><code>case</code> <code>"Button"</code><code>:</code>
<code> </code><code>case</code> <code>"UcButton"</code><code>:</code>
<code> </code><code>if</code> <code>(parContainer.Controls[index] </code><code>is</code> <code>Button)</code>
<code> </code><code>((Button)(parContainer.Controls[index])).Enabled = !isReadOnly;</code>
<code> </code><code>((UcButton)(parContainer.Controls[index])).Enabled = !isReadOnly;</code>
方法“SetControlReadOnly”的使用方式與上面的方法相同,隻要設定控件的“AccessibleName”屬性為“CanReadOnly”即可。
<code> </code><code>/// 設定容器控件中包含的控件是否可用(通過控件的AccessibleName屬性設定為"Enabled")</code>
<code> </code><code>/// <param name="isEnabled">是否為用可,true:可用,false:不可用</param>></code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>SetControlEnabled(Control parContainer, </code><code>bool</code> <code>isEnabled)</code>
<code> </code><code>SetControlEnabled(parContainer.Controls[index], isEnabled);</code>
<code> </code><code>!parContainer.Controls[index].AccessibleName.ToLower().Contains(</code><code>"Enabled"</code><code>))</code>
<code> </code><code>//(parContainer.Controls[index]).BackColor = System.Drawing.Color.White;//設定目前控件的背景色為白色</code>
<code> </code><code>parContainer.Controls[index].Enabled = isEnabled;</code>
方法“SetControlEnabled”用于設定容器控件内的指定控件的Enabled屬性。
本文轉自yonghu86 51CTO部落格,原文連結:http://blog.51cto.com/yonghu/1683244,如需轉載請自行聯系原作者