Как переименовать несколько кнопок в одном цикле в C # - PullRequest
3 голосов
/ 15 июля 2011

У меня есть программа, похожая на броненосец, где есть сетка кнопок 10х10.В начале программы мне бы хотелось, чтобы весь текст кнопок был изменен на «---», что показывает, что никто не стрелял по этой координате.Я не могу найти способ переименовать все кнопки в одном цикле.Все кнопки имеют названия b00, b01, b02 ... которые показывают их координаты.первое число - это строка, а второе число - столбец.(т. е. b69 представляет строку 7, столбец 10).

Надеюсь, вы поможете!

Заранее спасибо!

Люк

Ответы [ 6 ]

5 голосов
/ 15 июля 2011

Вы также можете использовать Метод расширения OfType () для фильтрации по указанному типу.

foreach (Button btn in this.Controls.OfType<Button>())
   {

   btn.Text="New Name";
   }

Как вы можете видеть, используя метод расширения OfType, вам не нужно приводить элемент управления к типу кнопки

Надеюсь, что поможет.

Привет

1 голос
/ 15 июля 2011

Рассмотрите возможность добавления каждой из кнопок в список:

// instantiate a list (at the form class level)
List<Button> buttonList = new List<Button>();

// add each button to the list (put this in form load method)
buttonList.add(b00);  
buttonList.add(b01);
... etc ...

Затем вы можете установить данную кнопку следующим образом:

buttonList(0).Text = "---"  // sets b00

Или все кнопки таким образом:

foreach (Button b in buttonList) {
   b.Text = "---";
   }

Другие возможности имеются в большом количестве:

  • Размещение кнопок в двумерном массиве, чтобы разрешить адресацию по строкам и столбцам. Вы все еще можете сделать foreach над массивом, чтобы установить все сразу.

  • Создание кнопок (и установка размера и расположения) программно, чтобы избежать необходимости создавать все кнопки в конструкторе. Это также позволит вам установить размер сетки во время выполнения.

1 голос
/ 15 июля 2011

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

Примерно так:

foreach (Control c in myForm.Controls)
{
  if (c is Button)
  {
    ((Button)c).Text = "---";
  }
}
1 голос
/ 15 июля 2011

Как насчет этого:

    foreach (Control c in this.Controls) {
        if (c is Button) {
            ((Button)c).Text = "---";
        }
    }

Этот фрагмент просматривает все элементы управления в форме (this), проверяет, является ли каждый из них кнопкой, и установите ли для свойства Text значение "---",С другой стороны, если бы ваши кнопки были на каком-то другом контейнере, например на панели, вы бы заменили this.Controls на yourPanel.Controls.

0 голосов
/ 01 марта 2014
foreach(Control c in this.Controls)
{
if(c.type==new Button().type)
{
Button b=(Button)c;
b.Text="";
}
}
0 голосов
/ 15 июля 2011

То, что я делаю в подобных ситуациях, - это сохранение элементов управления, которыми я хочу часто манипулировать, в коллекцию List или, предпочтительно, IEnumerable<>, которую я обычно инициализирую при построении или в обработчике события Load объектаконтроль (например, если эти элементы управления содержатся в Form или в GroupBox).Делая это, я надеюсь уменьшить необходимость поиска этих элементов управления каждый раз, когда мне нужна эта коллекция.Если вам нужно сделать это только один раз, я бы не стал добавлять коллекцию buttons.

Итак, что-то вроде этого:

// the collection of objects that I need to operate on, 
// in your case, the buttons
// only needed if you need to use the list more than once in your program
private readonly IEnumerable<Button> buttons;

В конструкторе или обработчике события загрузки:

this.buttons = this.Controls.OfType<Button>();

И затем, когда мне нужно обновить эти элементы управления, я просто использую эту коллекцию:

foreach (var button in this.buttons)
{
    button.Text = @"---";

    // may wanna check the name of the button matches the pattern
    // you expect, if the collection contains other 
    // buttons you don't wanna change
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...