更改列表<点>项的值
本文关键字:列表 | 更新日期: 2023-09-27 18:35:08
我正在制作(学校)绘制曲线的应用程序。我通过鼠标单击设置点并将其位置添加到顶点列表中。现在,我正在使用鼠标按下和鼠标向上的操作来移动点。在鼠标按下时,我发现鼠标的位置是否在顶点列表中的任何顶点周围的小正方形(4x4 px),然后在鼠标向上时,我想将顶点的坐标更改为我向上抬起鼠标按钮的坐标。但是我遇到了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]"的返回值,因为它不是变量
这是因为Point
是结构而不是对象。您可以将结构视为分组值。
因此,当您访问 vertices[indexOfMoved] 时,您将获得列表中内容的副本,而不是实际的"对象"。
你可以这样做:
vertices[indexOfMoved] = new Point { X = e.X, Y = e.Y };
您无法更改此值,因为 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: ?";
}
发生这种情况是因为您使用的是结构。如果编译器没有给出任何警告,则将在堆栈中创建一个新结构,并对堆栈中的结构进行更改;这对列表中的结构没有影响。编译器发出警告以防止这种情况。