我有一个动态创建的TableLayoutPanel
,其中每个单元格(第一行中除了那些单元格)包含一个在运行时添加的控件(其中两个单元格带有EventHandlers
)。我需要能够清除该表的内容,所以我为此编写了一个方法:
private void clearDataLogs()
{
tableLayoutPanel_dataLogs.Visible = false;
button_saveSelectedLogs.Visible = false;
tableLayoutPanel_dataLogs.SuspendLayout();
int loopCount = 0;
TableLayoutControlCollection controls = tableLayoutPanel_dataLogs.Controls;
foreach (Control control in controls)
{
var count = controls.Count;
loopCount++;
int row = tableLayoutPanel_dataLogs.GetCellPosition(control).Row;
if (row != 0)
{
if (control.Name.Contains(ControlNames.checkBoxSelectedName)) ((CheckBox)control).CheckedChanged -= new System.EventHandler(this.checkBox_getAnyDataLog_CheckedChanged);
else if (control.Name.Contains(ControlNames.textBoxFileNameName)) ((TextBox)control).TextChanged -= new System.EventHandler(this.textBoxFileName_TextChanged);
tableLayoutPanel_dataLogs.Controls.Remove(control);
control.Dispose();
}
}
while (tableLayoutPanel_dataLogs.RowCount > 1)
{
int row = tableLayoutPanel_dataLogs.RowCount - 1;
tableLayoutPanel_dataLogs.RowStyles.RemoveAt(row);
tableLayoutPanel_dataLogs.RowCount--;
}
tableLayoutPanel_dataLogs.Size = new System.Drawing.Size(530, 56);
tableLayoutPanel_dataLogs.AutoScroll = true;
tableLayoutPanel_dataLogs.Visible = false;
tableLayoutPanel_dataLogs.ResumeLayout();
tableLayoutPanel_dataLogs.PerformLayout();
}
代码应遍历面板中的每个控件,删除除第一行之外的每一行中的控件。我甚至添加了检查来删除处理程序以获取它们的控件。
问题在于:当我运行代码时,它似乎永远不会获得所有控件。其中的count
和loopCount
变量仅用于调试。在最简单的情况下,count
为14,但loopCount
在循环结束时达到9或10。这是最令人烦恼的部分:每次运行方法时,跳过的控件并不总是相同!!!
这是怎么回事,我该如何解决?