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