不应该被更改的存储变量正在被更改

本文关键字:变量 不应该 存储 | 更新日期: 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; }
}