HelloWorld
HelloWorld

Reputation: 57

Not changing the properties for fields via control array

I have the WinForm, there I have a lot of controls, and on certain moments I need to change the properties for some of them.. so, I create the Control array and determines what should be changed

controls = new Control[] {loadFromFile_btn, logout_btn, postBtn, waitFrom_tb, waitTo_tb, messageTB, recurs_check};
ChangeStatus.activStatus(controls);

Then in my class ChangeStatus make changes to all of these elements are in an array

public static void activStatus(Control[] controlObj)
    {
        for (int i = 0; i < controlObj.Count() - 1; i++)
        {
            controlObj[i].BeginInvoke((Action)delegate
            {
                if (controlObj[i] is TextBox || controlObj[i] is CheckBox || controlObj[i] is Panel)
                    controlObj[i].Enabled = true;
                else
                {
                    controlObj[i].BackColor = Color.DarkGray;
                    controlObj[i].Enabled = true;
                }
            });
        }
    }

But I have a problem... the change applies only to the last element in the array. Help me please..

Upvotes: 0

Views: 32

Answers (1)

Selman Gen&#231;
Selman Gen&#231;

Reputation: 101681

That's because of the closure.Try storing i in a local variable and use it in your anonymous method

 for (int i = 0; i < controlObj.Count() - 1; i++)
    {
        int j = i;
        controlObj[i].BeginInvoke((Action)delegate
        {
            if (controlObj[j] is TextBox || controlObj[j] is CheckBox || controlObj[j] is Panel)
                controlObj[j].Enabled = true;
            else
            {
                controlObj[j].BackColor = Color.DarkGray;
                controlObj[j].Enabled = true;
            }
        });
    }

Upvotes: 3

Related Questions