Как установить многокнопочный текст во время выполнения в WinForms? - PullRequest
1 голос
/ 25 января 2012

Я использую Winform. В этом я установил 20 кнопок и кнопки вверх и вниз, как показано ниже. Текст этих кнопок имеет значение button1 = 1; кнопка 2 = 2; ... button20 = 20 во время запуска. Я сделал это.

enter image description here

Когда я нажимаю кнопку «Вниз», текст из 20 кнопок изменяется с 21 на 40; и кнопки «Вверх» возвращает 1 к 20.

btn_Down click event

button21.Text = "21";
button22.Text = "22";
...
..
button40.Text = "40";

and btn_Up Click event

btn_Down click event

button1.Text = "1";
button2.Text = "2";
...
..
button20.Text = "20";

Есть ли какой-нибудь простой способ закодировать это?

Обновлено -

Когда я пробую код sll,

int index = 0;

foreach (var control in this.tableLayoutPanel1.Controls)
 {
     var button = control as Button;
     if (button != null)
     {
        button.Text = String.Format("{0}", index);
        index++;
     }
}

Я получил ниже. Вверх и вниз также изменен, и порядок номеров обратный.

enter image description here

Пожалуйста, обновите ответы.

Ответы [ 4 ]

2 голосов
/ 25 января 2012

Если кнопки расположены в порядке от 1 до 20, вам не нужно извлекать число из имени кнопки, просто используйте индексную переменную автоинкремента:

int index = 0;
// either form.Controls or this.Controls dedepnds on where you put this code
foreach (var control in form.Controls)
{
   var button = control as Button;
   if (button != null)
   {
      button.Text = String.Format("Button #{0}", index);     
      index++;
   }      
}

РЕДАКТИРОВАТЬ: Попробуйте, проверьте nopt, так как у вас нет настройки среды под рукой

Чтобы избежать влияния кнопок «вверх» и «вниз», пометьте их специальным значением тега, таким как Tag = "ControlButton"

using System.Linq;
var buttons = this.tableLayoutPanel1.Controls
                                    .OfType<Button>()
                                    .Where(b => b.Tag != "ControlButton");
int index = buttons.Count();
foreach (var button in buttons)
{
    button.Text = String.Format("Button #{0}", index);     
    index--;
}
2 голосов
/ 25 января 2012

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

В этом случае вы можете перебрать элементы управления формы и проверить, является ли она кнопкой.

Например:

foreach(var control in base.Controls)
{
    if (control is Button)
    {
        var button = (Button) control;
        button.Text = ExtractNumber(button.Name);
    }
}

Более подробную информацию об итерации элементов управления можно найти здесь:

http://www.dotnetperls.com/control

Метод ExtractNumber (...) извлекает число из свойства Name кнопки.

private string ExtractNumber(string value)
{
    var number = Regex.Match(value, @"\d+").Value;
    return number;
}
1 голос
/ 25 января 2012

Простым способом было бы установить массив объектов Button в вашей форме.Каждый элемент в массиве будет одной из ваших кнопок.Затем вы можете позже перебирать кнопки, используя простой цикл for.

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

for(int i=0; i<buttons.Length; i++)
{
   buttons[i].Text = (i+1).ToString();
}

Но что вы пытаетесь сделать?Вероятно, есть более эффективное решение вашей проблемы.

1 голос
/ 25 января 2012

Может быть, это может помочь вам: C # создать массив элементов управления

Вы можете создать массив кнопок и назначить текст кнопки, например:

int i = start_value //e.g. 0 or 20 or 40...
foreach (button b in buttons)
{
    b.Text = i.ToString();
    i++;
}
...