Очистить текст всех текстовых полей в выбранной вкладке



У меня есть форма, которая имеет tab control и каждая вкладка имеет номер textboxes,labels и buttons. Я хочу, чтобы пользователь мог очистить весь текст в текстовых полях выбранной вкладки.



Я пробовал



    private void resetCurrentPageToolStripMenuItem_Click(object sender, EventArgs e)
{
foreach (TextBox t in tabControl1.SelectedTab.Controls)
{
t.Text = "";
}
}


Приведенный выше код бросает InvalidCastException с сообщением Unable to cast object of type 'System.Windows.Forms.Button' to type 'System.Windows.Forms.TextBox.



Пожалуйста, что я сделал не так и как я могу это исправить?

701   5  

5 ответов:

Используйте OfType<T>() в цикле foreach.

private void resetCurrentPageToolStripMenuItem_Click(object sender, EventArgs e)
{
    foreach (TextBox t in tabControl1.SelectedTab.Controls.OfType<TextBox>())
    {
        t.Text = "";
    }
}

Альтернатива:

foreach (Control control in tabControl1.SelectedTab.Controls) 
{
    TextBox text = control as TextBox;
    if (text != null) 
    {
        text.Text = "";
    }
}

Нашел это в интернете, и это сработало

    void ClearTextBoxes(Control parent)
    {
        foreach (Control child in parent.Controls)
        {
            TextBox textBox = child as TextBox;
            if (textBox == null)
                ClearTextBoxes(child);
            else
                textBox.Text = string.Empty;
        }
    }

    private void resetCurrentPageToolStripMenuItem_Click(object sender, EventArgs e)
    {
        ClearTextBoxes(tabControl1.SelectedTab);
    }

Use может просто перебрать все элементы управления в выбранной вкладке и перед очисткой текста проверить, является ли control type TextBox и очистить текст.

 foreach (Control item in tabControl1.SelectedTab.Controls)
            {
                if (item.GetType().Equals(typeof(TextBox)))
                {
                    item.Text = string.Empty;
                }
            }

Если у вас есть текстовые поля, вложенные в ваш tabcontrol. здесь нужно написать рекурсивный метод, так как ofType Метод не вернет вложенные текстовые поля..

 private void ResetTextBoxes(Control cntrl)
 {
     foreach(Control c in cntrl.Controls)
     {
          ResetTextBoxes(c);
          if(c is TextBox)
            (c as TextBox).Text = string.Empty;
     }
 }

Альтернативно, если у вас есть текстовые поля только на базовом уровне TabControl, вы можете использовать этот

foreach(var tb in tabControl1.OfType<TextBox>())
 {
    tb.Text = string.Emtpy;
}
 var textBoxNames = this.tabControl1.SelectedTab.Controls.OfType<TextBox>();
            foreach (var item in textBoxNames)
            {
                var textBoxes = tabControl1.SelectedTab.Controls.Find(item.Name, true);
                foreach (TextBox textBox in textBoxes)
                {
                    textBox.Clear();
                }
            }

Comments

    Ничего не найдено.