2016-05-16 10 views
2

Ich spiele mit Windows Forms in C#. Ich habe ein Fenster mit ganz wenigen Etiketten drauf: LABEL01, label02, label03 usw. Jedes Etikett auf eine Schaltfläche zugeordnet ist: btn01, btn02 usw.Verwenden von Zeichenfolgen zum Identifizieren von Etikettenobjekten

Ich mag würde bnt01.visible = false setzen, wenn seine label01.text == "" entspricht.

Ich habe versucht, ein Array zu erstellen, um die Etiketten einzulesen, aber ich hatte gehofft, nicht in jedem Etikettnamen eingeben zu müssen.

So gehofft, ich wurde eine for-Schleife durch die Etiketten zu verwenden, um die leeren diejenigen finden, und verstecken ihre jeweiligen Tasten:

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; 
    } 
} 

Ich habe auf die Reflexion sah, aber nicht ganz verstehen sein Konzept. Jede Hilfe wird sehr geschätzt.

Antwort

0

Sie können eine Klasse erstellen, in dem Formular eine Liste der Button erstellen und eine foreach-Schleife tun und rufen HideIfEmpty Methode wie folgt genannt Button

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; 
    } 
} 

und dann:

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

Dies löst nicht wirklich das Problem, das das OP adressiert, das ist "... aber hatte gehofft, nicht jeden Markennamen eingeben zu müssen." –

3

könnten Sie erstellen eine ButtonLabelPair Klasse:

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; 
    } 
} 

Und dann könnten Sie eine li erstellen st Ihren Paare an einem gewissen Punkt auf Last:

var buttonLabelPairs = new List<ButtonLabelPair>(); 

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

Dann könnten Sie Ihre Schleife wie folgt tun:

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

Sie eine for-Schleife etwas von ähnlicher Natur zu tun, können

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; 
    } 
} 

Wie Sie sehen können, beginnt die Schleife bei 1, so dass Sie i + 1 nicht verwenden müssen, um den Steuerelementnamen zu erhalten, sowie 0 hinzuzufügen, wenn es weniger als zwei Ziffern lang ist.

0

, wenn Sie ein Button-Steuerelement ausblenden möchten, wenn ein Etikett leer versuchen Sie dies: in Designer-Datei:

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

in der Quelldatei der Form:

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

     } 

Ich schrieb ' Trim() 'zum Löschen des leeren Bereichs in der Zeichenfolge

0

Sie brauchen keine Reflexion, Sie können Controls-Auflistung verwenden. dh:

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

Sie könnten einfach tun dies

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

wo length die Anzahl der Label- und Button-Elemente würden Sie erstellt haben, und form ist das übergeordnete Form-Objekt.

EDIT: Wenn Sie C# 6.0 nicht haben, mit interpolierten String ersetzen string.Format

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

Etikett * 01 * nicht Etikett1 –

+0

@AlfieGoodacre Korrigiert. Danke – Shreevardhan

+0

Dies ist die Art, wie ich gehen wollte, aber leider ich laufen VS2013, und kann interpolierte Zeichenfolgen noch nicht verwenden (C# 6/vs2015), soweit ich weiß. – Steve

0

Sie Dictionary<Button, string> verwenden können, wo der Schlüssel-Taste ist und der Wert des Schlüssels ist Text des Labels. Dann können Sie Wörterbuch iterieren:

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

Also beschloss ich, die zwei Tasten für jedes Etikett dump und nur ausgewählten Text aus den Etiketten verwenden. Es war nicht, dass mehr Code viel und Online einige davon gefunden:

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); 
       } 

      } 
     } 

Um alle, danke für die schnellen Antworten und Hilfe, ich viele verschiedene Ideen für die Straße hinunter gelernt.

Verwandte Themen