2016-04-08 7 views
1

Ich habe eine benutzerdefinierte Erweiterungsmethode, die ein Steuerelement über eine Zeichenfolge finden und einen Klick auf das Steuerelement ausführen soll (soll). Ich habe einen Breakpoint eingerichtet und es geht in den if (c is ToolStripMenuItem) Wer hat eine Idee, wo ich falsch liege? Dies ist auf WinForms.Konnte Steuerelement von Zeichenfolge nicht finden

private void PerformClickfromString() 
    { 
     string item = File.ReadAllText(@"C:\controltest.txt"); 

     foreach (var c in this.Controls) 
     { 
      if (c is ToolStripMenuItem) 
      { 
       var x = (ToolStripMenuItem)c; 

       if (x.Name == item) 
       { 
        x.PerformClick(); 
       } 
      } 
     } 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     PerformClickfromString(); 
    } 

Jede Hilfe wird geschätzt.

+0

Ich würde alle x.Names vor der inneren Prüfung ausdrucken und sehen, welche Kontrollen erreicht werden. – TaW

Antwort

1

Um alle verschachtelten Elemente Sie eine rekursive Suche benötigen bedienen. Hier ist ein Beispiel; Es sammelt alle Artikel in einer List<ToolStripMenuItem> und die Prüfungen für den gesuchten Namen. Ich habe diese Zeichenkette zur Unterschrift Ihres Anrufs hinzugefügt.:

private void PerformClickfromString(string s) 
{ 
    foreach (var c in this.Controls) 
    { 
     List<ToolStripMenuItem> items = new List<ToolStripMenuItem>(); 

     if (c is MenuStrip) 
     { 
      foreach (ToolStripMenuItem tsItem in ((MenuStrip)c).Items) 
      { 
       GetAllMenuItems(items, tsItem); 
      } 
     } 
     ToolStripMenuItem found = items.Find(x => x.Name == s); 
     if (found != null) found.PerformClick(); 
    } 
} 


void GetAllMenuItems(List<ToolStripMenuItem> items, ToolStripMenuItem menu) 
{ 
    items.Add(menu); 
    foreach(ToolStripMenuItem m in menu.DropDownItems) 
     GetAllMenuItems(items, m); 
} 
+0

Danke für die Erklärung und das Beispiel! Funktioniert perfekt. – EyeSeeSharp

1

Die ToolStripMenuItem ist keine Kontrolle betrachtet, müssen Sie statt dessen Container

if(c is MenuStrip) 
{ 
    foreach(ToolStripMenuItem tsItem in ((MenuStrip)c).Items) 
    { 
     if (tsItem.Name == item) 
     { 
      tsItem.PerformClick(); 
     } 
    } 
} 
+0

Ich bekomme diesen Fehler, wenn ich dies versuche: foreach-Anweisung kann nicht auf Variablen vom Typ funktionieren ... enthält keine öffentliche Definition für 'GetEnumerator' – EyeSeeSharp

+0

Versuchen Sie die neue Bearbeitung –

+0

'foreach-Anweisung kann nicht auf Variablen des Typs 'System.Windows. Forms.MenuStrip 'weil' System.Windows.Forms.MenuStrip 'keine öffentliche Definition für' GetEnumerator' enthält – EyeSeeSharp