2017-02-22 106 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"] 
    ); 
} 

注:

  • 您需要澄清,如果类字段是privateprotectedpublic。现在,我认为它们是private(请参阅LINQ查询上的绑定标志)。请注释哪些访问修饰符具有这些类字段。
  • 此外,我需要知道这些类字段的类型是什么? DataRow,DataColumn,DataCell ...还是什么?我需要这个来完成答案,因为现在每个字段的值被输入为object ... OP已经提供了所需的信息!
+0

这并不重复OP正在做的事情。但是,OP没有提供带有类定义的完整代码,因此很难知道该怎么做。 – Enigmativity

+0

@Enigmativity嘿。顺便说一句,是不是试图添加由具有以Personales_前缀开头的标识符的类字段持有的所有行?我明白这是目标。你明白了什么?先谢谢你。 –

+0

'.AddRow(...)'方法需要5个参数。你的代码只需要1. – Enigmativity