2016-06-01 8 views
0

Ich habe eine Klasse TrayDetails enthält eine Reihe von Variablen.Loop und Set durch Variable in einer Klasse in C#, die mehrmals verwendet wird

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

Dann erklärte ich es zweimal auf meinem Hauptformular.

private TrayDetails Right; 
private TrayDetails Left; 

Ich möchte durch die spezifischen Right oder Left Variablen iterieren und alle seine Variablen string.empty gesetzt, wenn eine Bedingung erfüllt ist.

Code:

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 
} 

Wie kann ich den gewünschten Ausgang erreichen?

+1

Wenn 'Right == null', wie würden Sie die Eigenschaften für ein Objekt festlegen, das nicht existiert? Wenn Sie 'Right' in diesem' else' Block instanziieren müssen, würde ich einfach den Konstruktor die Eigenschaftswerte auf 'string.Empty' setzen lassen. Ihr Code würde viel einfacher werden. –

+0

@ Cᴏʀʏ Nun, ich kann das tun. aber mein existierender Code zum Setzen der Werte in meinem 'Right' oder' Left' ist generisch. Beispiel: 'details.Add (new TrayDetails() {OrderNo = dr.GetString (0)}' – Hexxed

Antwort

0

Wenn ich es richtig bekommen, wollen Sie Text Eigenschaft aller (Form) setzen steuert auf leerstring wenn die Right/Left Objekte sind null

Sie dies mit tun könnte Linq

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

Dies wäre meine Antwort, aber nicht alle meine Labels in meiner Form sollten auf 'string 'gesetzt werden.Empty' – Hexxed

+0

Ich erwähnte diesen Punkt als Kommentar, Sie könnten einfach anwenden, wo Bedingung. Sie können besser sagen, welche Steuerelemente benötigt werden und welche genauen Filterkriterien gelten :-) –

0

Ich würde empfehlen, dies zu refactoring, so dass die Steuerelemente mithilfe einer allgemeinen Methode festgelegt werden. Zum Beispiel so etwas wie diese:

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

Mit diesem Ansatz, könnten Sie dann den folgenden:

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

Hinweis, wird dies nicht funktioniert ganz richtig, wie Sie die gleichen Etikett sind Einstellung in In beiden Fällen, also wenn Ihre Right -Eigenschaft nicht null ist, werden die Beschriftungen festgelegt, und wenn die Left -Eigenschaft auch nicht null ist, werden die Beschriftungen erneut geändert. Sie müssen dies also etwas ändern.

Die Idee ist das gleiche obwohl, wo Sie eine gemeinsame Methode haben, die Ihre Steuerelemente setzt und eine Instanz TrayDetails nimmt. Wenn Sie versuchen, die Steuerelemente in einem bestimmten Teil Ihrer Seite einzurichten, können Sie sie in einen Container umbrechen und dann die Methode SetupLabels aktualisieren, um den Containernamen zu übernehmen.

<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> 

Die SetupLabels Methode könnte dann wie folgt aussehen:

Angenommen, Sie WebForms verwenden, Sie so etwas wie diese verwenden könnte

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 
} 

Es ist immer noch ein bisschen von einer chaotischen Lösung, Sie haben jedoch eine genaue Kontrolle darüber, wie genau die Beschriftungen vom TrayDetails-Objekt ausgefüllt werden.

Verwandte Themen