Pergunta

Estou dinamicamente adicionando um monte de controles a um formulário. Cada controle chama o mesmo método, e em que o método que eu preciso saber o índice da matriz do controle que executou a ação.

CheckBox[] myCB = new CheckBox[100];
int i;
for (i = 0; i < 100; i++)
{
    myCB[i] = new CheckBox();
    myCB[i].Text = "Clicky!";
    myCB[i].Click += new System.EventHandler(dynamicbutton_Click);
    tableLayoutPanel1.Controls.Add(myCB[i]);
}

private void dynamicbutton_Click(Object sender, System.EventArgs e)
{
    label1.Text = sender.???array index property???.ToString();
}

Então, se eu clicar myCB[42] label1 vai ler "42" Claro que, se existe uma maneira mais fácil de lidar com controles dinâmicos eu apreciaria ponteiros.

Foi útil?

Solução

Uma solução óbvia seria para definir a tag:

CheckBox[] myCB = new CheckBox[100];
for (int i = 0; i < myCB.Length; i++)
{
    myCB[i] = new CheckBox();
    myCB[i].Text = "Clicky!";
    myCB[i].Click += new System.EventHandler(dynamicbutton_Click);
    myCB[i].Tag = i;
    tableLayoutPanel1.Controls.Add(myCB[i]);
}

Depois:

private void dynamicbutton_Click(Object sender, System.EventArgs e)
{
    Control control = (Control) sender;
    label1.Text = sender.Tag.ToString();
}

Outra alternativa é para capturar as informações no manipulador de eventos, mais simplesmente usando uma expressão lambda ou método anônimo:

CheckBox[] myCB = new CheckBox[100];
for (int i = 0; i < myCB.Length; i++)
{
    int index = i; // This is very important, as otherwise i will
                  // be captured for all of them
    myCB[i] = new CheckBox();
    myCB[i].Text = "Clicky!";
    myCB[i].Click += (s, e) => label1.Text = index.ToString();
    tableLayoutPanel1.Controls.Add(myCB[i]);
}

ou para um comportamento mais complicado:

CheckBox[] myCB = new CheckBox[100];
for (int i = 0; i < myCB.Length; i++)
{
    int index= i; // This is very important, as otherwise i will
                  // be captured for all of them
    myCB[i] = new CheckBox();
    myCB[i].Text = "Clicky!";
    myCB[i].Click += (s, e) => DoSomethingComplicated(index, s, e);
    tableLayoutPanel1.Controls.Add(myCB[i]);
}

(onde você declarar DoSomethingComplicated apropriadamente).

Outras dicas

private void dynamicbutton_Click(Object sender, System.EventArgs e)
{
    label1.Text = Array.IndexOf(myCB, (CheckBox)sender).ToString();
}

Controle de deve ter uma propriedade Tag. Talvez você pode anexar o índice para o Tag. Você vai incorrer boxe embora ...

int j = i;
myCB[i].Click += delegate(object sender, EventArgs e) {
 // here you can use "j"

};
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top