Vantalk
Vantalk

Reputation: 376

Find a specific control by name and modify its .Value property

I've found a few answers around that work fine with modifying .Text, .Checked values and so, but none of them worked when I tried changing the .Value property. I can't get that to work on progress bars. Last I tried:

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

Am I missing a using statement or something?

Upvotes: 1

Views: 2094

Answers (2)

Steve
Steve

Reputation: 216293

Assuming that your progressbar control is named "test" (all lowercase letters) and is placed directly on the surface of your form (not inside a groupbox,panel or other control container) then this code should work and simplify your work

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

instead if the ProgressBar is placed inside a control container (like a panel) the above code should be changed to loop over the controls collection of the container

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

As pointed out in the comment by KingKing, if you are absolutely sure that a control named "test" exists in your groupbox then a simple lookup in the controls collection should result in your progressbar. Looping is not necessary in this case

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

Upvotes: 1

Odrai
Odrai

Reputation: 2353

The trick here is that Controls is not a List<> or IEnumerable but a ControlCollection.

I recommend using an extension of Control. Add this class to your project:

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;
        }
    }
}

Then you can do :

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

Source: Click

Upvotes: 1

Related Questions