2009-04-15 9 views
6

Sto cercando di ottenere un controllo utente (che ha una griglia su di esso) su un Windows Form da ridimensionare. Il codice seguente è quello che ho nel modulo. Il comportamento che sto ottenendo è che il controllo viene ridimensionato quando lo faccio grande. Ma non si restringe. Cosa sto facendo di sbagliato (o) Cosa mi manca?Impossibile modificare l'espressione perché non è una variabile

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

Ora il controllo utente ha il seguente codice:

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

ho cercato

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

Mi dà "Non è possibile modificare l'espressione, perché non è una variabile" errore. .. Cosa mi sto perdendo?

Informazione supplementare:

sto usando SetParent() di Windows chiamata a spostare/ingrandire un UserControl a un altro modulo (ZoomForm). L'ancoraggio sembra non funzionare per i controlli spostati con SetParent() ... Più precisamente, potrebbe funzionare ma ho dei problemi di riverniciatura.

ho avuto paio di ancoraggio/Dock di lavorare senza problemi ridipingere [ho rimosso il wireup evento resize e regolato Dock per Fill]

Lo ZoomForm ha inizialmente controlli. Usercontrol viene aggiunto a ParentForm in modo dinamico.

Attualmente, sono in grado di ingrandire il formato con il codice sopra ma non più piccolo.

+0

Perché non utilizzare le proprietà di ancoraggio anziché il codice per ridimensionare? – recursive

+0

@recursive: sto utilizzando la chiamata Windows SetParent() per spostare/ingrandire un controllo utente su un altro modulo (ZoomForm). L'ancoraggio non sembra funzionare per i controlli spostati con SetParent() ... Più precisamente, potrebbe funzionare ma ho problemi di riverniciatura –

risposta

1

Non è possibile modificare direttamente la struttura Size.Width su un controllo utente, perché la proprietà Size è un tipo di valore, in modo da cambiare la sua larghezza dovrebbe essere essenzialmente sovrascrivere completamente Size struttura. Invece, i controlli in WinForms forniscono le loro proprietà Larghezza e Altezza, quindi questo codice dovrebbe funzionare:

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

Detto questo, sono d'accordo con un commento di @ ricorsivo che probabilmente si dovrebbe semplicemente usare la proprietà del UserControl Anchor per renderlo " automaticamente "ridimensiona.

+0

@Matt: Grazie ... mi sono sbarazzato dei nuovi incarichi Size(). Ho ancora lo stesso problema: posso rendere il modulo più grande ma non più piccolo :( –

+0

Quale evento Resize stai prendendo? L'evento su un controllo su cui si trova l'UserControl? Puoi invece prendere l'evento Resize del modulo? –

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

Quel codice restituisce l'errore perché Dimensione è un tipo di valore, non un tipo di riferimento. La lettura di questo http://www.yoda.arachsys.com/csharp/parameters.html può aiutare a spiegare la differenza tra tipi di valore e tipi di riferimento.

4

Come commento ricorsivo, è sufficiente utilizzare la proprietà Anchor.

L'errore si verifica perché la proprietà Size espone una struttura e non un tipo di riferimento. La proprietà Size restituisce una copia dell'oggetto dimensione del controllo. Scrivere sulle proprietà Width e Hight di questa copia non ha senso perché è solo una copia temporanea e non è supportata dalla memoria in nessun luogo.

+0

@danbruc: Non è la prima volta che sono stato stupido SOOO.Grazie comunque per l'aggiornamento :) –

0

Per la prima porzione -

Prima di tutto, mi consiglia di utilizzare la proprietà Anchor sulla UserControl invece di cercare di dimensioni da soli.Funziona in modo molto semplice e molto affidabile per gestire il ridimensionamento delle finestre.

Se si desidera eseguire questa operazione, si dovrebbe probabilmente cercare di separare questo.ClientSize anziché this.Height e this.Width. Probabilmente stai impostando il tuo controllo troppo grande, e questo è il non-apprendimento del pannello o di altre cose su cui sei seduto, il che causa tutti i tipi di problemi.

La seconda parte è dovuta al fatto che gridNameValue Properties.Size.Width è un membro di una struct.

Quando si chiama gridNameValueProperties.Size, si restituisce una struttura Size, quindi si tenta di impostare la larghezza sulla struttura restituita (non sull'originale). Questo è il motivo per cui è necessario impostare l'intero tipo di valore Size in un colpo solo. Creare un nuovo Size() e impostarlo su gridNameValueProperties.Size è l'unico modo per farlo funzionare.

+0

@Reed: le dimensioni cambiano. UserControl e i relativi controlli figlio diventano più grandi se ridimensiono il modulo (ingrandirlo, ovvero). Il modulo non mi permetterebbe di renderlo più piccolo però. –

+0

Avete altro sul vostro modulo oltre a UserControl? Se c'è un altro contenitore nel modulo in cui si trova il controllo utente e si imposta il controllo utente "troppo grande" per l'area client hte, ho visto questo comportamento. Ecco perché ho suggerito di passare a ClientSize. –

1

Attualmente, sono in grado di ingrandire il modulo di ingrandimento con il codice sopra ma non di dimensioni inferiori.

Alcuni controlli dispongono di una proprietà MinSize (o simile). Hai qualcuno di questi set in modo tale che non puoi ridimensionare più piccolo?

+0

@JP: verificato che ... non sembra essere il problema ... Grazie –

Problemi correlati