2009-06-07 1 views
0

У меня есть код для работы, так что, когда я нажимаю кнопку «Добавить больше», он добавляет больше комбинированных боксов в форму с именами dayBox1, dayBox2 и т. Д.Печать данных из динамически добавленных комбинированных ящиков?

Это код, который:

 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; 
    } 

Каков наилучший способ печати выбранного элемента из ящиков, добавленных с событием кнопки?

Как я печатал информацию, которую я хотел файл, прежде чем был, как это (только из одной коробки):

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"); 
      } 
     } 

Я хочу быть в состоянии сделать это для каждого ящика, каждый на новый линия. Итак, это было бы так: День: (текст box1) День: (текст box2) День: (текст box3) и т. Д. Спасибо!

ответ

2

Два пути я вижу сразу, что вы могли бы сделать это:

Первый поддерживать список ссылок на те элементы управления, когда вы добавляете их.

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); 

... 

Тогда ваш метод SaveToFile() будет содержать строку, которая выглядела примерно так:

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"); 
     } 
} 

Второй метод делать, как Mike указал, и ходи список элементов управления ищет для ComboBoxes.

2

Предполагая, что элементы управления живут на форме, пройти через все элементы управления на форме:

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); // ... 
} 

Non-Linq подход:

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

Это немного Hacky полагаться на коллекции Controls , Однако; особенно когда вы начинаете иметь панели и другие группы. Вы можете подумать о добавлении элементов управления в свою собственную коллекцию, как предлагает Джош.

 Смежные вопросы

  • Нет связанных вопросов^_^