我试过这个方法:
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);
}
如果我甚至刷新表格,它就不起作用。
答案 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
(你可能是)。