ti-enxame.com

C # Alterar a localização de um objeto programaticamente

Eu tentei o seguinte código: 

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

para alterar a localização de um painel que fiz no modo de design enquanto o programa está em execução, mas retorna um erro: 

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

então pergunta é como eu posso fazer isso?

36
Ahoura Ghotbi

A propriedade Location tem o tipo Point, que é uma estrutura.

Em vez de tentar modificar a Point existente, tente atribuir um novo objeto Point:

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

A localização é uma estrutura. Se não houver membros de conveniência, você precisará reatribuir o local inteiro:

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

A maioria das estruturas também é imutável, mas no caso raro (e confuso) de ser mutável, você também pode copiar, editar, copiar;

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

Embora eu não recomende o acima, uma vez que as estruturas devem idealmente ser imutáveis.

15
Marc Gravell

Use:

balancePanel.Left = optionsPanel.Location.X 

ou

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

Veja a documentação de Location :

Como a classe Point é um tipo de valor (Estrutura no Visual Basic, Struct no Visual C #), ela é retornada por valor, o que significa que acessar a propriedade Retorna uma cópia do ponto superior esquerdo do o controle. Portanto, Ajustar as propriedades X ou Y do ponto retornado dessa propriedade Não afetará os valores da propriedade Left, Right, Top ou Bottom Do controle. Para ajustar essas propriedades, defina cada propriedade Individualmente ou defina a propriedade Location com um novo ponto.

8
shf301

Se de alguma forma o balancePanel não funcionar, você poderia usar isto:

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

ou

anotherObject.Location = new Point(127,283)
2
bagz_man

Você precisa passar o ponto inteiro para o local

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

Quando o painel pai bloqueou a propriedade definida como true, não pudemos alterar a propriedade location e a propriedade location agirá como somente leitura nesse momento.

0
Praveen