2009-01-11 6 views
0
 for (int i = 0; i < 200; i++) 
     { 

      Control control = new Control(); 

      control = new CheckBox(); 
      Size size = control.Size; 
      Point point = new Point(20, 22); 
      control.Location = point; 
      int width = size.Width + 5; 
      i += width; 
      list.Add(control); 
     } 

foreach(Control c in list) 
{ 

} 

Comment créer une nouvelle instance de case à cocher? Parce que de cette façon, je reçois une seule case à chaque fois. Je veux avoir trois cases à cocher dans chaque rangée.Création dynamique de contrôle

+0

Pourriez-vous inclure où vous définissez « la liste ». Il est difficile de comprendre vos intentions sans voir de quel type est la liste. –

+0

Liste liste = nouvelle Liste ; –

Répondre

3

Est-ce winforms? Un premier point: vous n'avez pas besoin new Control() chaque fois (vous défaussez simly toute façon lorsque vous new CheckBox() exactement comment voulez-vous la mise en page apparaisse Pouvez-vous décrire un peu plus s'il vous plaît

J'imagine TableLayoutPanel pourrait.? un début raisonnable ...

[STAThread] 
static void Main() { 
    Application.EnableVisualStyles(); 
    Form form = new Form(); 
    TableLayoutPanel layout = new TableLayoutPanel(); 
    layout.Dock = DockStyle.Fill; 
    form.Controls.Add(layout); 
    layout.AutoScroll = true; 
    layout.ColumnCount = 3; 
    // size the columns (choice just to show options, not to be pretty) 
    layout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 200)); 
    layout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50)); 
    layout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));  
    layout.GrowStyle = TableLayoutPanelGrowStyle.AddRows; 
    for (int i = 0; i < 200; i++) 
    { 
     CheckBox chk = new CheckBox(); 
     chk.Text = "item " + i; 
     layout.Controls.Add(chk); 
    } 

    Application.Run(form); 
} 

Sinon, vous devrez définir manuellement les Location (ou Top et Left) de chacun;. pas simple

+0

En fait, je veux avoir une rangée de trois cases à cocher ou une rangée de 3 étiquettes en fonction de l'utilisateur dynamiquement en Winform. –

+0

(oh, et définissez 'layout.AutoScroll = true;') –

+0

Comment définir la largeur de la colonne? –

0

Instantiate 3 nouvelles cases à cocher dans votre corps de la boucle, définir leurs propriétés en fonction ly et ajouter chacun d'eux à la liste. Une fois le code ci-dessus complété, vous aurez 600 cases à cocher.

liste.Add (Control1);

liste.Ajouter (Contrôle2);

liste.Ajouter (Contrôle3);

1

On dirait que vous obtenez vos 200 instances, toutes placées au même point.

+0

Il ne fait pas cela. Il modifie 'i' dans la boucle. Il ajoute la taille du contrôle + 5 à celui-ci. Je ne sais pas quelle est la taille d'une case à cocher, mais il va probablement ajouter 10 itérations, donc quelque chose comme 20 instances. –

+0

True. Il ne reste donc plus qu'à ajouter i à l'une des coordonnées du point. –

0

Je ne suis pas sûr de ce que vous essayez de faire, mais je nettoyais votre code un peu:

for (int i = 0; i < 200; i++) 
{ 

    Control control = new CheckBox(); 

    control.Location = new Point(20, 22); 
    i += control.Size.Width + 5; 

    list.Add(control); 
} 

Vous ne devez pas ajouter une nouvelle instance à la liste si vous voulez ajouter le contrôle que vous juste fait.

aussi:

Control control = new Control(); 
control = new CheckBox(); 

est un peu redondant. De plus, pour ne pas avoir un contrôle au même endroit plusieurs fois, vous devez modifier le point. Espérons que cela aide

+0

et vous auriez 200 contrôles tous empilés les uns sur les autres - en ajoutant i pour contrôler.Lieu à chaque fois aiderait :) – gbjbaanb

+0

citation: "Aussi pour ne pas obtenir un contrôle au même endroit plusieurs fois vous devez modifier le point" –

+0

et la boucle ne crée pas 200 contrôles, regardez mon commentaire sur http: // stackoverflow .com/questions/433833/dynamic-creation-of-control # 433841 –

2

Votre code a des problèmes. Travaillons à partir d'un exemple de code plutôt que d'une leçon. Je vais d'abord créer un panneau, sympa si vous voulez enlever les cases que vous avez créées. Vous seriez probablement intéressé par l'utilisateur en cliquant sur une case à cocher afin d'ajouter un événement pour cela. Démarrez un nouveau projet WF et déposez un bouton sur le formulaire. Double-cliquez dessus, puis collez ce code:

private void button1_Click(object sender, EventArgs e) { 
    // Give the 3 checkboxes a decent spacing 
    int height = this.Font.Height * 3/2; 
    // Create the panel first, add it to the form 
    Panel pnl = new Panel(); 
    pnl.Size = new Size(100, 3 * height); 
    pnl.Location = new Point(10, 5); 
    this.Controls.Add(pnl); 
    // Make three checkboxes now 
    for (int ix = 0; ix < 3; ++ix) { 
    CheckBox box = new CheckBox(); 
    box.Size = new Size(100, height); 
    // As pointed out, avoid overlapping them 
    box.Location = new Point(0, ix * height); 
    box.Text = "Option #" + (ix + 1).ToString(); 
    box.Tag = ix; 
    // We want to know when the user checked it 
    box.CheckedChanged += new EventHandler(box_CheckedChanged); 
    // The panel is the container 
    pnl.Controls.Add(box); 
    } 
} 

void box_CheckedChanged(object sender, EventArgs e) { 
    // "sender" tells you which checkbox was checked 
    CheckBox box = sender as CheckBox; 
    // I used the Tag property to store contextual info, just the index here 
    int index = (int)box.Tag; 
    // Do something more interesting here... 
    if (box.Checked) { 
    MessageBox.Show(string.Format("You checked option #{0}", index + 1)); 
    } 
}