清除所选标签页中所有文本框中的文本。

8
我是一名有用的助手,可以为您翻译文本。
我有一个表单,其中包含一个“选项卡控件”,每个选项卡都有多个“文本框”,“标签”和“按钮”。我希望用户可以清除所选选项卡中所有文本框中的文本。
我已经尝试过:
    private void resetCurrentPageToolStripMenuItem_Click(object sender, EventArgs e)
    {
        foreach (TextBox t in tabControl1.SelectedTab.Controls)
        {
            t.Text = "";
        }
    }

上述代码会抛出一个消息为“Unable to cast object of type 'System.Windows.Forms.Button' to type 'System.Windows.Forms.TextBox'.”的InvalidCastException异常。
请问我做错了什么,应该如何纠正?

1
你想要 controls.oftype<textbox>()。 - Sayse
@Sayse,请问我应该把它放在哪里?我使用的是Visual C# 2005。 - user2509901
5个回答

6

在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 = "";
    }
}

您还需要包含 System.Linq 命名空间。 - Scott Chamberlain
否则,如果控件是文本框。 - Sayse
根据MSDN文档,@ScottChamberlain,该功能适用于.NET 3.5及更高版本,因此在他的情况下他无法使用它。 - Martijn van Put
1
@ScottChamberlain C# 2005 中没有 System.Linq @MartijnvanPut 这个替代方案不执行任何操作 - user2509901
@Precious1tj 我已经测试了这个语句,在我的情况下它是有效的。如果textBox位于子控件中,请查看Ehsan Ullah的答案。 - Martijn van Put
显示剩余3条评论

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);
    }

1
你可以简单地遍历所选标签页中的所有控件,在清除文本之前检查控件类型是否为TextBox,然后清除文本。
 foreach (Control item in tabControl1.SelectedTab.Controls)
            {
                if (item.GetType().Equals(typeof(TextBox)))
                {
                    item.Text = string.Empty;
                }
            }

2
你的if语句可以简化为if(item is TextBox) - Scott Chamberlain
仍未执行任何操作。 - user2509901
@程序员 你必须使用更高版本的C#。 - user2509901
1
我的错误,我正在使用框架 4.0。很高兴你自己找到了解决方案。 - Kurubaran

1
如果你在选项卡控件中嵌套了文本框,你需要编写一个递归方法,因为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;
}

很好的观点,如果没有这个,其他控件(面板、分组框等)中的文本框将不会被清除。 - Scott Chamberlain
foreach循环有点不对,需要改为:foreach(Control c in cntrl.Controls) - Martijn van Put
@Precious1tj 编辑了。谢谢Martijn。这就是在编辑器中直接输入而不是IDE的问题。 - Ehsan
@MartijnvanPut 仍然没有执行任何操作。 - user2509901
1
@Precious1tj 是的,我看到了,很好奇为什么我的答案不起作用。 - Ehsan
显示剩余5条评论

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();
                }
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接