C # цикл через массив заданных меток - PullRequest
1 голос
/ 17 октября 2011

Мне немного сложно описать, но этот псевдо C # должен объяснить, что я пытаюсь сделать.

На форме окна есть большое количество меток.

Я хотел бы изменить цвет текста некоторых из этих ярлыков.

private void allBlackLabels()
{
    int[] lray = { 1, 2, 3, 5, 6 };
    foreach (int i in lray)
    {
        label[i].Forecolor = Color.Black;
    }            
}

Я надеюсь, это объясняет, что я пытаюсь сделать здесь.

Теперь очевидно, что это не сработает.из-за лейбла [i], но как мне обойти это?

Ответы [ 9 ]

4 голосов
/ 17 октября 2011

Это может не сработать, потому что ваши ярлыки не хранятся в массиве. Следующий код будет работать, учитывая, что вы знаете имена меток, которые нужно изменить:

Label[] lray = { labelOne, labelDifferent, labelWhatElse };
foreach (Label label in lray)
{
    label.ForeColor = Color.Black;
}            
1 голос
/ 17 октября 2011
foreach (Control c in this.Controls)
{
    if (c is Label)
    {
        // do stuff
    }
}

Это захватит все дочерние элементы управления формы (при условии, что этот код находится в коде формы) и проверит, являются ли они метками.Просто сделайте любую манипуляцию вместо комментария.

1 голос
/ 17 октября 2011

Это бы хорошо работало, если бы у вас был массив меток.

Если у вас есть только много переменных, например:

private Label label1;
private Label label2;
private Label label3;
private Label label4;
private Label label5;

тогда сложнее. Опции:

  • Измените код, чтобы использовать вместо него массив. Не так приятно в конструкторе, но более логично
  • Используйте Controls.Find с каждым идентификатором
  • Выполните итерацию по Controls, чтобы найти все Label элементы управления, независимо от имени
0 голосов
/ 23 декабря 2014

Я заметил, что вы исключили 4 из массива "lray" в вашем примере. Если вы хотите исключить автоматическое обновление одной или нескольких меток кодом (возможно, чтобы выделить одну из группы), попробуйте это.

    private void allBlackLabels()
    {    
        foreach (Control control in this.Controls)            
        {
            if (control is Label && control.Name != "label4")
            {
                (control as Label).Forecolor = Color.Black;
            }
        }
    }
0 голосов
/ 17 октября 2011

Попробуйте что-нибудь вроде этого:

List<string> ListLabelNames = new List<string>() { /* Your label name list*/ };

foreach (Label TmpLabel in this.Controls.OfType<Label>())
{
    foreach (string strTmp in ListLabelNames)
    {
        if (String.Compare(TmpLabel.Name, strTmp, true) == 0)
            TmpLabel.ForeColor = System.Drawing.Color.Black;
    }
}

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

0 голосов
/ 17 октября 2011

Если вы хотите добиться этого для всех ярлыков в форме, то может помочь что-то вроде этого:

foreach (Control control in this.Controls) {
     if (control is Label) {
         (control as Label).Forecolor = Color.Black;
     }
}

Однако, если вам нужно изменить только подмножество всех ярлыков, вам нужно либо сохранитьимена или индексы меток, которые необходимо изменить.Это потому, что this.Controls имеет два индексатора, int32 и строковый.Таким образом, вы можете попробовать что-то вроде этого

private void allBlackLabels()
{
    int[] lray = { 1, 2, 3, 5, 6 };
    foreach (int i in lray)
    {
         this.Controls[i].Forecolor = Color.Black;
    }            
}

Стоит отметить, что упорядочение в this.Controls, скорее всего, будет выглядеть не так, как ваш массив lray.Надеюсь, это поможет

0 голосов
/ 17 октября 2011

в псевдо c #:

List<String> controlsToChange =new List<String>{"lable1Name","lable2Name"};
foreach(Control control in form.Controls)
{
    if(control.GetType().Equals(typeof(Lable))
    {
         if( controlsToChange.Contains(control.Name)
         {
              control.Forecolor=Colour.Black;
         }
    }
}
0 голосов
/ 17 октября 2011
private void allBlackLabels()
{
    int[] lray = { 1, 2, 3, 5, 6 };
    foreach (int i = 0; i < lray.Length; i++)
    {
        ((Label)this.Controls["label" + i]).ForeColor = Color.Black;
    }            
}
0 голосов
/ 17 октября 2011

Вы можете создать массив самостоятельно.Это включает в себя немного затрат на обслуживание / риск каждый раз, когда ваша форма меняется.Примечание: вы, вероятно, хотите поместить бит создания массива в событие Form Loaded, а не в конструктор или, по крайней мере, после вызова InitializeComponent, чтобы ваши элементы управления были настроены.

Или вы можете выполнить итерацию для всех дочерних элементов вашей формы (this.Controls из метода Form), пометить свои метки определенным тегом или получить все метки, если это ваша цель здесь.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...