C#以编程方式更改对象的位置

时间:2011-12-03 18:41:45

标签: c# winforms visual-studio-2010 runtime controls

我尝试了以下代码:

 this.balancePanel.Location.X = this.optionsPanel.Location.X;

在程序运行时更改我在设计模式下创建的面板的位置,但它返回错误:

Cannot modify the return value of 'System.Windows.Forms.Control.Location' because it is not a variable

那我该怎么做呢?

6 个答案:

答案 0 :(得分:61)

Location属性的类型Point是结构。

尝试分配新的Point对象,而不是尝试修改现有的Point

 this.balancePanel.Location = new Point(
     this.optionsPanel.Location.X,
     this.balancePanel.Location.Y
 );

答案 1 :(得分:15)

位置是一个结构。如果没有任何便利成员,您需要重新分配整个位置:

this.balancePanel.Location = new Point(
    this.optionsPanel.Location.X,
    this.balancePanel.Location.Y);

大多数结构也是不可变的,但在罕见(且令人困惑)的情况下它是可变的,你也可以复制,编辑,复制;

var loc = this.balancePanel.Location;
loc.X = this.optionsPanel.Location.X;
this.balancePanel.Location = loc;

虽然我不推荐上述内容,因为结构理想情况下应该是不可变的。

答案 2 :(得分:8)

使用:

balancePanel.Left = optionsPanel.Location.X

balancePanel.Location = new Point(optionsPanel.Location.X, balancePanel.Location.Y)

请参阅documentation of Location

  

因为Point类是值类型(Visual Basic中的结构,   在Visual C#中的struct,它是按值返回的,意味着访问   property返回控件左上角的副本。所以,   调整从此返回的Point的X或Y属性   属性不会影响Left,Right,Top或Bottom属性   控制的值。要调整这些属性,请设置每个属性   单独使用值,或使用新Point设置Location属性。

答案 3 :(得分:3)

如果以某种方式找不到balancePanel,你可以使用它:

this.Location = new Point(127,283);

anotherObject.Location = new Point(127,283)

答案 4 :(得分:1)

您需要将整个点传递到位置

var point = new Point(50, 100);
this.balancePanel.Location = point;

答案 5 :(得分:0)

当父面板的锁定属性设置为true时,我们无法更改位置属性,并且location属性将在那时只读取。