2016-06-01 7 views
0

IクラスTrayDetailsには一連の変数が含まれています。複数回使用されるC#のクラスの変数とループを使用して返す

public class TrayDetails 
{ 
    public string ID { get; set;} 
    //... some more string variables here 
} 

私はそれを私のメインフォームで2回宣言しました。

private TrayDetails Right; 
private TrayDetails Left; 

私は、特定のRightまたはLeft変数を反復処理し、条件が満たされたときstring.emptyにすべての変数を設定したいと思います。

コード:

Action FillData =() => 
{ 
    if(Right != null) 
    { 
     this.label1.Text = Right.ID; 
     //... somemore labels = Right.somevariables 
    } 
    else 
    { 
     //I would want to put the string.empty variables here using a loop. 
     //I cant seem to get PropertyInfo to work 
    } 

    //similar as above 
    if(Left != null) 
    // you get the idea 
} 

どのようにして所望の出力を達成することができますか?

+1

'Right == null'の場合、存在しないオブジェクトのプロパティをどのように設定しますか?その 'else'ブロックで' Right'をインスタンス化する必要があるなら、コンストラクタにプロパティ値を 'string.Empty'に設定させるだけです。あなたのコードはずっと簡単になります。 –

+0

@Cᴏʀʏそうできる。私の「右」または「左」の値を設定する私の既存のコードは一般的なものです。例: 'details.Add(新しいTrayDetails(){OrderNo = dr.GetString(0)}' – Hexxed

答えて

0

私はそれが正しい取得する場合、あなたはすべてのTextプロパティを設定したい(フォーム)に制御しstringRight/Leftオブジェクトがnull

あるときは、Linq

this.Controls 
     .OfType<Control>() // Apply filter, if only for specific controls. 
     .ToList() 
     .ForEach(x=> x.Text = string.Empty); 
+0

これは私の答えですが、私のフォームの私のラベルのすべてが 'stringに設定されているわけではありません。Empty ' – Hexxed

+0

私はその点をコメントとして述べましたが、あなたは単に条件を適用することができます。どのコントロールが必要か、正確なフィルター基準は何ですか:-) –

0

を使用してこれを行うことができますこれをリファクタリングして、コントロールが一般的な方法で設定されるようにすることをお勧めします。例えば、このような何か:

private SetupLabels(TrayDetails trayDetails) 
{ 
    this.label1.Text = (trayDetails != null) ? trayDetails.Id : string.Empty; 
    // Set more labels here 
} 

このアプローチを使用するには、あなたがして、次のかもしれない:あなたが同じラベルを設定しているよう

Action FillData =() => 
{ 
    SetupLabels(Right); 
    SetupLabels(Left); 
} 

注意、これは全く正しい動作しません。どちらの場合も、Rightプロパティがnullでない場合はラベルが設定され、Leftプロパティもnullでない場合はラベルが再度変更されるため、少し修正する必要があります。

あなたのコントロールを設定し、TrayDetailsというインスタンスを取る共通の方法があるという考えは同じです。ページの特定の部分にコントロールを設定しようとしている場合は、それらをコンテナにラップしてから、SetupLabelsメソッドを更新してコンテナ名を取得することができます。あなたはWebフォームを使用している、あなたはこのようなものを使用したと仮定すると

:SetupLabels方法

<asp:PlaceHolder id="LeftContainer" runat="server"> 
    <asp:Label ID="label1" runat="server" /> 
    <!--Other controls--> 
</asp:PlaceHolder> 

<asp:PlaceHolder id="RightContainer" runat="server"> 
    <asp:Label ID="label1" runat="server" /> 
    <!--Other controls--> 
</asp:PlaceHolder> 

は、次のようになります。

private SetupLabels(TrayDetails trayDetails, string containerName) 
{ 
    PlaceHolder container = (PlaceHolder) Page.FindControl(containerName); 
    ((Label) container.FindControl("label1")).Text = (trayDetails != null) ? trayDetails.Id : string.Empty; 
    // Set more labels here 
} 

それはまだ厄介なソリューションのビットですが、 TrayDetailsオブジェクトからラベルがどのように埋め込まれているかを正確に制御できます。

関連する問題