2016-06-05 4 views
-1

Ich arbeite an Projekt WinForm-Anwendung. Ich versuche, ein Benutzersteuerelement zu einem Panel auf dem Hauptformular hinzuzufügen. Hier ist, was ich getan habe, ich erstellte eine öffentliche statische Methode auf dem Hauptformular, so dass ich es von überall aufrufen kann, ohne das Hauptformular instanziieren.Wie kann ich einem Panel auf dem Hauptformular ein UserControl hinzufügen?

Ich erhalte einen Kompilierungsfehler "Ein Objektverweis wird für ein nicht statisches Feld, Methode oder Eigenschaft benötigt".

Wenn ich die Methode als nicht-statisch das Übersetzungsfehler wird verschwunden sein schaffen, aber ich werde es nicht zu nennen Lage, ohne Aufgabe der Hauptform zu schaffen.

Was ich erreichen möchte ist in der Lage sein, jede Usercontrol im Panel ‚pnlContainer‘ zu öffnen auf meinem Hauptformular ‚frmMain‘.

Wenn die Haupt-Formular geladen Ich möchte die Methode aufrufen, ohne erneut das Hauptformular instanziieren. Zum Beispiel

public static void showUC(UserControl uc) 
{ 
    pnlContainer.Controls.Clear(); 
    GC.Collect(); 
    uc.Dock = DockStyle.Fill; 
    pnlContainer.Controls.Add(uc); 
} 

Ich mag diese Methode zu rufen wie diese

frmMain.showUC(new ucClientList); 

Aus einer anderen Klasse.

mir genau erklären lassen, was ich erreichen will. Ich habe ein Formular Control ‚frmMain‘ genannt, die ein Panel Steuerelement mit dem Namen ‚pnlContainer‘ enthalten, und ich möchte Usercontrol in sie zu laden, habe ich UserControl1 und UserControl2. Nun betreibe ich das Programm und die frmMain Lasten, ich will UserControl1 auf das Panel pnlContainer hinzuzufügen und ich habe eine Schaltfläche in der UserControl1, die die gleiche Platte laden UserControl2 in auf dem Hauptformular soll, wenn ich darauf klicken. Wie implementiere ich das?

+0

Wenn du eine andere Art der Implementierung hast, teile es bitte mit. Vielen Dank. –

Antwort

0

Wenn Sie wirklich tun möchten, so können Sie Ihren Code wie folgt schreiben:

public static void showUC(Control uc, Control pnlContainer) 
{ 
    pnlContainer.Controls.Clear(); 
    uc.Dock = DockStyle.Fill; 
    pnlContainer.Controls.Add(uc); 
} 

und es so nennen:

showUC(new someControlType(), someControlContainer); 

Keine Notwendigkeit, die GC zu nennen; überlasse es dem System, Dinge aufzuräumen!

Und eine static Funktion muss wissen alle Objekte, mit denen es arbeiten soll, so müssen Sie auch in den Container übergeben.

Schließlich new Bedürfnisse geklam- mert mit (optional) Parameter ..

ich die Unterzeichnung des neuen Steuer gemacht Control so können Sie in jede Kontrolle passieren; und für noch mehr Flexibilität ist der Behälter auch Control. Beachten Sie, dass Sie damit weiterhin das Formular übergeben können! Natürlich möchten Sie vielleicht zu eingeschränkteren Typen zurückkehren.

aktualisieren

Wenn Sie zwischen zwei UserControls wechseln möchten, die beide in dem gleichen Behälter sitzen Sie diese Funktion nutzen zu können:

public static void showUC(Control uc) 
{ 
    foreach (Control ctl in uc.Parent.Controls) ctl.Visible = ctl != uc; 
} 

Es kann den anderen Zugriff über das Parent der einen anrufen. In der UC schreiben:

private void button1_Click(object sender, EventArgs e) 
{ 
    Form1.showUC(this); 
} 

Sie ändern könnten, um tatsächlich die schaffen UserControls statt Hiding/Showing ihnen; aber Sie würden ihren Zustand jedes Mal verlieren.

Wenn das ist, was Sie wollen, können Sie erwägen, den Namen in etwas wie switchUcFrom oder showOtherUC zu ändern; Schließlich "zeigt es das nicht", sondern "verstecke es und zeige dem anderen UC"

+0

Ich habe Ihre Antwort versucht und habe festgestellt, dass ich nicht auf 'this.Controls.add (pnlContainer);' weil die Methode statisch ist. Bitte lesen Sie den letzten Abschnitt meiner Frage und wissen Sie, ob Sie eine andere Lösung anbieten. @peter –

+0

Ah, dein Code hat mich verwirrt. Siehe mein Update. Die UCs werden auch nicht erstellt/zerstört, sondern nur ihre Sichtbarkeit geändert, daher sollten Sie beide zuerst dem Formular hinzufügen. – TaW

Verwandte Themen