variable usa tipo referencia que por pero pasar parametros parametro objetos metodos locales las inicializar implícito deben con como clases c# winforms user-controls

c# - usa - No se puede modificar la expresión porque no es una variable



variable local c# (5)

Estoy tratando de obtener un UserControl (que tiene una grilla) en un Formulario de Windows para cambiar el tamaño. El siguiente código es lo que tengo en el formulario. El comportamiento que obtengo es que el control se redimensiona cuando lo hago grande. Pero no se encoge. ¿Qué estoy haciendo mal? (O) ¿Qué me estoy perdiendo?

private void AdjustGrid() { ZoomControl.Location = new Point(5, 5); ZoomControl.Size = new Size(this.Width - 15, this.Height - 75); } void zoomform_Resize(object sender, EventArgs e) { AdjustGrid(); }

Ahora el control de usuario tiene el siguiente código:

//Resize the grid that the UserControl has on it private void NameValuePropertyBag_Resize(object sender, EventArgs e) { grdNameValueProperties.Location = new Point(4,4); grdNameValueProperties.Size = new Size(this.Width - 8, this.Height - 8); }

Lo intenté

grdNameValueProperties.Size.Width = this.Width - 8; grdNameValueProperties.Size.Height = this.Height -8;

Me da el error "No se puede modificar la expresión porque no es una variable" ... ¿Qué me estoy perdiendo?

Información adicional:

Estoy usando la llamada de Windows de SetParent () para mover / acercar un UserControl a otro Formulario (ZoomForm). El anclaje no parece funcionar para los controles movidos con SetParent () ... Más precisamente, puede estar funcionando, pero tengo problemas para volver a pintar.

Hice que el par Anchor / Dock funcionara sin problemas de repintado [Eliminé el cableado del evento de cambio de tamaño y ajusté Dock to Fill]

El ZoomForm inicialmente no tiene controles. Usercontrol se agrega a ParentForm dinámicamente.

Actualmente, puedo hacer que el zoom sea más grande con el código anterior pero no más pequeño.


Como comentario recursivo, solo debes usar la propiedad Anchor.

El error ocurre porque la propiedad Tamaño expone una estructura y no un tipo de referencia. La propiedad Tamaño devuelve una copia del objeto de tamaño del control. Escribir en las propiedades Ancho y alto de esta copia no tiene sentido porque es solo una copia temporal y no está respaldada por memoria en ninguna parte.


No se puede cambiar directamente la propiedad Size.Width en un UserControl, porque la propiedad Size es un tipo de valor, por lo que al cambiar su ancho se sobrescribirá esencialmente la propiedad Size completa. En cambio, los controles en WinForms proporcionan sus propias propiedades de ancho y alto, por lo que este código debería funcionar:

grdNameValueProperties.Width = this.Width - 8; grdNameValueProperties.Height = this.Height - 8;

Una vez dicho esto, estoy de acuerdo con el comentario de @recursive de que probablemente solo deberías usar la propiedad Anchor de UserControl para que cambie el tamaño "automáticamente".


Para la primera porción -

En primer lugar, recomendaría usar la propiedad Anchor en UserControl en lugar de tratar de dimensionar esto usted mismo. Funciona de manera muy simple y confiable para manejar el cambio de tamaño de ventana.

Si desea hacer esto, probablemente debería considerar encadenar este .ClientSize en lugar de this.Height y this.Width. Probablemente esté configurando su control demasiado grande, y eso está desacoplando el panel u otra cosa en la que está sentado, lo que causa todo tipo de problemas.

La segunda parte se debe al hecho de que gridNameValue Properties.Size.Width es un miembro de una estructura.

Cuando llama a gridNameValueProperties.Size, está devolviendo una estructura de tamaño y luego intenta establecer el ancho en la estructura devuelta (no el original). Es por eso que necesita establecer todo el tipo de valor de Tamaño en una sola toma. Crear un nuevo Tamaño () y configurarlo en gridNameValueProperties.Size es la única forma de hacerlo funcionar.


Actualmente, puedo hacer que el zoom sea más grande con el código anterior pero no más pequeño.

Algunos controles tienen una propiedad MinSize (o similar) en ellos. ¿Tiene alguno de esos conjuntos tal que no puede cambiar el tamaño de menor?


grdNameValueProperties.Size.Width = this.Width - 8; grdNameValueProperties.Size.Height = this.Height -8;

Ese código proporciona el error porque Size es un tipo de valor, no un tipo de referencia. Leer este http://www.yoda.arachsys.com/csharp/parameters.html puede ayudar a explicar la diferencia entre los tipos de valores y los tipos de referencia.