2016-05-23 1 views
3

Ich habe eine tabcontrol namens tabControl1, die Registerkarten enthält. Button1 fügt beim Klicken einen Tab hinzu, fügt einen Browser hinzu und navigiert dann zu google.com. Button2 sollte in der Lage sein, den Browser in der ausgewählten Registerkarte zu dem Text in Text1 zu navigieren.Wie kann ich ein Steuerelement in der ausgewählten Registerkarte ändern - C#

ich dies tun könnte leicht wenn C# Zeiger wie folgt hatte:

WebBrowser* thebrowser; 

Button1_Click(object sender, EventArgs e){ 
    TabPage newtab = new TabPage(); 
    WebBrowser newbrowser = new WebBrowser(); 
    newtab.Controls.Add(newbrowser); 
    newbrowser.Navigate("google.com"); 
    newtab.Click+=delegate {thebrowser = &newbrowser;}; 
    tabControl1.TabPages.Add(newtab); 
} 

Button2_Click(object sender, EventArgs e){ 
    thebrowser->Navigate(Text1.Text); 
} 

Dass, wenn C# hatte Zeiger. Wie kann ich das mit dem richtigen C# -Code erreichen? Ich hoffe, Sie haben meine Frage verstanden und entschuldigen mich für etwaige Fehler.

Vielen Dank im Voraus :)

+0

Objektreferenzen * sind * Zeiger. Sie müssen nur das SelectedIndexChanged-Ereignis von TabControl implementieren, verwenden Sie den Browser = (WebBrowser) tabControl1.SelectedTab.Controls [0]; –

Antwort

2

Nun, ich würde wahrscheinlich die Dictionary<int,Webbrowser> Weg gehen. Etwas wie:

Dictionary<int, WebBrowser> browsers = new Dictionary<int, WebBrowser>(); 

Button1_Click(object sender, EventArgs e){ 
    TabPage newtab = new TabPage(); 
    WebBrowser newbrowser = new WebBrowser(); 
    newtab.Controls.Add(newbrowser); 
    newbrowser.Navigate("google.com"); 
    tabControl1.TabPages.Add(newtab); 
    browsers.Add(tabControl1.TabCount-1, newbrowser); 
} 

Button2_Click(object sender, EventArgs e){ 
    browsers[tabControl1.SelectedIndex].Navigate(Text1.Text); 
} 
+0

Greaat! Genau das, was ich wollte! –

+0

Aber ich habe eine Frage, warum behandelt der Browser im Wörterbuch als ein Zeiger/Verweis und nicht als Kopie? o.O –

+0

@StormBreaker Dictionary Die -Klasse ist als Hash-Tabelle implementiert. Lesen Sie dies, wenn Sie weitere Informationen wünschen: [MSDN] (https://msdn.microsoft.com/en-us/library/xfhwa508 (v = vs.110) .aspx) – Pikoh

2

Für das, was ich verstehe Sie mehr als eine Registerkarte haben müssen, so dass mehr als ein Browser zur gleichen Zeit geöffnet, so dass eine lobaler Variable wird nicht funktionieren.

Eine Möglichkeit wäre, den Browser auf der ausgewählten Registerkarte zu durchsuchen.

Button2_Click(object sender, EventArgs e) 
{ 
    foreach (Control item in page.Controls) 
    { 
     if (item is WebBrowser) 
     { 
      ((WebBrowser)item).Navigate(Text1.Text); 
      break; 
     } 
    } 
} 
+0

Danke, aber das ist keine effiziente Lösung, ich meine, wenn ich mehr Sachen hinzufügen und aktualisieren will, würde dies langsamer werden. Ich brauche eine schnelle Alternative zu Zeigern. –

+0

Um es zu verlangsamen, werden Sie eine Menge brauchen Kontrollen in der TabPage, Hunderte von ihnen. Ein anderer Weg wäre das Erstellen eines benutzerdefinierten Steuerelements, das von der Registerkarte erbt und eine Browsereigenschaft hinzufügt. Dann brauchen Sie nur ((yourCustomClass) tabControl1.SelectedPage) .browser.Navigate() – Aimnox

+0

Oh okay, dann vielen Dank! –

Verwandte Themen