2009-06-07 7 views
0

J'ai obtenu le code à travailler de sorte que lorsque j'appuie sur le bouton, "Ajouter plus", il ajoute plus de zones de liste déroulante au formulaire avec les noms dayBox1, dayBox2 et ainsi de suite.Impression de données à partir de zones de liste déroulante ajoutées dynamiquement?

C'est le code pour que:

 private void addMoreBtn_Click(object sender, EventArgs e) 
    { 
     //Keep track of how many dayBoxes we have 
     howMany++; 

     //Make a new instance of ComboBox 
     ComboBox dayBox = new System.Windows.Forms.ComboBox(); 

     //Make a new instance of Point to set the location 
     dayBox.Location = new System.Drawing.Point(Left, Top); 
     dayBox.Left = 13; 
     dayBox.Top = 75 + dayLastTop; 

     //Set the name of the box to dayBoxWhateverNumberBoxItIs 
     dayBox.Name = "dayBox" + howMany.ToString(); 

     //The TabIndex = the number of the box 
     dayBox.TabIndex = howMany; 

     //Make it visible 
     dayBox.Visible = true; 

     //Set the default text 
     dayBox.Text = "Pick One"; 

     //Copy the items of the original dayBox to the new dayBox 
     for (int i = 0; i < dayBoxO.Items.Count; i++) 
     { 
      dayBox.Items.Add(dayBoxO.Items[i]); 
     } 

     //Add the control to the form 
     this.Controls.Add(dayBox); 

     //The location of the last box's top with padding 
     dayLastTop = dayBox.Top - 49; 
    } 

Quelle est la meilleure façon d'imprimer le membre sélectionné des boîtes ajoutés à l'événement bouton?

La façon dont j'imprimais les informations que je voulais un fichier avant était comme celui-ci (d'une seule case):

public void saveToFile() 
     {  
      FileInfo t = new FileInfo("Workout Log.txt"); 
      StreamWriter Tex = t.CreateText(); 
      Tex.WriteLine("---------------Workout Buddy Log---------------"); 
      Tex.WriteLine("------------------- " + DateTime.Now.ToShortDateString() + " ------------------"); 
      Tex.Write(Tex.NewLine); 
      if (dayBoxO.Text != "Pick One") 
      { 
       Tex.WriteLine("Day: " + dayBoxO.Text); 
      } 
      else 
      { 
       Tex.WriteLine("Day: N/A"); 
      } 
     } 

Je veux être en mesure de le faire pour chaque boîte, chacun sur une nouvelle ligne. Donc, ce serait comme: Jour: (le texte de la boîte 1) Jour: (le texte de la boîte2) Jour: (le texte de la boîte 3) et ainsi de suite ... Merci!

Répondre

2

Deux façons je vois tout de suite que vous pourriez faire ceci:

La première consiste à maintenir une liste de références à ces contrôles lorsque vous les ajoutez.

private List<ComboBox> _comboBoxList = new List<ComboBox>(); 

... 

//Make a new instance of ComboBox 
ComboBox dayBox = new System.Windows.Forms.ComboBox(); 

//Add your combobox to the master list 
_comboBoxList.Add(dayBox); 

... 

Ensuite, votre méthode SaveToFile() contiendrait une ligne qui avait l'air quelque chose comme ceci:

foreach(var box in _comboBoxList) 
{ 
     Tex.Write(Tex.NewLine); 
     if (box.Text != "Pick One") 
     { 
      Tex.WriteLine("Day: " + box.Text); 
     } 
     else 
     { 
      Tex.WriteLine("Day: N/A"); 
     } 
} 

La deuxième méthode consiste à faire comme Mike a souligné et marcher la liste des contrôles à la recherche de vos ComboBoxes.

2

En supposant que les contrôles en direct sur la forme, marcher à travers tous les contrôles du formulaire:

var boxes = from Control c in this.Controls 
      where c.GetType() == typeof(System.Windows.Forms.ComboBox) 
      select c; 

StringBuilder sb = new StringBuilder(); 
foreach (Control c in boxes) 
{ 
    sb.AppendLine(c.Text); // ... 
} 

approche non-Linq:

StringBuilder sb = new StringBuilder(); 
foreach (Control c in this.Controls) 
{ 
    if (c.GetType() == typeof(System.Windows.Forms.ComboBox)) 
    { 
     sb.AppendLine(c.Text); // ... 
    } 
} 

Il est un peu hacky compter sur la collection Controls , toutefois; surtout quand vous commencez à avoir des panneaux et d'autres groupements. Vous pourriez envisager d'ajouter les contrôles à votre propre collection, comme le suggère Josh.

Questions connexes