2016-05-16 5 views
2

Я играю с окнами в C#. У меня есть окно с довольно несколько меток на нем: label01, label02, label03 и т.д. Каждая метка имеет кнопки, присвоенной ему: btn01, btn02 и т.д.Использование строк для идентификации объектов меток

Я хотел бы установить bnt01.visible = false, если его соответствующий label01.text == "".

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

Так что я надеялся использовать for цикл для перебора меток, найти пустые те, и скрыть свои соответствующие кнопки:

string[] mysystems = new string[34](); 
for (int i = 0; i < 34; i++) { 
    // Would like something similar to: mysystems[i]=label{0}.Text, i); 
    if(mysystems[i] != "") {} 
    else 
    { 
     btn[i].visible = false; 
    } 
} 

Я смотрел с помощью отражения, но не совсем понимаю, его концепции. Любая помощь очень ценится.

ответ

0

Вы можете создать класс под названием BUTTONLABEL

class ButtonLabel 
{ 
    Label Label; 
    Button Button; 

    public ButtonLabel(Button Button, Label Label) 
    { 
     this.Label = Label; 
     this.Button = Button; 
    } 

    public void HideIfEmpty() 
    { 
     if(Label.Text=="") 
      Button.Visible = false; 
    } 
} 

, а затем в вашей форме создать список BUTTONLABEL и сделать петлю Еогеасп и вызвать метод HideIfEmpty так:

List<ButtonLabel> List = new List<ButtonLabel>(); 
List.Add(new ButtonLabel(btn1,lbl1)); 
List.Add(new ButtonLabel(btn2,lbl2)); 
List.Add(new ButtonLabel(btn3,lbl3)); 
... 
... 

List.ForEach(I => 
{ 
    I.HideIfEmpty(); 
}); 
+0

На самом деле это не решает проблему, которую адресует OP, которая «... но надеялась не вводить имя каждой метки». –

3

Вы можете создать a ButtonLabelPair класс:

internal class ButtonLabelPair 
{ 
    internal Button AssociatedButton { get; private set; } 
    internal Label AssociatedLabel { get; private set; } 

    internal ButtonLabelPair(Button associatedButton, Label associatedLabel) 
    { 
     AssociatedButton = associatedButton; 
     AssociatedLabel = associatedLabel; 
    } 
} 

И тогда вы можете создать ли го ваших пар в какой-то момент на нагрузке:

var buttonLabelPairs = new List<ButtonLabelPair>(); 

buttonLabelPairs.AddRange(new ButtonLabelPair[] 
    {new ButtonLabelPair(btn01, label01), 
    new ButtonLabelPair(btn02, label02)}); 

Тогда вы могли бы сделать свой цикл, как это:

foreach (var pair in buttonLabelPairs) 
{ 
    pair.AssociatedButton.Visible = 
     !string.IsNullOrEmpty(pair.AssociatedLabel.Text); 
} 
0

Вы можете использовать цикл, чтобы сделать что-то подобного рода

for (int i = 1; i < 35; i++) { 
    string theControlNum = i < 1 ? "0" + i : i.ToString(); 
    if(this.Controls.Find($"label{theControlNum}").Text != "") {} 
    else 
    { 
     this.Controls.Find($"btn{theControlNum}").visible = false; 
    } 
} 

Как вы можете видеть, цикл начинается с 1, так что вам не нужно использовать i + 1, чтобы получить имя элемента управления, а также добавить к нему 0, если оно меньше двух цифр.

0

, если вы хотите, чтобы скрыть кнопки управления, когда метка пустая попробовать это: в проектировщиком файле:

Label lbl0 = new Label(); 
    lbl0.TextChanged += new System.EventHandler(Lbl0_TextCanged); 

в исходном файле формы:

public void Lbl0_TextCanged(object sender,EventArgs e) 
     { 
      if (lbl0.Text.Trim() == "") button1.Visible = false; 

     } 

я написал ' Trim() ', чтобы удалить пустую область в строке

0

Вам не нужно отражать, вы можете использовать коллекцию Controls. то есть:

void Main() 
{ 
    var f = new Form {Text = "Sample Form"}; 
    // add 10 buttons and 10 labels like btn00, ... btn09 lbl00, ... lbl09 
    for (int i = 0; i < 10; i++) 
    { 
     var btn = new Button { Text = "Button" + i, 
      Name="btn" + i.ToString().PadLeft(2,'0'), 
      Top = i * 25, Left = 10, Width = 100 }; 
     var lbl = new Label { Text = i%2 == 0?"":"Visible", 
      Name="lbl" + i.ToString().PadLeft(2,'0'), 
      Top = i * 24, Left = 120}; 
     f.Controls.Add(btn); 
     f.Controls.Add(lbl); 
    } 

    // make a button Visible = false if corrospending label is empty or null 
    foreach (Label l in f.Controls.OfType<Label>().Where(l => Regex.IsMatch(l.Name, @"lbl\d{2}"))) 
    { 
     if (string.IsNullOrEmpty(l.Text)) 
     { 
      f.Controls.OfType<Button>().Single(b => b.Name == l.Name.Replace("lbl","btn")).Visible = false; 
     } 
    } 
    f.Show(); 
} 
0

Вы могли бы просто сделать это

for (var i = 0; i < length; ++i) { 
    if (form.Controls[$"label{i:D2}"].Text == "") { 
     form.Controls[$"btn{i:D2}"].Visible = false; 
    } 
} 

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

EDIT: Если у вас нет C# 6.0, замените интерполированную строку с string.Format

string.Format("label{0:D2}", i) 
+0

этикетка * 01 * нет этикетка1 –

+0

@AlfieGoodacre исправленный. Спасибо – Shreevardhan

+0

Так я и хотел, но, к сожалению, я запускаю VS2013 и пока не могу использовать интерполированные строки (C# 6/vs2015), насколько я знаю. – Steve

0

Вы можете использовать Dictionary<Button, string> где ключ кнопка и значение этого ключа является текстом ярлыка. Тогда вы можете перебирать словарь:

var dictionary = new Dictionary<Button, string>(); 
dictionary.Add(button1, label1.Text); 
dictionary.Add(button2, label2.Text); 
// more pairs... 
foreach(var key in dictionary.Keys) 
{ 
    if(dictionary[key] == "") 
    { 
     key.Visible = false; 
    } 
} 
0

Так что я решил сбросить 2 кнопки для каждой метки и просто использовать выбранный текст из меток. Это было не так много больше кода и нашел некоторые из них на сайте:

private void btnShutdown_Click(object sender, EventArgs e) 
     { 
      //Shutdown the highligted systems 
      List<Control> list = new List<Control>(); 
      GetAllControl(this, list); 
      DoShutdown(list); 
     } 

     private void btnRestart_Click(object sender, EventArgs e) 
     { 
      //Restart the highighted systems 
      List<Control> list = new List<Control>(); 
      GetAllControl(this, list); 
      DoRestart(list); 
     } 

     private void DoRestart(List<Control> list) 
     { 
      foreach (Control control in list) 
      { 
       if (control.BackColor == System.Drawing.Color.Aqua) 
       { 
        restart m = new restart(); 
        m.restartwin(control.Text); 

       } 
      } 
      MessageBox.Show("Restart sent!", "Restart", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 

     private void DoShutdown(List<Control> list) 
     { 
      foreach (Control control in list) 
      { 
       if (control.BackColor == System.Drawing.Color.Aqua) 
       { 
        powerApp m = new powerApp(); 
        m.poweroffwin(control.Text); 

       } 
      } 
      MessageBox.Show("Shutdown sent!", "Shutdown", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 


     private void GetAllControl(Control c, List<Control> list) 
     { 
      foreach (Control control in c.Controls) 
      { 
       list.Add(control); 

       if (control.Controls.Count > 0) 
       { 
        GetAllControl(control, list); 
       } 

      } 
     } 

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