2013-06-23 77 views
0

我想基於EventArg pictureBox1.Location.X = e.X;的位置有些事件後設置控件的位置。廣東話設置control.Location.x到argumentEvent e.x

然而,這並不工作,它Cannot Modify expression because it is not a variable。但我的印象是x座標是一個屬性,可以設置。這裏發生了什麼 ?

+0

請參閱[爲什麼是可變結構邪惡?](http://stackoverflow.com/q/441309/11683) – GSerg

回答

2

試試這個:

pictureBox1.Location = new Point(e.X, pictureBox.Location.Y); 

,或者如果你不希望建立一個新的變量:

Point location = pictureBox1.Location; 
location.X = e.X; 
pictureBox1.Location = location; 

這是因爲Point是值類型,因此你不能只需編輯它的一個值,因爲它不會傳播。它的值被存儲,而不是對該值的引用。你不能編輯它,你需要再次構建對象。這可以編譯,但它絕對不會做任何事情,因此編譯器確保不會出現此錯誤。

+0

OP似乎想知道爲什麼不是如何以及另一種解決方案是什麼。 –

+0

@KingKing我已經解釋了爲什麼......你的意思是評論其他答案? –

+0

你可以嘗試聲明一個變量'Point',看看你是否可以改變它的'X'和'Y'? –

2

因爲System.Drawing.Point是值類型,當你調用pictureBox1.Location,你實際上得到Point副本。一個全新的對象被構​​建並填充了pictureBox1.Location的字段。

因此,編譯器試圖保護您免於做一些愚蠢的事情,因爲更改副本的值不會傳播到Location的值。

因此,正如其他答案中所述,您應該構建新的Point並將其分配給Location屬性。

1

有人在這裏談論Point是一種價值型,你不能改變它的XY,這種解釋會讓你很困惑。我在這裏發佈這個答案,以幫助你理解爲什麼你不能改變它的Location。這是因爲LocationProperty返回到Object一個Structure不是一個參考,如果你有一個字段,而不是,你可以改變這種方式,就像這樣:

public class YourControl : BaseControl { 
    public Point Location; 
} 
//Then you can change the Location your way: 
yourControl.Location.X = .... 

然而,正如我所說,LocationProperty返回值類型(結構)的副本,如:

public class YourControl : BaseControl { 
    private Point location; 
    public Point Location { 
     get { 
      return location;//a copy 
     } 
     set { 
      location = value; 
     } 
    } 
} 
//So when you call this: 
yourControl.Location 
//you will get a copy of your Location, and any changes made on this copy won't affect 
//the actual structure, the compiler needs to prevent doing so. 
yourControl.Location.X = ... //Should not be executed... 

這不是Location唯一的情況下,可以在其中是值類型的所有其他屬性發現這個問題。

+0

與上面相同的答案,但更具可讀性和可理解性。 – danShumway