簡體   English   中英

清除所有TextBox但忽略DomainUpDown

[英]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);

您描述的行為的原因如下: DomainUpDownControl屬性包含 - 以及其他東西 - 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM