更改List <point>项</point>的值

时间:2012-05-24 13:31:44

标签: c# list

我正在制作(学校)绘制曲线的应用程序。我通过鼠标单击设置点,并将它们的位置添加到顶点列表。现在我正在使用鼠标按下和鼠标按下操作来移动点。在鼠标按下时,我会发现鼠标的位置是否位于顶点列表中任何顶点周围的小方块(4x4像素)中,然后在鼠标向上时我想将顶点的坐标更改为我向上提起鼠标按钮的坐标。但我用List来解决这个问题,因为visual studio说List项目无法更改,因为它不是变量。我该如何解决这个问题?

List<Point> vertices = new List<Point>(); //list of vertices
void canvas_MouseUp(object sender, MouseEventArgs e) {
    if (!move) return; //if moving is off returns
    vertices[indexOfMoved].X = e.X; //change X position to new position
    vertices[indexOfMoved].Y = e.Y; //change Y position to new position
    indexOfMovedLabel.Text = "Moved: ?";
}

问题:

  

错误1无法修改'System.Collections.Generic.List.this [int]'的返回值,因为它不是变量

2 个答案:

答案 0 :(得分:7)

这是因为Point是结构而不是对象。您可以将结构视为分组值。

因此,当您访问顶点[indexOfMoved]时,您会获得列表中的内容的副本,而不是实际的&#39;对象&#39;。

你可以这样做:

vertices[indexOfMoved] = new Point { X = e.X, Y = e.Y };

答案 1 :(得分:2)

由于Point是结构,因此无法更改此值。在详细介绍之前;您需要将功能更改为以下内容:

private void canvas_MouseUp(object sender, MouseEventArgs e)
{
    if (!move) return; //if moving is off returns
    Point p = vertices[indexOfMoved];
    p.X = e.X;
    p.Y = e.Y;
    vertices[indexOfMoved] = p;            
    indexOfMovedLabel.Text = "Moved: ?";
}

这是因为您正在使用结构。如果编译器没有给出任何警告,那么将在堆栈中创建一个新的结构,并且将对堆栈中的结构进行更改;这对列表中的结构没有影响。编译器发出警告以防止这种情况发生。