我正在使用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)中移除?