[英]Clear all TextBoxes but ignore DomainUpDown
我正在使用以下代碼清除表單上的所有文本框
private void ClearTextBoxes()
{
Action<Control.ControlCollection> func = null;
func = (controls) =>
{
foreach (Control control in controls)
if (control is TextBox)
(control as TextBox).Clear();
else
func(control.Controls);
};
func(Controls);
}
但是,它還會清除DomainUpDown
,而DomainUpDown
又會發出警告,因為它的文本字段為空,我該如何防止這種情況發生?
小心, DomainUpDown
是一個容器!
如果您想堅持使用大部分代碼,請進行更改
else
func(control.Controls);
至
else if (!(control is DomainUpDown))
func(control.Controls);
您描述的行為的原因如下: DomainUpDown
的Control
屬性包含 - 以及其他東西 - TextBox
,因此您可能明確希望將其排除在處理方式與其他控件相同;)
否則你會像它是一個Panel
或類似的那樣遞歸它,因此也清除它的文本!
采用
if(control.GetType()== typeof(TextBox))
代替
if(控件是TextBox)
只清除TextBoxes,然后離開DUD :)
'is'運算符不檢查參數的類型,但檢查它們是否兼容(與繼承有關),並且通常用於檢查接口。
MSDN :如果提供的表達式為非null,則is表達式求值為true,並且可以將提供的對象強制轉換為提供的類型,而不會引發異常。
這將有助於清除文本框
private void ClearInputs(ControlCollection ctrls)
{
foreach (Control ctrl in ctrls)
{
if (ctrl is TextBox)
((TextBox)ctrl).Text = string.Empty;
ClearInputs(ctrl.Controls);
}
}
如果您只想清除可以使用的文本框
foreach(var control in Controls.OfType<TextBox>())
{
control.Clear();
}
如果您的方法是遞歸的,您可能更喜歡這個GetAll方法
foreach(var control in this.GetAll<TextBox>())
foreach(var control in this.GetAll<TextBox>()
.Where(x => x.GetType().IsSubclassOf(typeof(TextBox))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.