c# - Form.Controls.OfType 的奇怪行为
问题描述
我有一个在运行时构建的表单,用户在其中输入一些数据并提交数据或取消。表单由一个带有控件的 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);
}
}
我对此感到很困惑。我忽略了一些简单的事情吗?
解决方案
推荐阅读
- python - Pip 安装克隆的分叉存储库以供本地和生产使用
- sql - 将数千行插入包含其他表中的值的表中
- javascript - JavaScript If-else range check in 相反不起作用
- python - 初始化一个numpy数组以在其中保存其他数组?
- javascript - 如何修复 reactjs 中的历史推送?
- javascript - 提取字符串中负索引之前的所有内容
- pandas - Python - 如何查看 csv 文件的列名称
- python - 在谷歌云运行上安装 jsonnet 失败
- mysql - 在mysql中使用group by子句选择带有日期和时间列的最新记录
- python - “/”处或附近的 psycopg2 模块语法错误