2009-04-15 33 views
6

Estoy tratando de obtener un UserControl (que tiene una cuadrícula) 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?No se puede modificar la expresión porque no es una variable

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); 
} 

me trataron

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

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

Información adicional:

estoy usando SetParent() llamada Windows para mover/enfocar un control de usuario a otra forma (ZoomForm). El anclaje no parece funcionar para los controles movidos con SetParent() ... Más precisamente, puede estar funcionando pero tengo problemas de repintado.

que tiene anclaje/Muelle par a trabajar sin problemas de redibujado [Quité el evento de cambio de tamaño y ajusté wireup Dock para Llenar]

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

Actualmente, soy capaz de hacer que el zoom de forma más grande con el código anterior pero no más pequeño.

+0

¿Por qué no utiliza simplemente las propiedades de anclaje en lugar del código para cambiar el tamaño? – recursive

+0

@recursive: estoy usando la llamada a 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 de repintado –

Respuesta

1

No puede cambiar directamente la propiedad Size.Width en un UserControl, porque la propiedad Size es un tipo de valor, por lo que cambiar su ancho sería sobreescribir la propiedad completa Size. En cambio, los controles de Windows Forms proporcionan sus propias propiedades anchura y altura, por lo que este código debería funcionar:

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

Dicho esto, estoy de acuerdo con el comentario de @ recursivo que probablemente debería sólo tiene que utilizar la propiedad del control de usuario Anchor para que sea " automáticamente "cambiar el tamaño.

+0

@Matt: Gracias ... Me deshice de las nuevas asignaciones de Size(). Todavía tengo el mismo problema: puedo hacer que el formulario sea más grande pero no más pequeño :( –

+0

¿Qué evento de Resize está capturando? ¿El evento en un control en el que se sienta el UserControl? ¿Puedes ver el evento Resize en su lugar? –

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

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

4

Como comentario recursivo, debe utilizar la propiedad Anchor.

El error se produce 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.

+0

@danbruc: No es la primera vez que he estado MUY tonto. Gracias de todos modos por la actualización :) –

0

Para la primera parte -

En primer lugar, me gustaría recomendar el uso de la propiedad Anchor de control de usuario en lugar de tratar de usted mismo tamaño.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 this.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.

+0

@Reed: El tamaño sí cambia. UserControl y sus controles secundarios se vuelven más grandes si cambio el tamaño del formulario (hacerlo más grande, eso es). La forma no me dejaría hacerlo más pequeño. –

+0

¿Tiene algo más en su formulario que no sea el UserControl? Si hay otro contenedor en la forma en que está el control del usuario, y configura el control del usuario como "demasiado grande" para el área del cliente, he visto este comportamiento. Es por eso que sugerí cambiar a ClientSize. –

1

Actualmente, puedo ampliar el zoom 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?

+0

@JP: comprobado que ... No parece ser el problema ... Gracias –

Cuestiones relacionadas