我的表单中包含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
。
请问我做错了什么,我该怎么纠正呢?
答案 0 :(得分:5)
在foreach循环中使用OfType<T>()
。
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 = "";
}
}
答案 1 :(得分:4)
在网上发现它并且有效
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);
}
答案 2 :(得分:1)
使用可以简单地遍历所选标签中的所有控件,然后在清除文本之前检查control type
是否为TextBox
并清除文本。
foreach (Control item in tabControl1.SelectedTab.Controls)
{
if (item.GetType().Equals(typeof(TextBox)))
{
item.Text = string.Empty;
}
}
答案 3 :(得分:1)
如果你的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;
}
答案 4 :(得分:0)
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();
}
}