2017-02-22 10 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 ++)'(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. 我々は2つのプロパティのオブジェクトにそれぞれ見つかったフィールドを投射:(1)我々は(2)、フィールド(すなわちPersonales_ XXX)に属する行の番号(インデックス)を抽出反射クラスフィールド。抽出された行のインデックスによって
  4. 我々グループのすべてのフィールド
  5. 我々は、キーがフィールド名と値フィールド値ある辞書に得られた各行インデックスグループ化されたフィールドを投影します。

マップを作成したら、行全体を追加するのは簡単な作業です。

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

注:

  • あなたがする必要があるあなただけの各辞書を反復処理し、行インデックスforループの指標となりますPersonalesに各フィールドを追加する必要がありますクラスフィールドがprivate,protectedまたはpublicかどうかを明確にしてください。今のところ、彼らはprivateだと思うでしょう(LINQクエリのバインディングフラグを見てください)。これらのクラスフィールドを持つアクセス修飾子をコメントアウトしてください。
  • また、これらのクラスフィールドの種類は何ですか? DataRow、DataColumn、DataCell ...または何ですか?私は答えを完成するためにこれを必要としています。今では各フィールドの値はobject ... と入力されていますので、必要な情報を手元に用意しています!
+0

これは、OPがやっていることを複製しません。しかし、OPはクラス定義の完全なコードを提供していないので、何をすべきかを知ることは難しいです。 – Enigmativity

+0

@Enigmativityねえ。 BTWは、 'Personales_'接頭辞で始まる識別子を持つクラスフィールドによって保持されているすべての行を追加しようとするOPではありませんか?私はこれが目標だったと理解しました。代わりにあなたは何を理解しましたか?前もって感謝します。 –

+0

'.AddRow(...)'メソッドは5つのパラメータをとります。あなたのコードのものは1つしかかかりません。 – Enigmativity

関連する問題