2016-07-19 3 views
1

Ich habe eine Winform und ich möchte eine Reihe von Zeichenfolgen an eine Reihe von Etiketten übergeben.Was ist die richtige Methode für die Übergabe von Zeichenfolgen an Etiketten?

Dies ist der Code:

public partial class CourierDeliveringEnemyReport : Form 
{ 
    public static string Label1 { get; set; } 
    public static string Label2 { get; set; } 
    public static string Label3 { get; set; } 
    public static string Label4 { get; set; } 
    public static string Label5 { get; set; } 
    public string Label6 { get; set; } 

    public CourierDeliveringEnemyReport() 
    { 

     InitializeComponent(); 

     label1.Text = Label1; 
     label2.Text = Label2; 
     label3.Text = Label3; 
     label4.Text = Label4; 
     label5.Text = Label5; 
     label6.Text = "This is a test!"; 
    } 

Die Werte hier eingestellt:

CourierDeliveringEnemyReport dlg = new CourierDeliveringEnemyReport(); 
CourierDeliveringEnemyReport.Label1 = "Report from " + BlueArmy[GameEventList[i].ObservingUnit].Name; ; 
           string temp2 = "Enemy unit (" + RedArmy[GameEventList[i].Unit].Name + ") observed!"; 
CourierDeliveringEnemyReport.Label2 = temp2; 
           string temp3 = "This intelligence is " + RedArmy[GameEventList[i].Unit].LastTimeObservedByEnemy + " minutes old."; 
           CourierDeliveringEnemyReport.Label3 = temp3; 

den Debugger verwenden ich, dass gültige Strings übergeben werden bestätigen können. Label1 zum Beispiel enthält die Zeichenfolge "Report from ...".

Das Problem ist, dass die Etiketten die Zeichenfolge Werte außer Label6 (der Testfall) nicht übernehmen.

Was mache ich falsch?

Danke!

+2

Wo legen Sie die Werte für Label1 zu Label5-Eigenschaften fest? Sie müssen initialisiert werden, bevor Sie sie verwenden - Sie binden die Eigenschaft zu diesem Zeitpunkt nicht an das Label. – PaulF

+0

Es kompiliert definitiv – zetar

+0

Warum versuchen Sie, label1 Wert wieder in label1 zu speichern? Versuchen Sie 'label1.Text = Label1.Tostring' – TheDeveloper

Antwort

2

Sie sind nicht binding das Label der Variablen, Sie setzen es nur einmal. Es scheint, dass Sie erwarten, dass das Label aktualisiert wird, wenn die relative LabelX Zeichenkette aktualisiert wird, aber dies würde nur passieren, wenn es eine Benachrichtigung von irgendeiner Art gibt.

Ihr Formular kann zum Beispiel INotifyPropertyChanged implementieren und Ihre Label Eigenschaften können die Benachrichtigung auslösen, wenn sie geändert werden.

public partial class CourierDeliveringEnemyReport : Form, INotifyPropertyChanged 

Dann kann es auf eine Weise

private string _label1; 

public string Label1 
{ 
    get { return _label1; } 
    set 
    { 
     if(_label1 == value) return; 

     _label1 = value; 
     OnPropertyChanged("Label1"); 
    } 
} 

//implement the INotifyPropertyChanged interface 
public event PropertyChangedEventHandler PropertyChanged; 

protected virtual void OnPropertyChanged(string prop) 
{ 
    if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
} 

diese ähnlich implementiert werden, da dieser WinForms ist, gibt es keine XAML-Markup-Bindungen hinzufügen, damit Sie es im Code mit Binding hinter tun können.

public CourierDeliveringEnemyReport() 
{ 

    InitializeComponent(); 
    //"Text" is the property on the control to get/set (i.e. Label1.Text) 
    //this is the datasource 
    //"Label1" is the property in our code 
    label1.DataBindings.Add(new Binding("Text", this, "Label1")) 

    //add bindings for other labels 
} 

(-Code ist nicht getestet, sollte aber eine Idee geben)

+0

Dies scheint ein Weg über komplizierte Lösung. – JSON

+0

Es ist nicht kompliziert, nur wortreich. Es gibt andere Möglichkeiten zum Einrichten von Benachrichtigungen, aber "INotifyPropertyChanged" ist eine Standardschnittstelle, die für dieses Muster implementiert werden muss. – keyboardP

+0

Theoretisch, wenn die Variablen im Code hinter dem Formular verbleiben, könnte der 'Setter' direkt auf das Steuerelement zugreifen und den Text setzen. Würde den Code fest koppeln, wenn das ein Problem ist. – keyboardP

0

Wenn Sie Ihren Code betrachten, initialisieren Sie die Labelx-Eigenschaften, BEVOR sie im Konstruktor zugewiesen wurden. An diesem Punkt geben sie null zurück, so dass das Label keinen Inhalt hat.

Möglicherweise müssen Sie nach jeder Aktualisierung der Labelx-Eigenschaft eine andere Methode zum Aktualisieren der Beschriftungen verwenden.

public partial class CourierDeliveringEnemyReport : Form 
{ 
public static string Label1 { get; set; } 
public static string Label2 { get; set; } 
public static string Label3 { get; set; } 
public static string Label4 { get; set; } 
public static string Label5 { get; set; } 
public string Label6 { get; set; } 

public CourierDeliveringEnemyReport() 
{ 
    InitializeComponent(); 
    UpdateLabels(); // this will clear all labels except Label6 
} 
public void UpdateLabels() 
{ 
    label1.Text = Label1; 
    label2.Text = Label2; 
    label3.Text = Label3; 
    label4.Text = Label4; 
    label5.Text = Label5; 
    label6.Text = "This is a test!"; 
} 


CourierDeliveringEnemyReport dlg = new CourierDeliveringEnemyReport(); 
CourierDeliveringEnemyReport.Label1 = "Report from " + BlueArmy[GameEventList[i].ObservingUnit].Name; ; 
string temp2 = "Enemy unit (" + RedArmy[GameEventList[i].Unit].Name + ") observed!"; 
CourierDeliveringEnemyReport.Label2 = temp2; 
string temp3 = "This intelligence is " + RedArmy[GameEventList[i].Unit].LastTimeObservedByEnemy + " minutes old."; 
CourierDeliveringEnemyReport.Label3 = temp3; 
CourierDeliveringEnemyReport.UpdateLabels(); 
+0

Ich war nicht sicher über die Bindung in WinForms, also wenn die Lösung von keyboardP funktioniert - dann würde ich vorschlagen, dass dies der beste Weg ist. – PaulF

+0

Ich bin sicher, es wird mit Datenbindung arbeiten. Wenn die Eigenschaften jedoch Mitglied des Formulars sind und Sie sie nur zum Aktualisieren dieser Beschriftungen verwenden möchten, ist die Verwendung der Datenbindung und 'INotifyPropetyChanged' sinnlos und zu viel Arbeit. Es genügt, einige öffentliche Eigenschaften in dem Formular zu erstellen, die den Beschriftungen Werte zuweisen. Werfen Sie einen Blick auf diese [Post] (http://stackoverflow.com/a/38464913/3110834). –

0

Sie führen einen Konstruktor:

CourierDeliveringEnemyReport dlg = new CourierDeliveringEnemyReport(); 

Welche Label steuert unassigned Label # Eigenschaften zuweist. Entweder tun als PaulF vorgeschlagen, durch Label-Steuerelemente danach aktualisieren oder String-Werte für Ihr Label # Eigenschaften in Konstruktor übergeben, ordnen sie, und dann tun: label1.Text = Label1;

Pseudo Beispiel:

public CourierDeliveringEnemyReport(string l1, string l2, string l3, string l4, string l5, string l6) 
{ 

    InitializeComponent(); 
    Label1 = l1; 
    Label2 = l2; 
    /* and so on */ 
    label1.Text = Label1; 
    label2.Text = Label2; 
    label3.Text = Label3; 
    label4.Text = Label4; 
    label5.Text = Label5; 
    label6.Text = "This is a test!"; 
} 
0

Sie haben INotifyPropertyChanged implementieren

public partial class CourierDeliveringEnemyReport : Form, INotifyPropertyChanged 
{ 
    public static string Label1 
    { 
     get 
     { 
      return Label1; 
     } 
     set 
     { 
      Label1=value; 
      OnPropertyChanged("Label1"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string property) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
    } 
    public CourierDeliveringEnemyReport() 
    { 

     InitializeComponent(); 

     label1.Text = Label1; 
     label1.DataBindings.Add(new Binding("Text", this, "Label1"));  
    } 
} 

Wenn Sie jetzt den Wert von Label1 ändern wird es automatisch auf dem aktuellen Etikett aktualisiert werden bindet sich daran.

CourierDeliveringEnemyReport dlg = new CourierDeliveringEnemyReport(); 
CourierDeliveringEnemyReport.Label1 = "Report from " + BlueArmy[GameEventList[i].ObservingUnit].Name; ; 
1

Warum nicht einfach öffentliche Eigenschaften erstellen, die diese Etiketten erhalten und setzen?

Wenn die Eigenschaften Mitglieder des Formulars sind und Sie nur zum Aktualisieren dieser Etiketten verwenden möchten, ist die Verwendung von Datenbindung und INotifyPropertyChanged sinnlos und zu viel Arbeit. Es ist genug, um einige öffentlichen Eigenschaften in Form zu schaffen, die Werte zu Beschriftungen zuweisen:

public string Value1 
{ 
    get { return this.label1.Text; } 
    set { this.label1.Text = value; } 
} 

int value2; 
public int Value2 
{ 
    get { return value2; } 
    set 
    { 
     value2 = value; 
     this.label2.Text = string.Format("Here is the value {0}", value); 
    } 
} 

Dann ist es genug, um diese Eigenschaften zu setzen, ist als Text dieser Labels zu sehen.

var f = new ReportForm() {Value1 = "text for label1", Value2 = 100}; 
f.Show(); 
Verwandte Themen