我的winform c#项目有问题。 在我的项目中,我有两个主要功能,一个在运行时创建按钮,另一个功能允许我在运行时移动窗体上的按钮。现在我可以做什么,如果我在其他按钮上有按钮,所以我做了一个功能,取代按钮位置,因为它在开始时但功能会产生问题,如果有人可以帮助我,这将是伟大的!
public void upandunder(Button cBtn1, Button cBtn2)
{
if ((cBtn1.Location.X == cBtn2.Location.X) && (cBtn1.Location.Y == cBtn2.Location.Y))
{
int placex = cBtn1.Location.X;
int placey = cBtn1.Location.Y;
cBtn1.Location.X = cBtn2.Location.Y;
cBtn1.Location.Y = cBtn2.Location.Y;
cBtn2.Location.X = placex;
cBtn2.Location.Y = placey;
}
}
答案 0 :(得分:1)
它让我知道errorError 1无法修改'System.Windows.Forms.Control.Location'的返回值,因为它不是变量
正确,Location
属性的返回值不可编辑。根据{{3}}:
因为
Point
类是Visual Basic中的值类型(Structure
,Visual C#中的struct
),所以它是按值返回的,这意味着访问该属性会返回一个控件的左上角。因此,调整从此属性返回的X
的{{1}}或Y
属性不会影响Point
,Left
,Right
或控件的Top
属性值。要调整这些属性,请单独设置每个属性值,或者使用新的Bottom
设置Location
属性。
因此,您需要将代码重写为以下内容:
(另外,我强烈建议将参数命名为Point
和x
以外的参数,因为您正在处理函数中具有x和y值的坐标... )
y
甚至更好,只需比较public void upandunder(Button btn1, Button btn2)
{
if ((btn1.Location.X == btn2.Location.X) && (btn1.Location.Y == btn2.Location.Y))
{
Point originalLocation = btn1.Location;
btn1.Location = btn2.Location;
btn2.Location = originalLocation;
}
}
属性(Point
结构the documentation)返回的两个Location
值:
Point
当然,我没有看到它如何完成任何事情。首先,检查按钮是否位于彼此之上(具有完全相同的x坐标和y坐标),然后如果它们相同,则交换位置。他们已经在相同的位置 - 您在执行交换代码之前测试了它们。
根据您的函数名称(public void upandunder(Button btn1, Button btn2)
{
if (btn1.Location == btn2.Location)
{
Point originalLocation = btn1.Location;
btn1.Location = btn2.Location;
btn2.Location = originalLocation;
}
}
,根据标准.NET命名约定应该upandunder
)来判断,似乎您希望更改按钮的Z顺序。如果是这种情况,那么您应该调用按钮控件的overloads the ==
operator或BringToFront
方法。
答案 1 :(得分:0)
控件上的Location
属性返回一个Point。 Point结构具有您正在使用的X和Y值。我认为您不想直接访问它们,而是想提供新的位置点。
尝试一下(它适用于我的机器)
public void UpAndUnder(Button cBtn1, Button cBtn2)
{
if (cBtn1.Location == cBtn2.Location.Y)
{
Point oldPoint = new Point(cBtn1.Location.X, cBtn1.Location.Y);
cBtn1.Location = new Point(cBtn2.Location.X, cBtn2.Location.Y);
cBtn2.Location = oldPoint;
}
}
答案 2 :(得分:0)
如果您想将一个按钮放在另一个按钮上,请拨打
button1.BringToFront();
这会改变button1的Z顺序并将其放在所有其他控件上。