如何清除嵌套在 TabControl、TabPage 和 2 个面板中的文本框?
How to clear TextBoxes nested inside a TabControl, TabPage and 2 Panels?
下图是我正在构建的插件。
黄色 = tabControl1; 橙色 = tabPage1; 蓝色 = 主面板 (mainPanel); 绿色 = 主面板内有 3 个不同的面板(面板 1、面板 2 和面板 3); White = TextBoxes(我想清除); 深蓝 = 绿色面板对应的复选框
我正在尝试从包含文本的文本框中清除任何文本,并在选中时重置复选框,单击 按钮。
我在网上查了一下,尝试通过以下方式来解决这个问题,但似乎不是解决这个问题的正确方法。
foreach (Control a in tabControl1.Controls)
{
foreach(Control b in tabPage1.Controls)
{
foreach (Control c in mainPanel.Controls)
{
foreach (Control d in panel1.Controls)
{
if (d is TextBox)
{
d.Text = " ";
}
if (d is CheckBox)
{
((CheckBox)d).Checked = false;
}
}
}
}
}
我在这里只展示了 panel1
,但也尝试对 panel2
和 3 做同样的事情。
我到底做错了什么?任何帮助将不胜感激!
如果你想清除panel1
里面的TextBox
es和ComboBox
es那么你只需要循环遍历panel1
的控件就可以了。要处理任何面板,您只需编写一个 ClearPanel(Panel)
函数即可。
private void ClearPanel(Panel panel)
{
foreach (var ctrl in panel.Controls)
{
if (ctrl is TextBox tb)
{
tb.Clear();
}
else if (ctrl is CheckBox chkBx)
{
chkBx.Checked = false;
}
}
}
private void ClearPanel1Button_Click(object sender, EventArgs e)
{
ClearPanel(panel1);
}
如果您已经引用了您正在处理的 Panel
,那么迭代 tabControl1
、tabPage1
等中的控件会增加不必要的开销。更重要的是,如果外循环中的任何控件有一个空的 Controls
集合,那么内循环将不会执行。我怀疑这可能是您的代码无法正常工作的原因。
请注意,上述解决方案不会处理 panel1
内另一个容器内的任何 TextBox
或 ComboBox
。所以,如果 panel1
里面有一个 GroupBox
其中包含 TextBox
es 或 ComboBox
es,它们将不会被清除。请参阅下面的递归解决方案来处理这种情况。
编辑:在 re-reading 你的问题之后,我想你可能想清除 Form
上的所有 TextBox
和 CheckBox
控件。
如果您需要清除 Form
上的每个 TextBox
或 CheckBox
,您可以使用递归来完成此操作。
private void Clear(Control ctrl)
{
if (ctrl is TextBox tb)
{
tb.Clear();
}
if (ctrl is CheckBox chkBx)
{
chkBx.Checked = false;
}
foreach (Control child in ctrl.Controls)
{
Clear(child);
}
}
private void ClearButton_Click(object sender, EventArgs e)
{
Clear(this);
}
您可以将任何 Control
传递给 Clear(Control)
,因此如果您只想在 tabPage1
上执行 TextBox
es 和 ComboBox
es,您可以打电话 Clear(tabPage1)
。这将清除 tabPage1
上的所有 TextBox
es 和 ComboBox
es,即使它们位于 Panel
或 GroupBox
或其他容器中。
你只需要一个简单的递归方法来迭代指定父容器的所有子容器内的所有控件,mainPanel
,这里
如果控件是 TextBox 或 CheckBox 类型,则相应地设置其 Text
或 Checked
属性:
(请注意,您还可以将 tabPage1
传递给方法或任何其他祖先)
ClearControls(panel1);
// or
ClearControls(tabPage1);
private void ClearControls(Control parent)
{
if ((parent == null) || (!parent.HasChildren))
return;
foreach (var ctl in parent.Controls.OfType<Control>())
{
if (ctl is TextBox txt) {
txt.Clear();
}
if (ctl is CheckBox chk) {
chk.Checked = false;
}
else {
if (ctl.HasChildren) {
ClearControls(ctl);
}
}
}
}
下图是我正在构建的插件。
黄色 = tabControl1; 橙色 = tabPage1; 蓝色 = 主面板 (mainPanel); 绿色 = 主面板内有 3 个不同的面板(面板 1、面板 2 和面板 3); White = TextBoxes(我想清除); 深蓝 = 绿色面板对应的复选框
我正在尝试从包含文本的文本框中清除任何文本,并在选中时重置复选框,单击 按钮。
我在网上查了一下,尝试通过以下方式来解决这个问题,但似乎不是解决这个问题的正确方法。
foreach (Control a in tabControl1.Controls)
{
foreach(Control b in tabPage1.Controls)
{
foreach (Control c in mainPanel.Controls)
{
foreach (Control d in panel1.Controls)
{
if (d is TextBox)
{
d.Text = " ";
}
if (d is CheckBox)
{
((CheckBox)d).Checked = false;
}
}
}
}
}
我在这里只展示了 panel1
,但也尝试对 panel2
和 3 做同样的事情。
我到底做错了什么?任何帮助将不胜感激!
如果你想清除panel1
里面的TextBox
es和ComboBox
es那么你只需要循环遍历panel1
的控件就可以了。要处理任何面板,您只需编写一个 ClearPanel(Panel)
函数即可。
private void ClearPanel(Panel panel)
{
foreach (var ctrl in panel.Controls)
{
if (ctrl is TextBox tb)
{
tb.Clear();
}
else if (ctrl is CheckBox chkBx)
{
chkBx.Checked = false;
}
}
}
private void ClearPanel1Button_Click(object sender, EventArgs e)
{
ClearPanel(panel1);
}
如果您已经引用了您正在处理的 Panel
,那么迭代 tabControl1
、tabPage1
等中的控件会增加不必要的开销。更重要的是,如果外循环中的任何控件有一个空的 Controls
集合,那么内循环将不会执行。我怀疑这可能是您的代码无法正常工作的原因。
请注意,上述解决方案不会处理 panel1
内另一个容器内的任何 TextBox
或 ComboBox
。所以,如果 panel1
里面有一个 GroupBox
其中包含 TextBox
es 或 ComboBox
es,它们将不会被清除。请参阅下面的递归解决方案来处理这种情况。
编辑:在 re-reading 你的问题之后,我想你可能想清除 Form
上的所有 TextBox
和 CheckBox
控件。
如果您需要清除 Form
上的每个 TextBox
或 CheckBox
,您可以使用递归来完成此操作。
private void Clear(Control ctrl)
{
if (ctrl is TextBox tb)
{
tb.Clear();
}
if (ctrl is CheckBox chkBx)
{
chkBx.Checked = false;
}
foreach (Control child in ctrl.Controls)
{
Clear(child);
}
}
private void ClearButton_Click(object sender, EventArgs e)
{
Clear(this);
}
您可以将任何 Control
传递给 Clear(Control)
,因此如果您只想在 tabPage1
上执行 TextBox
es 和 ComboBox
es,您可以打电话 Clear(tabPage1)
。这将清除 tabPage1
上的所有 TextBox
es 和 ComboBox
es,即使它们位于 Panel
或 GroupBox
或其他容器中。
你只需要一个简单的递归方法来迭代指定父容器的所有子容器内的所有控件,mainPanel
,这里
如果控件是 TextBox 或 CheckBox 类型,则相应地设置其 Text
或 Checked
属性:
(请注意,您还可以将 tabPage1
传递给方法或任何其他祖先)
ClearControls(panel1);
// or
ClearControls(tabPage1);
private void ClearControls(Control parent)
{
if ((parent == null) || (!parent.HasChildren))
return;
foreach (var ctl in parent.Controls.OfType<Control>())
{
if (ctl is TextBox txt) {
txt.Clear();
}
if (ctl is CheckBox chk) {
chk.Checked = false;
}
else {
if (ctl.HasChildren) {
ClearControls(ctl);
}
}
}
}