2010-05-04 19 views
15

Ho un tablelayoutpanel. 2x2 - 2 colonne 2 righe.Cambia span di riga/colonna in modo programmatico (tablelayoutpanel)

Ad esempio, ho aggiunto un pulsante button1 in una 1 riga, seconda colonna. button1 ha una proprietà dock impostata su Fill. VS Designer consente di impostare le proprietà di estensione colonna/riga del pulsante .

Voglio una disponibilità a modifiche arco fila di button1programatically, in modo che possa riempire tutto seconda colonna (1 riga e nella seconda riga) e la disponibilità di impostare indietro.

Come?

risposta

25

Che dire di questo codice?

private void button1_Click(object sender, EventArgs e) 
{ 
    var control = sender as Control; 

    if(control == null) 
     return; 

    if (1 == tableLayoutPanel1.GetRowSpan(control)) 
    { 
     tableLayoutPanel1.SetRowSpan(control, 2); 
    } 
    else 
    { 
     tableLayoutPanel1.SetRowSpan(control, 1); 
    } 
} 
+1

ottimo codice. Visual Studio Designer mi induce in errore. Stavo cercando nelle proprietà button1, stavo cercando di lanciare button1 su toolstippanel item e così via ... grazie! –

+0

se si è cercato in Form.Designer.cs anziché in visual designer, la soluzione è stata trovata direttamente. ;-) – Oliver

+1

So che è un vecchio post, ma vorrei sottolineare che non è necessario eseguire le "condizioni yoda" in C# poiché se le istruzioni sono fortemente digitate. (E credo che se si commette un errore con i booleani e si metta un compito invece di un confronto, si genera un avvertimento del compilatore, a differenza dell'errore che genera con qualsiasi altro tipo.) – MiffTheFox

2

Mentre trovo l'attuale risposta up-votato del tutto adeguato, sembra anche un po 'di Messier del necessario. È necessario aggiungere i controlli al tableLayoutPanel prima di impostarne le proprietà.

Visual Studio (2013 e probabilmente altre versioni) mostreranno queste proprietà come parte del controllo. Quando in realtà, fanno parte del tableLayoutPanel.

Spiegazione:

tableLayoutPanel.Controls.Add(**control**, x, y) 
tableLayoutPanel.SetColumnSpan(**control**, '# of cols to span') 

Esempio:

tableLayoutPanel1.Controls.Add(**button1**, 0, 0); 
tableLayoutPanel1.SetColumnSpan(**button1**, 2); 
tableLayoutPanel1.SetRowSpan(**button1**, 3); 

Risultato: un pulsante che 'occupa' questo spazio. (A condizione che sia abbastanza grande da coprire l'area. Anche se non si 'copertura' lo spazio, sarà ancora 'riserva' di esso.)

O O X X X 
O O X X X 
O O X X X 
X X X X X 
X X X X X 

Impostazione della durata di più grande della dimensione della griglia sarà. .: NON modifica la dimensione della griglia. NON ritagliare/modificare il numero alla dimensione della griglia. NON lanciare un errore durante la compilazione.

Esso agirà/eseguirà come se lo span fosse impostato sulla dimensione massima della griglia corrente (tableLayoutPanel). Ciò è rilevante solo se cambia la dimensione TLP/griglia.

Se si aggiungono due controlli due la stessa posizione della griglia a livello di programmazione, il primo controllo in una griglia mantiene la sua posizione. Qualsiasi controllo aggiunto successivamente viene trasferito al blocco successivo. Se viene aggiunto uno "span", tratterà quel blocco di celle come usato e continuerà a cercare un blocco di celle inutilizzato.

Es: label1, etichetta2 e Label3 vengono aggiunti a 0,0.

  • label1 apparirà 0,0
  • label2: 0,1
  • Label3: 0,2

Es 2: etichetta 1 ha una durata di fila di 2.

  • label1: 0,0
  • label2: trasferito a 0,2
  • Label3: 0,3

Dopo aver selezionato il punto della griglia corretta e campate, è possibile poi ulteriormente ottimizzare il layout utilizzando le proprietà dock e di ancoraggio.

Problemi correlati