2015-09-26 3 views
0

Эта функция динамически создает девять кнопок для использования в игре, которую я делаю. Вы можете видеть, какие атрибуты я даю кнопке.Ссылка на кнопку за пределами петли?

private void createbuttons() 
{ 
    int tot = 0; 
    int x = 100; 
    int y = 100; 

    while(tot < 9) 
    { 
     string buttonsname = (tot + "button").ToString(); 
     Button creating = new Button(); 
     creating.Name = buttonsname; 
     creating.Size = new Size(100, 100); 
     creating.Click += delegate 
     { 
      MessageBox.Show("You clicked me!"); 
     }; 
     creating.Text = buttonsname; 
     if(x > 300) 
     { 
      y += 100; 
      x = 100; 

     } 
     creating.Location = new Point(x, y); 

     Controls.Add(creating); 
     tot += 1; 
     x += 100; 
    } 

} 

Я хочу знать, как обращаться с этими кнопками в разных частях одной и той же формы. В частности, когда нажата кнопка «Начать игру», я хочу изменить текст для каждой кнопки на что-то другое.

private void button10_Click(object sender, EventArgs e) 
{ 
    //What would I write here to change the text? 
} 

ответ

0

Форма собственности: Controls, содержащая все дочерние элементы управления. Найти дочерний элемент управления с помощью метода использования NameFind, который возвращает массив, поскольку может быть несколько элементов управления с тем же Name, но если вы убедитесь, что имена существуют, они уникальны, и вы знаете их тип (Button), могу просто взять первый элемент из массива и бросьте:

private void button10_Click(object sender, EventArgs e) 
{ 
    Button buttonNamedFred = (Button)this.Controls.Find("Fred", false)[0]; 

    buttonNamedFred.Text = "I'm Fred"; 
} 
2

вы можете получить доступ к кнопкам, перечисляя элементы управления, или вы можете создать список кнопок для дальнейшего использования, и использовать этот список позже.

Вот как вы это делаете со списком:

private IList<Button> addedButtons = new List<Button>(); 
private void createbuttons() { 
    int tot = 0; 
    int x = 100; 
    int y = 100; 

    while(tot < 9) { 
     string buttonsname = (tot + "button").ToString(); 
     Button creating = new Button(); 
     creating.Name = buttonsname; 
     creating.Size = new Size(100, 100); 
     creating.Click += delegate { 
      MessageBox.Show("You clicked me!"); 
     }; 
     creating.Text = buttonsname; 
     if(x > 300) { 
      y += 100; 
      x = 100; 
     } 
     creating.Location = new Point(x, y); 
     addedButtons.Add(creating); // Save the button for future reference 
     Controls.Add(creating); 
     tot += 1; 
     x += 100; 
    } 
} 

Теперь вы можете сделать это:

foreach (var btn : addedButtons) { 
    btn.Text = "Changed "+btn.Text; 
} 
+0

Спасибо, я подумал, что, возможно, нужно добавить список :) – Robjames970

+0

The список (фактически 'ControlCollection') уже существует. Нет необходимости поддерживать другую. – Dialecticus

+0

@Dialecticus Удерживая кнопки и другие элементы управления в отдельных коллекциях вне коллекции 'Controls', вы сохраняете циклы CPU для больших форм и также можете улучшить читаемость вашего кода. – dasblinkenlight

Смежные вопросы