不应该被更改的存储变量正在被更改
本文关键字:变量 不应该 存储 | 更新日期: 2023-09-27 18:13:54
我正在使用一些面板制作一些自定义过渡效果,为了确保我可以将面板返回到我需要它们的状态,当调用Form load方法时,我搜索所有面板的表单控件,并将各自的面板添加到面板列表中,以便稍后我可以引用它们的默认值。
internal List<Panel> PDefaults = new List<Panel>();
foreach (var panel in this.Controls)
{
if (panel.GetType() == typeof (Panel) && Name != "panel1")
{
PDefaults.Add((Panel) panel);
}
}
不用担心panel1,那只是我不想弄乱的面板之一,所以我不需要它在列表中。
现在,我有一个按钮它应该触发自定义类中的一个方法
private void button1_Click(object sender, EventArgs e)
{
Mover.EDown(ref panel2, PDefaults[3].Height, PDefaults[3].Height + 50);
}
这是类的方法
public static void EDown(ref Panel panel, int collapsedY, int expandedY)
{
if (panel.Height == collapsedY)
{
for (var i = panel.Height; i <= expandedY; i+=2)
{
panel.Height = i;
panel.Refresh();
Thread.Sleep(10);
}
}
else
{
for (var i = panel.Height; i >= collapsedY; i-=2)
{
panel.Height = i;
panel.Refresh();
Thread.Sleep(10);
}
}
}
我使用相同的按钮,以一种切换方式,所以我不确定这是否是这里的问题,但在第一次点击,这是有效的,因为它满足上面显示的Mover类的EDown方法的if条件;但是,在下一次单击时,它仍然满足第一个条件。我发现通过一些调试和查看变量前后,似乎PDefaults[3].Height
值实际上被改变了,当我所做的只是指向它,或者至少这是我认为我在做的。我特意将面板的值存储在列表中,所以我没有更改值,但似乎每次我引用列表时,列表都会引用存储在其中的面板,并获取新值。如果有人有关于如何绕过这个问题甚至做得更好的建议,我将不胜感激。
Panel是一个引用类型。当您将面板保存到列表中时,您不是保存面板的副本,而是保存对相同面板的引用。
我建议不要将面板存储在列表中,而是将面板高度存储在列表中。height属性的类型是int。这意味着它的一个副本将被存储在列表中。
更新:
下面是一个示例类,您可以使用它来存储关于Panel的更多信息:
public class PanelInformation
{
public int Height { get; set; }
public int Width { get; set; }
public int X { get; set; }
public int Y { get; set; }
}