2017-02-06 54 views
1

我正在尋找更新XML文檔中的某些標籤文本。循環遍歷標籤並更改值c#

標籤被命名爲supName1supName2

我有一個用於其在List.Count的所有XML節點貫穿循環。

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

我需要更新每個list.count的標籤文本,但我不知道如何引用標籤。

從我的VBA經驗來看,這將是類似於"supName"+i但我無法弄清楚的C#。

我試過以下;

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

但試圖按如下方式使用它時返回null;

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

使用[Control.ControlCollection.Find(http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection.find%28VS.80%29。 aspx),例如'this.Controls.Find($「supName {i}」,true)作爲標籤;' – Equalsk

+0

這是windows窗體,wpf還是其他一些UI框架?請使用適當的標籤。 –

+0

Windows窗體 - 在初始文章上標記爲winforms。對不起,有任何困惑。 –

回答

1

您需要通過他們的Name屬性來找到您形式的標籤,但要記住,他們可能會被放置在一個孩子的控制,而不是形成自己。在這裏可以幫助你的方法是ControlCollection.Find(),你可以在你的窗體的Controls屬性,它代表了形式的ControlCollection撥打:

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

我正在使用WinForms。通過Controls.Find獲取錯誤。它說它不能將Windows.Forms.Control []轉換爲Windows.Form.Label –

+0

@AdrianBrown是的抱歉,修復它在我的答案。 Find()返回一個匹配項的數組。但通常情況下,以一種形式使用兩個具有相同名稱的控件並不那麼容易。我的解決方案現在採用名爲「Label」的第一個控件。 –

+0

完美的作品!非常感謝你。 –

1

這應該這樣做...

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

的原因,這沒有奏效:

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

是因爲控制是分層次的,你的標籤可能不是嫡系目前的Form/Control。

爲此存在Find方法:

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

這些Label s爲引用類型,所以你可以使用一個線Linq爲:

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

如果您需要更改特定Label然後做:

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

所以基本上找到你想要使用Label

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

下面的代碼應當爲Windows窗體應用程序ATLEAST做。感謝

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