2013-11-04 6 views
6

Ich arbeite in C# in einem vorhandenen WinForm-Projekt. Der ursprüngliche Code verwendet Tag, um Hardwareadressinformationen für eine Reihe von Textfeldern zu übermitteln, die bestimmte Hardwareregister in einem verbundenen Mikrocontrollersystem darstellen. Ich weiß, wie man ein unbekanntes Steuerelement findet, indem ich mit der Control.ControlCollection.Find-Methode nach seinem Namen suche, aber es ist mir unklar, ob ich das Steuerelement anhand des Tags finden kann (in diesem Fall nur ein String).Fähigkeit, WinForm-Steuerelement über die Tag-Eigenschaft zu finden

+0

Iterieren Sie über die Control-Sammlung und überprüfen Sie den spezifischen Tag-Wert? – sab669

+0

Sie sollten Ihr Design ändern, sollten wir eine solche Aufgabe nicht ausführen. Natürlich müssen Sie alle Steuerelemente durchlaufen und das "Tag" jedes einzelnen überprüfen, bis Sie es finden. Die interne Implementierung von 'Find' sollte dasselbe tun. Die Geschwindigkeit hängt alles von der "Datenstruktur" ab. –

Antwort

8

up Folgen auf meinen Kommentar:

private void FindTag(Control.ControlCollection controls) 
{ 
    foreach (Control c in controls) 
    { 
     if (c.Tag != null) 
     //logic 

     if (c.HasChildren) 
      FindTag(c.Controls); //Recursively check all children controls as well; ie groupboxes or tabpages 
    } 
} 

Dann können Sie die Steuerelementname in der if-Anweisung erhalten und tun, was Sie wollen von dort aus tun.

Fügen Sie einfach einen Edit zu dieser Lösung hinzu, da er einige Jahre später immer noch die seltene Upvote erhält. Sie können diese Lösung auch ändern, um den Typ der Kontrolle zu überprüfen, die c ist und verschiedene Arten der Logik auch tut. Also, wenn Sie über alle Ihre Steuerelemente Schleife und behandeln eine Textbox One Way und RadioButon eine andere Möglichkeit, können Sie das auch tun. Ich musste das auch bei einigen Projekten tun, bei denen ich den obigen Code nur geringfügig ändern konnte, um diese Arbeit zu erledigen. Nicht unbedingt relevant für die Frage des OP, aber ich dachte, ich würde es hinzufügen.

+1

Meine Antwort hatte eine Einschränkung. Es ist nicht rekursiv. – Tilak

+0

@Tilak, Ihre ursprüngliche Lösung war sehr effizient in dem Fall, in dem Rekursion nicht benötigt wurde. Danke für den Vorschlag. –

+0

@ sab669, danke für den Vorschlag. Das funktioniert großartig. –

5

können Sie LINQ verwenden Kontrollen zu finden, basierend auf Tag

var items = parentControl.ControlCollection; 
var item = items.Cast<Control>().FirstOrDefault(control => String.Equals(control.Tag, tagName)); 
4
public static Control FindByTag(Control root, string tag) 
{ 
    if (root == null) 
    { 
     return null; 
    } 

    if (root.Tag is string && (string)root.Tag == tag) 
    { 
     return root; 
    } 

    return (from Control control in root.Controls 
      select FindByTag(control, tag)).FirstOrDefault(c => c != null); 
} 

Übergeben Sie das äußerste Steuerelement an es (d. H. Das Formular oder den Container, den Sie durchsuchen möchten). Beachten Sie, dass dies das Root-Steuerelement in die Suche einschließt.

+0

danke für den Vorschlag. –

Verwandte Themen