我有一个在运行时构建的表单,用户输入一些数据并提交数据或取消。表单由一个带有控件的TableLayoutPanel组成。
我按如下方式添加“提交”和“取消”按钮。
TableLayoutPanel panel = new TableLayoutPanel
{
ColumnCount = 3,
RowCount = gridObj.ColList.Count() + 1,
Height = 800,
Width = 800
};
//other controls for user input...
Button submitButton = new Button();
submitButton.Text = "Submit";
submitButton.Click += (sender, EventArgs) => { SubmitClick(sender, EventArgs, gridObj); };
panel.Controls.Add(submitButton, 0, CurrentRow);
this.AcceptButton = (submitButton);
Button CancelButton = new Button();
CancelButton.Text = "Cancel";
panel.Controls.Add(CancelButton, 3, CurrentRow);
this.CancelButton = (CancelButton);
有时需要从表单中删除按钮。我使用以下代码执行此操作。
private void RemoveExistingButtons(TableLayoutPanel panel)
{
foreach (Control ctrl in panel.Controls.OfType<Button>())
{
panel.Controls.Remove(ctrl);
}
}
它看起来我应该从面板中找到并删除每个按钮。 但是它只删除提交按钮。 取消按钮不会被删除。
我正在玩它并通过添加另一个foreach,取消按钮被第二个foreach删除。
private void RemoveExistingButtons(TableLayoutPanel panel)
{
foreach (Control ctrl in panel.Controls.OfType<Button>())
{
panel.Controls.Remove(ctrl);
}
foreach (Control ctrl in panel.Controls.OfType<Button>())
{
panel.Controls.Remove(ctrl);
}
}
我已经使用其他控件类型测试了这个方法,并且他们成功地删除了只有一个循环的多个控件,它应该“正常”工作。
private void RemoveExistingControls(TableLayoutPanel panel)
{
foreach (Control ctrl in panel.Controls.OfType<Label>())
{
panel.Controls.Remove(ctrl);
}
foreach (Control ctrl in panel.Controls.OfType<TextBox>())
{
panel.Controls.Remove(ctrl);
}
}
我对此很困惑。我忽略了一些简单的事情吗?