private void CleanForm()
{
foreach (var c in this.Controls)
{
if (c is TextBox)
{
((TextBox)c).Text = String.Empty;
}
}
}
上述方法不起作用,并且不会清除控件。它编译得很好,但什么也没做。
有什么想法吗?
答案 0 :(得分:61)
我喜欢lambda:)
private void ClearTextBoxes()
{
Action<Control.ControlCollection> func = null;
func = (controls) =>
{
foreach (Control control in controls)
if (control is TextBox)
(control as TextBox).Clear();
else
func(control.Controls);
};
func(Controls);
}
祝你好运!
答案 1 :(得分:6)
几周前我们遇到过这样的问题。如果你设置一个断点并深入研究this.Controls
,问题就会显示它的本质:你必须通过所有子控件来解决。
代码可能如下所示:
private void CleanForm()
{
traverseControlsAndSetTextEmpty(this);
}
private void traverseControlsAndSetTextEmpty(Control control)
{
foreach(var c in control.Controls)
{
if (c is TextBox) ((TextBox)c).Text = String.Empty;
traverseControlsAndSetTextEmpty(c);
}
}
答案 2 :(得分:4)
您的文本框可能位于面板或其他容器内,而不是直接位于表单内。
您需要以递归方式遍历每个子控件的Controls
集合。
答案 3 :(得分:4)
private void CleanForm(Control ctrl)
{
foreach (var c in ctrl.Controls)
{
if (c is TextBox)
{
((TextBox)c).Text = String.Empty;
}
if( c.Controls.Count > 0)
{
CleanForm(c);
}
}
}
当你最初调用ClearForm时,传入this或者Page(我认为这就是'this')。
答案 4 :(得分:3)
我改进/修正了我的扩展方法。
public static class ControlsExtensions
{
public static void ClearControls(this Control frm)
{
foreach (Control control in frm.Controls)
{
if (control is TextBox)
{
control.ResetText();
}
if (control.Controls.Count > 0)
{
control.ClearControls();
}
}
}
}
答案 5 :(得分:2)
这用于清除文本框,复选框,radioButton
等形式的所有控件你可以添加你想要的不同类型..
private void ClearTextBoxes(Control control)
{
foreach (Control c in control.Controls)
{
if (c is TextBox)
{
((TextBox)c).Clear();
}
if (c.HasChildren)
{
ClearTextBoxes(c);
}
if (c is CheckBox)
{
((CheckBox)c).Checked = false;
}
if (c is RadioButton)
{
((RadioButton)c).Checked = false;
}
}
}
答案 6 :(得分:0)
试试这个:
var t = Form.Controls.OfType<TextBox>().AsEnumerable<TextBox>();
foreach (TextBox item in t)
{
item.Text = "";
}
答案 7 :(得分:0)
也许您想要更简单,更简短的方法。这也将清除所有TextBoxes。 (除了Panel或GroupBox内的TextBoxes)。
foreach (TextBox textBox in Controls.OfType<TextBox>())
textBox.Text = "";
答案 8 :(得分:0)
您可以尝试使用此代码
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if(keyData==Keys.C)
{
RefreshControl();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
答案 9 :(得分:0)
groupBoxName.Controls.OfType<TextBox>().ToList().ForEach(t => t.Clear());