我已经找到了一些关于修改.Text,.Checked值的工作的答案,但是当我尝试更改.Value属性时,它们都没有工作。我不能让它在进度条上工作。 最后我试过了:
foreach (Control c in this.Controls)
{
if (c.Name == "test" && c is ProgressBar)
{
((ProgressBar)c).Value = 23;
}
}
我错过了使用声明或其他内容吗?
答案 0 :(得分:1)
假设您的进度条控件名为“test”(全部为小写字母)并且直接放在表单的表面上(不在组框,面板或其他控件容器中),那么此代码应该可以工作并简化您的工作< / p>
foreach (var c in this.Controls.OfType<ProgressBar>().Where(x => x.Name == "test")
{
c.Value = 23;
}
如果将ProgressBar放在控件容器(如面板)中,则应更改上述代码以循环容器的控件集合
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;
答案 1 :(得分:1)
这里的技巧是控件不是List&lt;&gt;或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