如何删除表单中的所有textarea?

时间:2017-08-20 20:37:38

标签: c# winforms c#-4.0

我试过这个方法:

private void ClearTextBoxes()
        {
            Action<Control.ControlCollection> func = null;

            func = (controls) =>
            {
                foreach (Control control in controls)
                    if (control is TextBox)
                        (control as TextBox).Dispose();
                    else
                        func(control.Controls);
            };

            func(Controls);
        }

如果我甚至刷新表格,它就不起作用。

2 个答案:

答案 0 :(得分:2)

如果要从表单中删除所有textarea,则应将其从父控件集合中删除,然后在完成它们时始终对实现IDisposable的对象调用Dispose,以便立即释放它们拥有的任何非托管资源。如果你不在不需要的文本框上调用Dispose(),它将在GC决定时被清除,并且可能在应用程序运行过程中或最后发生。这里的区别在于,如果显式调用Dispose(),则将在下次运行GC时执行对象终止,否则在第一次运行时,GC会将对象放入终结队列并在另一次运行时清理内存。

        #checking
        if check == 3:
            print("Password Validated")
            found = True
        else:
            pss = input("Correct you password")#re enters password
            check = 0
            done = 0
            done2 = 0

如果您想要隐藏所有文本框区域,请调用Clear方法。

 private void ClearTextBoxes()
{
    Action<Control.ControlCollection> func = null;

    func = (controls) =>
    {
        foreach (Control control in controls)
            if (control is TextBox)
            {
                Controls.Remove(control);
            }
            else
             func(control.Controls);

         //Here after removing controls you should call Dispose to clean-up
    };
    func(Controls);
}

答案 1 :(得分:1)

如果您要清除TextBox中的所有文字,那么您应该使用TextBox.Clear()实例方法。

public void ClearTextBoxes()
{
    ClearTextBoxes(Controls);
}

private void ClearTextBoxes(Control.ControlCollection controls)
{
    if(controls == null) 
        return;
    foreach(var control in controls)
    {
        (control as TextBox)?.Clear();
        ClearTextBoxes(control?.Controls);
    }
}

如果您尝试从表单中删除所有TextBox个对象,则应使用ControlCollection.Remove(Control)实例方法或ControlCollection.RemoveAt(int)实例方法。

public void RemoveTextBoxes()
{
    RemoveTextBoxes(Controls);
}

private void RemoveTextBoxes(Control.ControlCollection controls)
{
    if(controls == null) 
        return;
    for(int i = 0; i < controls.Count; ++i)
    {
        var control = controls[i];
        if(control is TextBox)
        {
            controls.RemoveAt(i);
        }
        else 
            RemoveTextBoxes(control?.Controls);
    }
}

请注意,在这种情况下,我们无法使用foreach循环,因为我们正在更改基础集合。

此外,如果您使用的是C#7,则可以将私有方法作为本地函数。

修改:正如@KrzysztofLa所述,由于TextBox实现了IDisposable,因此您应该在将其从集合中删除后调用Dispose你已经完成了特定的TextBox(你可能是)。