2017-03-05 4 views
0

フォームオブジェクトを別のフォームオブジェクトにコピーしようとしました。以下は、各textBoxと他のコロールの設定を繰り返し同じです。私は、これらの繰り返しを1つのコントロールコピーで行う簡単な方法があるかどうか疑問に思っています。これらを簡単にするには?

class CopyLadderAndPlatformWin 
     { 
      public CopyLadderAndPlatformWin(LadderAndPlatformWin tgLadderAndPlatformWin, LadderAndPlatformWin srLadderAndPlatformWin) 
      { 
       tgLadderAndPlatformWin.chTopPlatform.Checked = srLadderAndPlatformWin.chTopPlatform.Checked; 
       tgLadderAndPlatformWin.txtIdentifier.Text = srLadderAndPlatformWin.txtIdentifier.Text; 
       tgLadderAndPlatformWin.txtStartAngle.Text = srLadderAndPlatformWin.txtStartAngle.Text; 
       tgLadderAndPlatformWin.txtSizeAngle.Text = srLadderAndPlatformWin.txtSizeAngle.Text; 
       tgLadderAndPlatformWin.txtLadderAngle.Text = srLadderAndPlatformWin.txtLadderAngle.Text; 
       tgLadderAndPlatformWin.txtPltWidth.Text = srLadderAndPlatformWin.txtPltWidth.Text; 
       tgLadderAndPlatformWin.txtPltDatum.Text = srLadderAndPlatformWin.txtPltDatum.Text; 
       tgLadderAndPlatformWin.txtShellClearence.Text = srLadderAndPlatformWin.txtShellClearence.Text; 
       tgLadderAndPlatformWin.txtGratingWeight.Text = srLadderAndPlatformWin.txtGratingWeight.Text; 
       tgLadderAndPlatformWin.txtLdToDtm.Text = srLadderAndPlatformWin.txtLdToDtm.Text; 
       tgLadderAndPlatformWin.txtHndHgt.Text = srLadderAndPlatformWin.txtHndHgt.Text; 
       tgLadderAndPlatformWin.txtRailWgt.Text = srLadderAndPlatformWin.txtRailWgt.Text; 
       tgLadderAndPlatformWin.txtWnFcCof.Text = srLadderAndPlatformWin.txtWnFcCof.Text; 
       tgLadderAndPlatformWin.txtPltDpt.Text = srLadderAndPlatformWin.txtPltDpt.Text; 
       tgLadderAndPlatformWin.txtRailHgt.Text = srLadderAndPlatformWin.txtRailHgt.Text; 
       tgLadderAndPlatformWin.txtHeadStart.Text = srLadderAndPlatformWin.txtHeadStart.Text; 
       tgLadderAndPlatformWin.txtHeadEnd.Text = srLadderAndPlatformWin.txtHeadEnd.Text; 
       tgLadderAndPlatformWin.txtPltLength.Text = srLadderAndPlatformWin.txtPltLength.Text; 
       tgLadderAndPlatformWin.txtStrgtWidth.Text = srLadderAndPlatformWin.txtStrgtWidth.Text; 
       tgLadderAndPlatformWin.txtPltAngle.Text = srLadderAndPlatformWin.txtPltAngle.Text; 
       tgLadderAndPlatformWin.txtPltOffset.Text = srLadderAndPlatformWin.txtPltOffset.Text; 
       tgLadderAndPlatformWin.txtTopDatum.Text = srLadderAndPlatformWin.txtTopDatum.Text; 

       tgLadderAndPlatformWin.rdApplyWind.Checked = srLadderAndPlatformWin.rdApplyWind.Checked; 
       tgLadderAndPlatformWin.rdNoWind.Checked = srLadderAndPlatformWin.rdNoWind.Checked; 
       tgLadderAndPlatformWin.chEmpty.Checked = srLadderAndPlatformWin.chEmpty.Checked; 
       tgLadderAndPlatformWin.chTest.Checked = srLadderAndPlatformWin.chTest.Checked; 
       tgLadderAndPlatformWin.chLiftWeight.Checked = srLadderAndPlatformWin.chLiftWeight.Checked; 
      } 
     } 
+2

はいそこより良い方法がありますが、なぜあなたはそれをする必要がありますか?要件は何ですか? – CodingYoshi

+0

保存したコントロールの値を別のフォームに転送して表示(再表示)する必要があります。 ところで、上記のコードはうまくいきます。しかし、それはそれぞれ同じタイプ/名前コントロールを繰り返すことは愚かです。私は非常に多くの行の代わりに簡単なforeachを使用しようとしています。しかし、私はそれを理解することはできません。 –

+0

@ JohnWangコードが動作する場合、これは[Code Review](http://codereview.stackexchange.com/)の方が適しています。 – Nkosi

答えて

0

ソースフォーム上のすべてのコントロールを1つのループで反復処理します。

このループ内で、ターゲットフォームのコントロールを反復処理する別のループを作成します。

コントロールを名前と比較してください。

コントロールの種類によって、名前がソースからターゲットにコピーする値と一致する場合。あなたのコメントで

foreach (var src in srLadderAndPlatformWin) 
{ 
    foreach (var dst in tgLadderAndPlatformWin) 
    { 
     if (dst.Name != src.Name) 
     { 
      continue; 
     } 

     if (src is System.Windows.Forms.CheckBox) 
     { 
      dst.Checked = src.Checked; 
     } 

     // Add more winforms control type specific rules here 
    } 
} 
+0

コードをお寄せいただきありがとうございます。私も同じように試しました。しかし、それは動作しません。乾杯。 –

+0

@JohnWangあなたはもっと正確になりますか? – zmechanic

0

あなたが言った:

を私が表示されるように、別のフォームにコントロールの保存された値を転送する必要があります(再ここ

のアイデアを示すコードであります遊びます)。

これを行う正しい方法は、最初のフォームで操作または表示しているものを表すクラスを作成することです。たとえば、Platformというものを(コードを見て)操作または表示しているとします。その後

var platform = new Platform(); 

// This can fail so use TryParse but I will just use Parse for brevity 
platform.LadderAngle = int.Parse(tgLadderAndPlatformWin.txtLadderAngle.Text); 

public class Platform 
{ 
    public double LadderAngle { get; set; } 
    public int LadderWidth { get; set; } 
    // Other properties 
} 

次に、あなたの最初のクラスをそのインスタンスを作成し、このように、そのインスタンスで作業:あなたはこのようなあなたのPlatformのためのクラスを作成する必要が

コントロールから他のコントロールに値をコピーするのではなく、そのオブジェクト参照を2番目のフォームに渡すだけです。

var form2 = new Form2(); 
form2.Platform = platform; 

そのために仕事に、あなたはこのようなあなたの第二形式でプロパティを作成する必要があります。

public Platform Platform { get; set; } 
0

あなただけTextChecked性質、 をコピーしたい場合は、LadderAndPlatformWinからすべてのプロパティを反復処理するためにリフレクションを使用することができますチェックされているかテキスト値のプロパティがあるかどうかを確認し、値をコピーします。

コードは次のようになります。

[TestMethod] 
    public void DoCopy() 
    { 
     var source = new SomeObject(); 

     var Destination = new SomeObject(); 
     Destination.A = new AnotherObject(); 
     Destination.C = new LastOne(); 
     Destination.B = new AnotherObject(); 

     var type = source.GetType(); 
     BindingFlags flags = BindingFlags.Public | BindingFlags.Instance; 
     PropertyInfo[] properties = type.GetProperties(flags); 

     foreach (PropertyInfo property in properties) 
     { 
      var insideSource = property.GetValue(source); 
      var insideType = insideSource.GetType(); 

      var insideDestination = property.GetValue(Destination); 


      insideType.GetProperties(flags).Where(s => s.Name == "Text" || s.Name == "Checked").ToList().ForEach(p => 
      { 
       p.SetValue(insideDestination, p.GetValue(insideSource)); 
      }); 

     } 

     Trace.WriteLine(JsonConvert.SerializeObject(Destination)); 
    } 

    public class SomeObject 
    { 
     public AnotherObject A { get; set; } = new AnotherObject() {Text = "Text"}; 
     public AnotherObject B { get; set; } = new AnotherObject() {Text = "Text2"}; 

     public LastOne C { get; set; } = new LastOne() {Checked = true}; 
    } 

    public class AnotherObject 
    { 
     public string Text { get; set; } 
    } 

    public class LastOne 
    { 
     public bool Checked { get; set; } 
    } 
関連する問題