2017-02-22 54 views
1

Есть ли способ добавить значения в список, итерации? У меня есть форма со всеми объявленными переменными и класс для сбора всей информации. Но я пытаюсь изучить способ добавить все это через код, а не столько повторить код.C# Добавить переменную в список с помощью итерирующего имени

namespace WinForm 

{

public partial class Form_Destrezas : Form 
{ 
    //Fields 
    Tab_Destreza Personales; 
    Tab_Destreza Salud; 
    Tab_Destreza Participacion; 
    Tab_Destreza Convivencia; 
    Tab_Destreza Limpieza; 
    Tab_Destreza Alimentos; 
    Tab_Destreza Ropa; 
    Tab_Destreza Libre; 
    Tab_Destreza Futuro; 


    public Form_Destrezas() 
    { 
     Personales.AddRow(Personales_1RowNoApp, 
          Personales_1RowNoDom, 
          Personales_1RowEnPro, 
          Personales_1RowDomina, 
          Personales_1RowCheckBox) 

    //What I want to do 
     for (int i = 0; i <= 10; i++) 
     { 
      Personales.AddRow(Personales_[i]RowNoApp, 
          Personales_[i]RowNoDom, 
          Personales_[i]RowEnPro, 
          Personales_[i]RowDomina, 
          Personales_[i]RowCheckBox) 
     } 


     this.Text = $"Destrezas - {StudentData.Name}"; 
     InitializeComponent(); 
    } 


    private void Personales_1RowNoDom_CheckedChanged(object sender, EventArgs e) 
    { 
     Personales.checkRow(); 
    } 
} 


/// <summary> 
/// Data for each row will be collected here. 
/// </summary> 
public class RowData 
{ 
    //Fields 
    public List<RadioButton> RadioButtons; 
    public CheckBox TeacherVerified; 
    public string ActiveStatus = "No Applica"; 
    public bool verified = false; 

    //Methods 

    /// <summary> 
    /// Input row information collection. 
    /// </summary> 
    /// <param name="noApp">Radiobutton "No Applica" for Row.</param> 
    /// <param name="noDom">Radiobutton "No Domina" for Row.</param> 
    /// <param name="enProc">Radiobutton "En Processo" for Row.</param> 
    /// <param name="domina">Radiobutton "Domina" for Row.</param> 
    /// <param name="EviMaestro">CheckBox if was verified.</param> 
    public void AddRow(RadioButton noApp, RadioButton noDom, RadioButton enProc, 
     RadioButton domina, CheckBox EviMaestro) 
    { 
     var personalesRows = this.GetType().GetTypeInfo(); 
     RadioButtons.Add(noApp); 
     RadioButtons.Add(noDom); 
     RadioButtons.Add(enProc); 
     RadioButtons.Add(domina); 
     TeacherVerified = EviMaestro; 
     checkRow(); 

    } 
    /// <summary> 
    /// Collects Data from row. 
    /// </summary> 
    public void checkRow() 
    { 

     foreach (var Button in RadioButtons) 
     { 

      if (Button.Checked) 
      { 
       ActiveStatus = Button.Text; 
      } 
     } 
     if (TeacherVerified.Checked == true) 
     { 
      verified = TeacherVerified.Checked; 
     } 
    } 


} 

public class Tab_Destreza : RowData 
{ 



} 

}

+2

'for (int i = 1; i == 10; i ++)' Вы имеете в виду 'for (int i = 1; i <= 10; i ++)'? –

+0

Да! Но в итоге у меня есть все эти переменные, объявленные в WinForm. То, что я пытаюсь сделать, это добавить их в класс для легкого доступа. – Deovi

+0

Вам нужно использовать отражение – Sparrow

ответ

0

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

var personalesRowMaps = this.GetType().GetTypeInfo().GetFields(BindingFlags.Instance | BindingFlags.NonPublic) 
     .Where(f => f.Name.StartsWith("Personales_")) 
     // f.Name.Split(...) part explained: each field has an underscore, 
     // where the next character after it is the row index. Thus, 
     // I split the name using the underscore and I get the right part 
     // of the field identifier, and then I get the first character of 
     // that part: the row index. 
     .Select(f => new { Index = f.Name.Split('_')[1][0], Field = f }) 
     .GroupBy(o => o.Index) 
     .Select(g => g.ToList().ToDictionary(o => o.Field.Name, o => o.Field.GetValue(this))); 

Шаг за шагом:

  1. Мы получаем все поля от текущего class.
  2. Отфильтровываем все поля, чтобы мы могли работать с префиксами "Personales_".
  3. Спроектирует каждое найденное поле в объект двух свойств: (1) мы извлечь число (индекс) строки, к которой поле принадлежит (т.е. Personales_ XXX) (2) отражение поля класса.
  4. Мы все поля группы по извлеченному индексу строки
  5. Мы проецировать каждые результирующий индекс строки, сгруппированные поля в словарь, где ключи являются именами полого и ЗНАЧЕНИЕМ значения полого.

После того, как вы построили эту карту, добавление целых строк - простая задача. Вам просто нужно повторять каждый словарь и добавить каждое поле к Personales, где индекс строки будет индекс цикла for:

for(int i = 0; i < personalRowMaps.Count; i++) 
{ 
    var rowMap = personalRowMaps[i]; 

    Personales.AddRow 
    (
     rowMap[$"Personales_{i}RowNoApp"], 
     rowMap[$"Personales_{i}RowNoDom"], 
     rowMap[$"Personales_{i}RowEnPro"], 
     rowMap[$"Personales_{i}RowDomina"], 
     rowMap[$"Personales_{i}RowCheckBox"] 
    ); 
} 

Примечание:

  • Вам нужно уточнить, являются ли поля класса private, protected или public. На данный момент я думаю, что они private (см. Флаги привязки в запросе LINQ). Прокомментируйте, какие модификаторы доступа имеют эти поля классов.
  • Кроме того, мне нужно знать, каков тип этих полей классов? DataRow, DataColumn, DataCell ... или что? Мне нужно это, чтобы закончить ответ, так как сейчас каждое значение поля вводится как object ... ОПЫТ УЖЕ ПРЕДОСТАВЛЯЕТСЯ ТРЕБУЕМАЯ ИНФОРМАЦИЯ!
+0

Это не реплицирует то, что делает OP. Но OP не предоставил полный набор кодов с определениями классов, поэтому трудно понять, что делать. – Enigmativity

+0

@ Энигматичность Эй. Кстати, не OP пытается добавить все строки, хранящиеся в полях класса с идентификатором, начинающимся с префикса 'Personales_'? Я понял, что это была цель. Что вы поняли вместо этого? Заранее спасибо. –

+0

Метод '.AddRow (...)' принимает 5 параметров. Один в вашем коде принимает только 1. – Enigmativity