2016-06-30 10 views
0

ausführen Ich habe gesucht, kann dieses Problem jedoch nicht finden.Methode auf der in Code erstellten Registerkarte

Auf Formular 1 im Code, ich erstellen eine TabPage mit einem Benutzersteuerelement darin und dann fügen Sie die TabPage zu form1.TabControl und rufen Sie die öffentliche Methode LoadData auf dem Benutzersteuerelement. Problem: Ich muss die Daten neu laden, wenn die neue Registerkarte aktiviert ist oder den Fokus erhält. Wenn ich die Registerkarte nicht im Code erstellen würde, könnte ich einfach das selectedIndex change-Ereignis von TabControl verwenden, aber es muss in Code erstellt werden. Wie kann ich das tun? Form 1:

private void CreateNewTab() 
    { 

     TabPage tp1 = new TabPage(); 
     tp1.Text = "HSV"; 
     tp1.Name = "tpHSV"; 
     if (tabContMain.TabPages.ContainsKey(tp1.Name) == false) 
     { 
      HSVControl hsvc = new HSVControl(); 
      hsvc.Dock = DockStyle.Fill; 

      hsvc.LoadData(); 

      tp1.Controls.Add(hsvc); 
      tabContMain.TabPages.Add(tp1); 

     } 

    } 

==== EDIT =============== Danke für die Kommentare. Lass mich versuchen, mein Problem besser zu erklären. Das selectedIndex-Änderungsereignis funktioniert einwandfrei. Ich kann auf die Registerkarte über den Text oder den Namen zugreifen. Das Problem ist der Aufruf der Methode hsvc.LoadData(). Ich muss diese Methode aufrufen, wenn auf die Registerkarte mit dem Benutzersteuerelement hsvc geklickt wird. Die LoadData() ist öffentlich, aber ich finde keine Möglichkeit, in Form1 (die das SelectedIndex-Änderungsereignis enthält) zuzugreifen. Ich brauche einen Verweis auf HSVC-Kontrolle.

habe ich eine Eigenschaft der Klasse Form1 wie folgt aus:

private UserControl mControl; 

Zuweisung es dann:

 HSVControl hsvc = new HSVControl(); 
     hsvc.Dock = DockStyle.Fill; 
     hsvc.LoadData(); 
     mControl=hsvc; 

Dann ist es in SelectedIndex Änderungsereignis nennen, aber es ist immer noch da nicht sichtbar.

+2

Verwendung hier das gleiche Ereignis. Sie können den Ereignishandler im Code zuweisen. Siehe dieses msdn [Beispiel] (https://msdn.microsoft.com/en-us/library/edzehd2t (v = vs.110) .aspx # Anchor_3). Oder schauen Sie in Ihren vom Designer generierten Code, um zu sehen, wie er mit Ereignissen umgeht. Oder schreiben Sie in Ihrer Methode 'tabContMain.SelectedIndexChange + =' und drücken Sie dann zweimal die 'Tab'-Taste. –

+0

Scheint wie 'TabControl.SelectedIndexChanged' sollte gut funktionieren.Welche Schwierigkeiten hast du? Ist es nur so, dass Sie in diesem Event-Handler keine Möglichkeit haben, auf hsvc zu verweisen? Wenn dies der Fall ist, fügen Sie Ihrer Formularklasse einfach ein Feld hinzu, um einen Verweis darauf zu halten. – adv12

+0

So rufen Sie 'hsvc.LoadData()' im 'SelectedIndexChanged' Ereignis auf. Im Moment habe ich meine Antwort geändert. – mostafa8026

Antwort

0

TabControl Hat eine Eigenschaft namens SelectedTab. verwenden Sie diese Eigenschaft wie:

private void CreateNewTab() 
{ 

    TabPage tp1 = new TabPage(); 
    tp1.Text = "HSV"; 
    tp1.Name = "tpHSV"; 
    if (tabContMain.TabPages.ContainsKey(tp1.Name) == false) 
    { 
     HSVControl hsvc = new HSVControl(); 
     hsvc.Dock = DockStyle.Fill; 

     hsvc.LoadData(); 

     tp1.Controls.Add(hsvc); 
     tabContMain.TabPages.Add(tp1); 
     tabContMain.SelectedTab = tp1; 

    } 

} 

In der letzten Zeile, macht es die TabControl sein SelectedIndexChanged Ereignis zu nennen. Rufen Sie dann LoadData Ereignis in diesem Ereignis auf:

0

Ok, nochmals vielen Dank für die Hilfe. Die Lösung starrte mich irgendwie an. Ich bin mir nicht sicher, dass es das Beste ist, aber das hat sehr gut funktioniert.

Erstellt Schnittstelle:

public interface IControlBase 
{ 
    void LoadData(); 
} 

Hatte Usercontrol-Schnittstelle implementieren:

HSVControl : UserControl,IControlBase 

und die bestehende Loaddata having() Methode auf dem Usercontrol.

Änderung

private UserControl mControl; 

zu

private IControlBase mControl; 

Dann in SelectedIndex Änderung:

mControl.LoadData(); 
+0

... oder Sie hätten 'mControl' als' HSVControl' deklariert und 'IControlBase' komplett übersprungen. – adv12

+0

YEP, du hast Recht. Getestet und funktioniert gut. Ich werde es als Schnittstelle verlassen, da ich mehr Registerkarten mit ähnlichen Bedürfnissen/Kontrollen haben werde. Danke für den Tipp. –

+0

Aus einer Design-Perspektive ist der einzige Vorteil, eine Schnittstelle für diese und zukünftige ähnliche TabPages zu definieren, anstatt sie streng nach ihren tatsächlichen Typen zu betrachten, die Fähigkeit, sie generisch zu behandeln (z. B. ein Array von ihnen an eine Funktion zu übergeben) akzeptiert sie als IControlBase und ruft IControlBase-Methoden auf. Selbst wenn die Schnittstelle für einen solchen Code benötigt wird, ist es wahrscheinlich immer noch am besten, die Felder als Instanzen ihrer tatsächlichen Typen zu deklarieren, sodass Sie typspezifische Methoden an anderen Stellen im Code aufrufen können, ohne sie zuerst auf ihre tatsächlichen Typen zurückzuwerfen. – adv12

Verwandte Themen