2017-02-06 6 views
1

Ich bin auf der Suche nach einigen Etiketten Text aus einem XML-Dokument zu aktualisieren.Schleife durch Etiketten und Werte ändern C#

Die Etiketten werden supName1, genannt supName2 usw.

Ich habe eine for-Schleife, die in List.Count für alle XML-Knoten durchläuft.

var n = list.Count; 
     for (int i = 0; i < n; i++) 

Ich brauche den Beschriftungstext für jeden des list.count zu aktualisieren, aber ich kann nicht herausfinden, wie die Etiketten zu verweisen.

Aus meiner VBA Erfahrung würde es so etwas wie "supName"+i sein, aber ich kann es nicht für C# herauszufinden.

Ich habe folgendes versucht;

var label = (Label)Controls["supName" + i]; 

aber es gibt null zurück, wenn es versucht, es wie folgt zu verwenden;

label.Text = list[i].Attributes["name"].Value; 
+0

Verwenden [Control.ControlCollection.Find] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection.find%28VS.80%29. aspx), z 'this.Controls.Find ($" supName {i} ", true) als Label;' – Equalsk

+0

Sind das Windows-Formulare, wpf oder ein anderes UI-Framework? Bitte verwenden Sie das entsprechende Tag. –

+0

Windows Forms - beim ersten Post als Winforms gekennzeichnet. Entschuldigung für jede Verwirrung. –

Antwort

1

Sie müssen die Etiketten in Ihrer Form durch ihre Name Immobilie finden, haben aber im Auge behalten, dass sie auf ein Kind Kontrolle gestellt werden, nicht die sich selbst bilden. Die Methode, die Ihnen hier hilft, ist ControlCollection.Find() die Sie auf Ihrem Formular Controls Eigentum nennen können, die ControlCollection ist die Form darstellt:

int n = list.Count; 
for(int i=0; i<n; i++) 
{ 
    // the second argument "true" indicates to 
    // search child controls recursivly 
    Label label = Controls.Find($"supName{i}", true).OfType<Label>().FirstOrDefault(); 
    if (label == null) continue; // no such label, add error handling 
    label.Text = list[i].Attributes["name"].Value; 
} 
+0

Ich benutze WinForms ja.Einen Fehler mit dem Controls.Find bekommen. Es sagt, es kann nicht Windows.Forms.Control [] zu Windows.Form.Label –

+0

@AdrianBrown ja entschuldigen, repariert es in meiner Antwort. 'Find()' gibt ein Array von übereinstimmenden Elementen zurück. Normalerweise ist es jedoch nicht so einfach, zwei Steuerelemente mit demselben Namen in einem Formular zu verwenden. Meine Lösung nimmt jetzt das erste Steuerelement mit dem Namen, der ein "Label" ist. –

+0

Funktioniert perfekt! Vielen Dank. –

1

Dies sollte es tun ...

foreach (Label myControl in this.Controls 
       .OfType<Label>() 
       .Where(myControl => (myControl).Name == "ValueFromList")) 
      { 
       //Apply change here. 
      } 
1

Der Grund dafür hat nicht funktioniert:

var label = (Label)Controls["supName" + i]; 

Ist da Steuerelemente hierarchisch sind, und Ihr Label ist wahrscheinlich kein direkter Nachkomme der aktuellen Form/Kontrolle.

Zu diesem Zweck gibt es eine Find Methode:

var label = (Label)ControlsCollection.Find("supName" + i,true); 
1

Diese Label s sind Referenztypen, so dass Sie eine Zeile Linq dafür verwenden können:

Controls.OfType<Label>().Select(lbl => lbl.Text = "hello world!"); 

Wenn Sie spezifische ändern müssen Label dann tun:

Controls.OfType<Label>().Where(lbl => lbl.Name.EndsWith(index)).Select(lbl => lbl.Text = "hello world!"); 
// where index -> int index; 

Also im Grunde Label Sie verwenden möchten, finden:

Controls.OfType<Label>().Where(lbl => lbl.Name.EndsWith(index)); 
// or if you want only first matched element 
Controls.OfType<Label>().FirstOrDefault(lbl => lbl.Name.EndsWith(index)); 
1

folgender Code atleast für Windows Forms-Anwendung tun soll. Dank

 var labels = this.Controls.OfType<Label>(); 
      if (labels != null) 
      { 
       int cnt = 0; 
       foreach (var label in labels) 
       { 
        label.Text = "New label text " + cnt++; 
       } 
      } 
Verwandte Themen