Pourquoi seul le premier RadioButton est-il ajouté à GroupBox?

J’essaie de créer dynamicment des contrôles Windows et de les append à un panneau. Pour Button et Checkbox, cela a bien fonctionné. J’ai eu un problème avec une GroupBox, cependant, avec RadioButtons à l’intérieur.

Le premier élément RadioButton est créé et ajouté à GroupBox à l’emplacement prévu, mais les éléments suivants, bien que créés de manière ostensible (le fait de passer par le code donnent l’impression que cela est le cas), ne sont pas visibles.

Je penserais que si les radio-boutons ultérieurs étaient placés au-dessus des précédents, le dernier serait celui vu. Voici à quoi ça ressemble:

entrez la description de l'image ici

Chaque valeur délimitée par ~ devrait être la valeur de texte d’un bouton radio, mais un seul s’affiche. Dois-je spécifier explicitement les valeurs de localisation pour les radio-boutons suivants ou pourquoi cela échoue-t-il?

Voici le code:

private GroupBox getGroupBox(ssortingng currentSettings, int curLeftVal) { // "apple~orange~peach~True (must look for "enclose group in a black box" as the last val (ignore for the quick-and-dirty mockup, though)) List grpbxVals = new List(currentSettings.Split('~')); GroupBox gb = new GroupBox(); gb.Height = 60; gb.Location = new Point(curLeftVal, PANEL_TOP_LOC); RadioButton radbtn = null; // "-1" because we're ignoring the final bool ("enclose in black box") for (int i = 0; i < grpbxVals.Count-1; i++) { radbtn = new RadioButton(); radbtn.Text = grpbxVals[i]; gb.Controls.Add(radbtn); } return gb; } 

METTRE À JOUR

L’idée dans la réponse ci-dessous de Pierre semble raisonnable, mais ce n’est pas encore tout à fait ce que le médecin a prescrit:

entrez la description de l'image ici

MISE À JOUR 2

Cela fonctionne plutôt bien (modification du code de Pierre):

 IList grpbxVals = new List(currentSettings.Split('~')); GroupBox gb = new GroupBox { Height = 60, Location = new Point(curLeftVal, 0) }; int radButtonPosition = 0; for (int i = 0; i < grpbxVals.Count() - 1; i++) { gb.Controls.Add(new RadioButton { Text = grpbxVals[i], Location = new Point(curLeftVal, radButtonPosition) }); radButtonPosition += new RadioButton().Height - 4; // the "-4" is a kludge } return gb; 

Donne moi:

entrez la description de l'image ici

Si vous définissez un point d’arrêt, vous verrez que votre zone de groupe contient tous les boutons radio. Leur emplacement est en effet identique, ils sont donc affichés les uns au dessus des autres. Le problème n’est pas de tous les append à la zone de groupe, mais de les afficher tous.

Pour ce faire, il suffit d’incrémenter leur emplacement à chaque opération d’ajout pour les afficher tous:

 private GroupBox getGroupBox(ssortingng currentSettings, int curLeftVal) { // "apple~orange~peach~True (must look for "enclose group in a black box" as the last val (ignore for the quick-and-dirty mockup, though)) List grpbxVals = new List(currentSettings.Split('~')); GroupBox gb = new GroupBox(); gb.Height = 60; gb.Location = new Point(curLeftVal, PANEL_TOP_LOC); RadioButton radbtn = null; // "-1" because we're ignoring the final bool ("enclose in black box") int radButtonPosition = PANEL_TOP_LOC; for (int i = 0; i < grpbxVals.Count - 1; i++) { radbtn = new RadioButton(); radbtn.Text = grpbxVals[i]; radbtn.Location = new Point(curLeftVal, radButtonPosition ); radButtonPosition += radbtn.Height; gb.Controls.Add(radbtn); } return gb; } 

Je radButtonPosition une variable appelée radButtonPosition et l'initialise à la position de votre groupe. Je règle ensuite l'emplacement du bouton radio en fonction de celui-ci, puis radButtonPosition simplement le radButtonPosition de la hauteur d'un bouton radio à chaque ajout.

Voici aussi une petite version refactorisée:

 private GroupBox CreateGroupboxWithRadiobuttons(ssortingng currentSettings, int curLeftVal) { IList grpbxVals = new List(currentSettings.Split('~')); GroupBox gb = new GroupBox { Height = 60, Location = new Point(curLeftVal, PANEL_TOP_LOC) }; int radButtonPosition = PANEL_TOP_LOC; for (int i = 0; i < grpbxVals.Count() - 1; i++) { gb.Controls.Add(new RadioButton {Text = grpbxVals[i], Location = new Point(curLeftVal, radButtonPosition)}); radButtonPosition += new RadioButton().Height; } return gb; } 

Bien sûr, il y a BEAUCOUP d'extraction de méthode à faire pour respecter la SRP, mais c'est un début.

Tous les articles sont un emplacement 0,0 Essayez ceci

 int y=20; for (int i = 0; i < grpbxVals.Count-1; i++) { radbtn = new RadioButton(); radbtn.Text = grpbxVals[i]; radbtn.Location=new System.Drawing.Point(6, y); y+=radbtn.Height; gb.Controls.Add(radbtn); radbtn = null; } 

Vous pouvez également insérer un FlowLayoutPanel dans le GroupBox, puis append le RadioButton au FlowLayoutPanel, pour un placement automatique des composants.