2014-01-05 20 views
1

我發現了一些有關修改.Text,.Checked值等的工作正常的答案,但是當我嘗試更改.Value屬性時它們都沒有工作。我無法在進度條上工作。 最後我想:按名稱查找特定的控件並修改其.Value屬性

foreach (Control c in this.Controls) 
{ 
    if (c.Name == "test" && c is ProgressBar) 
    { 
     ((ProgressBar)c).Value = 23; 
    } 
} 

我缺少一個using語句還是什麼?

+2

代碼看起來正確。你能獲得進展嗎?通過放置斷點來檢查。 –

+1

還考慮查看['Control.ControlCollection.Find'方法](http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection.find(v = vs.110 )的.aspx)。 –

+0

我放了一個else語句,那是運行..所以在我的條件如果不滿意..我不明白爲什麼 – Vantalk

回答

1

假設你的進度條控件被命名爲「test」(全部爲小寫字母)並直接放置在表單的表面上(不在groupbox,panel或其他控件容器中),那麼這段代碼應該可以工作並簡化你的工作

foreach (var c in this.Controls.OfType<ProgressBar>().Where(x => x.Name == "test") 
{ 
    c.Value = 23; 
} 

代替如果進度被放置在控制容器內(如一個面板)上面的代碼應在容器的控件集合

foreach (var c in this.panel1.Controls.OfType<ProgressBar>().Where(x => x.Name == "test") 
{ 
    c.Value = 23; 
} 

正如在註釋中指出被改變爲環通過KingKing,如果您確定在組合框中存在名爲「test」的控件,那麼控件集合中的簡單查找應該會導致您的進度條。循環是沒有必要在這種情況下

ProgressBar pb = this.groupBox1.Controls["test"] as ProgressBar; 
if(pb != null) pb.Value = 23; 
+0

Odrai是對的,我在酒吧裏有一個groupbox。此外你的例子工作得很好。標記爲接受的答案,因爲它首先發布在Answers列上。 – Vantalk

+0

如果您發現其他答案有幫助,您也可以對其加以調整。這是向您表示感謝您提供的幫助的一種方式。 – Steve

+0

順便說一句,你不需要像ControlCollection這樣的* key支持的集合,只需在ControlCollection類的索引器中傳遞控件名就可以得到控制權,否則你應該得到控制權get'null',就像這樣'panel1.Controls [「test」]' –

1

這裏的竅門是控制不是List <>或IEnumerable的但ControlCollection中。

我推薦使用Control的擴展。這個類添加到項目中:

public static class ControlExtensionMethods 
{ 
    public static IEnumerable<Control> All(this System.Windows.Forms.Control.ControlCollection controls) 
    { 
     foreach (Control control in controls) 
     { 
      foreach (Control grandChild in control.Controls.All()) 
       yield return grandChild; 

      yield return control; 
     } 
    } 
} 

然後,你可以這樣做:

foreach(var textbox in this.Controls.All()) 
{ 
    // Apply logic to a control 
} 

來源:Click

+0

我可能不需要那麼多的多功能性。你給了我關於錯誤的第一個暗示,但是史蒂夫的回答是第一位的,而且更容易一些。非常感謝你。投票有用 – Vantalk

+0

@Vantalk:我很高興我能幫你:) – Odrai