如何隐藏和显示TableLayoutPanel控件而不重新排列它们

时间:2018-10-10 17:03:35

标签: controls hide show tablelayoutpanel

我正在使用TableLayoutPanel显示地图,其中TableLayoutPanel中的每个单元格都是地图中的一个空格。我希望能够分别隐藏或显示特定的单元格,以便一次仅显示部分地图。我的问题是,当我显示隐藏的单元格(使用.Show()或.Visible = true)时,它们会移动。 TableLayoutPanel似乎删除了隐藏的控件,然后当再次显示控件时,TableLayoutPanel将其放回表中。结果是,如果我从一开始就显示所有地图,我的地图就会正确显示,但是如果我全部隐藏并尝试显示一个房间,则房间单元会放在表格顶部的一行中,而不是停留在该行中他们在哪里。将元素添加到表中的函数如下所示:

public void PrepTable()
    {
        Padding noPadding = new Padding(0);
        EventHandler tableClickEventHandler = new EventHandler(TableLabelClick);

        for (int x = 0; x < 60; x++)
        {
            for (int y = 0; y < 60; y++)
            {
                tableDisplay.Controls.Add(new Label());
                tableDisplay.GetControlFromPosition(y, x).Click += tableClickEventHandler;
                tableDisplay.GetControlFromPosition(y, x).Margin = noPadding;
            }
        }
    }

隐藏元素的代码如下:

 for (int x = 0; x < 60; x++)
 {
      for (int y = 0; y < 60; y++)
      {
           tableDisplay.GetControlFromPosition(y, x).Hide();  //fog of war over everything
       }
 }

显示房间的代码如下:

if (tableDisplay.GetControlFromPosition(Program.currentDoor[0] - 1, Program.currentDoor[1]).BackColor == SystemColors.Control)
                {
                    int[] currentSpace = new int[2];
                    currentSpace[0] = Program.currentDoor[0] - 1;
                    currentSpace[1] = Program.currentDoor[1];
                    bool verticalWallHit = false;
                    bool leftWallHit = false;
                    bool rightWallHit = false;
                    int leftAdjust = 0;
                    int rightAdjust = 1;

                    while (!leftWallHit)
                    {
                        tableDisplay.GetControlFromPosition(currentSpace[0], currentSpace[1] - leftAdjust).Show();
                        leftAdjust++;
                        if (tableDisplay.GetControlFromPosition(currentSpace[0], currentSpace[1] - leftAdjust).BackColor != SystemColors.Control)
                        {
                            tableDisplay.GetControlFromPosition(currentSpace[0], currentSpace[1] - leftAdjust).Show();
                            leftWallHit = true;
                        }
                    }

                    while (!rightWallHit)
                    {
                        tableDisplay.GetControlFromPosition(currentSpace[0], currentSpace[1] + rightAdjust).Show();
                        rightAdjust++;
                        if (tableDisplay.GetControlFromPosition(currentSpace[0], currentSpace[1] + rightAdjust).BackColor != SystemColors.Control)
                        {
                            tableDisplay.GetControlFromPosition(currentSpace[0], currentSpace[1] + rightAdjust).Show();
                            rightWallHit = true;
                        }
                    }

                    while (!verticalWallHit)
                    {
                        currentSpace[0]--;
                        if(tableDisplay.GetControlFromPosition(currentSpace[0], currentSpace[1]).BackColor != SystemColors.Control)
                        {
                            verticalWallHit = true;
                        }
                        for (int x = 0; x <= leftAdjust; x++)
                        {
                            tableDisplay.GetControlFromPosition(currentSpace[0], currentSpace[1] - x).Show();
                        }

                        for(int y = 1; y <= rightAdjust; y++)
                        {
                            tableDisplay.GetControlFromPosition(currentSpace[0], currentSpace[1] + y).Show();
                        }
                    }

                }

有什么方法可以隐藏和显示这些控件而不将它们从TableLayoutPanel(tableDisplay)中移除?

0 个答案:

没有答案