迭代通过TableLayoutPanel来处理控件 - 一些控件被跳过

时间:2015-01-22 01:10:10

标签: c# foreach dispose tablelayoutpanel

我有一个动态创建的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();
}

代码应遍历面板中的每个控件,删除除第一行之外的每一行中的控件。我甚至添加了检查来删除处理程序以获取它们的控件。

问题在于:当我运行代码时,它似乎永远不会获得所有控件。其中的countloopCount变量仅用于调试。在最简单的情况下,count为14,但loopCount在循环结束时达到9或10。这是最令人烦恼的部分:每次运行方法时,跳过的控件并不总是相同!!!

这是怎么回事,我该如何解决?

0 个答案:

没有答案