Как скрыть и показать элементы управления TableLayoutPanel, не переставляя их - PullRequest
0 голосов
/ 10 октября 2018

Я использую 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)?

...