Очистить текст всех текстовых полей в выбранной вкладке
У меня есть форма, которая имеет 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.
Пожалуйста, что я сделал не так и как я могу это исправить?
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 typeTextBoxи очистить текст.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