2010-05-04 2 views
15

J'ai un tablelayoutpanel. 2x2 - 2 colonnes 2 rangées.Modifier l'étendue de ligne/colonne par programme (tablelayoutpanel)

Par exemple, j'ai ajouté un bouton button1 dans une 1ère ligne, deuxième colonne. Le bouton 1 possède une propriété Dock définie sur Remplir. VS Designer permet de définir les propriétés de l'intervalle de colonnes/lignes de button1.

Je veux une disponibilité pour changer la propriété de la largeur de ligne de button1 par programmation, de sorte qu'il peut remplir tous seconde colonne (1 rangée et la deuxième rangée) et de la disponibilité pour le mettre en arrière.

Comment?

Répondre

25

Qu'en est-il de ce code?

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

code génial. Visual Studio Designer m'a induit en erreur. Je regardais dans les propriétés button1, essayait de lancer le bouton1 à l'élément toolstippanel et ainsi de suite ... merci! –

+0

si vous aviez regardé Form.Designer.cs au lieu de concepteur visuel vous avez trouvé la solution directement. ;-) – Oliver

+1

Je sais que c'est un ancien article, mais je tiens à souligner que vous n'avez pas besoin de faire les "conditions yoda" en C# car si les instructions sont fortement typées. (Et je crois que si vous faites une erreur avec les booléens et que vous placez une assignation au lieu d'une comparaison, cela génère un avertissement du compilateur, par opposition à l'erreur qu'il génère avec tout autre type.) – MiffTheFox

2

Bien que je trouve la réponse actuellement votée tout à fait adéquate, elle semble aussi légèrement plus désordonnée que nécessaire. Vous devez ajouter les contrôles à tableLayoutPanel avant de définir leurs propriétés. Visual Studio (2013 et probablement d'autres versions) affichera ces propriétés dans le cadre du contrôle

Quand en réalité, ils font partie de la table LayoutPanel.

Explication:

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

Exemple:

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

Résultat: un bouton qui 'occupe' cet espace. (A condition qu'elle soit suffisamment grande pour couvrir la zone. Même si elle ne « couvrir » l'espace, il sera toujours « réserve » il.)

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 

Réglage de la durée plus grande que la taille de la grille. .: Ne changez pas la taille de la grille. NOT recadrer/modifier le nombre à la taille de la grille. Ne pas jeter une erreur lors de la compilation.

Il va agir comme si la plage était définie sur la taille maximale de la grille actuelle (tableLayoutPanel). Ceci n'est pertinent que si la taille TLP/grille change.

Si vous ajoutez deux contrôles deux le même emplacement de grille par programme, le premier contrôle dans une grille conserve son emplacement. Tout contrôle ajouté par la suite est poussé vers le bloc de cellules suivant. Si un 'span' est ajouté, il traitera ce bloc de cellules tel qu'il est utilisé et continuera de rechercher un bloc de cellules inutilisé.

Ex: label1, label2 et label3 sont ajoutés à 0,0.

  • label1 apparaîtra dans 0,0
  • label2: 0,1
  • label3: 0,2

Ex 2: l'étiquette 1 a une largeur de ligne de 2.

  • label1: 0,0
  • label2: relocalisé à 0,2
  • label3: 0,3

Après avoir sélectionné le point de grille correcte et portées, vous pouvez alors plus optimisez votre mise en page en utilisant les propriétés du dock et de l'ancre.

Questions connexes