按名称查找特定控件并修改其.Value属性

时间:2014-01-05 10:42:11

标签: c# winforms controls

我已经找到了一些关于修改.Text,.Checked值的工作的答案,但是当我尝试更改.Value属性时,它们都没有工作。我不能让它在进度条上工作。 最后我试过了:

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

我错过了使用声明或其他内容吗?

2 个答案:

答案 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