不应该更改的存储变量会发生变化

时间:2015-09-22 17:34:53

标签: c# winforms

我正在使用某些面板制作一些自定义过渡效果,并确保我可以将面板返回到我需要它们的状态,当调用Form加载方法时,我搜索表单控件所有面板,并将相应的面板添加到面板列表中,以便稍后我可以返回其默认值。

internal List<Panel> PDefaults = new List<Panel>();

foreach (var panel in this.Controls)
{
    if (panel.GetType() == typeof (Panel) && Name != "panel1")
    {
        PDefaults.Add((Panel) panel);
    }
}
不要担心那个小组1,这只是我不在乎的小组之一,所以我不需要它在列表中。

现在,我有一个按钮,它应该触发我自定义类中的方法

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);
        }
    }
}

我使用相同的按钮,以类似切换方式,所以我不确定这是否是问题,但在第一次点击时,这是有效的,因为它符合if条件关于Mover类的EDown方法,如上所示;但是,在下一次点击时,它仍然符合第一个条件。我通过一些调试发现并在前后查看变量,看来PDefaults[3].Height值实际上已被改变,当我所做的只是指向它时,或者至少是那个我认为我在做什么。我将面板的值专门存储在列表中,因此我没有更改值,但几乎看起来好像每次引用列表时,列表都会返回到存储的面板在其中,并获得新的价值观。如果有人建议如何解决这个问题,甚至做得更好,那么我会很感激。

1 个答案:

答案 0 :(得分:1)

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; }
}