2017-03-02 1 views
0

Ich erstelle eine Anwendung mit WinForms. Ich habe panel in denen ich eine user control zeigen. Innerhalb dieser user control habe ich eine button. Wenn ich auf die Schaltfläche klicke, möchte ich die panel löschen und eine andere user control anzeigen. Ich versuche, das zu tun, mit dem folgenden Code:Ändern des Bedienfelds aus dem Bedienfeld

private void btnCreateOffer_Click(object sender, EventArgs e) 
{ 
    var myControl = new WindowsFormsDemo.View.CreateOffer(); 
    MockUpForm.panMain.Controls.Clear(); 
    MockUpForm.panMain.Controls.Add(myControl); 
} 

Dies funktioniert aus den Tasten direkt in der parrent Form gebracht, aber wenn ich in den user control verwende in, heißt es:

'MockUpForm.panMain' is inaccessible due to its protection level

I Angenommen, es hat etwas mit privaten/öffentlichen Klassen zu tun. Aber ich würde lieber die "richtige" Lösung haben, als alles nur öffentlich zu machen.

Irgendwelche Vorschläge, wie dies normalerweise geschieht?

+1

Es ist ein grundlegend falscher Weg, dies zu tun. Erhebe stattdessen ein Ereignis, dein Hauptformular kann es abonnieren und um seine Steuerelemente wackeln. Die Verwendung von Controls.Clear() ist auch sehr, * sehr * falsch, Sie müssen die Dispose() -Methode für jedes Steuerelement, das Sie entfernen, aufrufen oder Sie werden einen permanenten Speicherverlust verursachen. –

+0

Danke für Ihre Kommentare. Ich bin ziemlich neu in WinForms, also mache ich wahrscheinlich eine Menge Sachen * sehr * falsch :-). Ich werde in die Ereignismethode schauen ... – Noceo

+0

@HansPassant: Er erwähnte nicht, ob er die entfernten Kontrollen wiederverwenden möchte. Aber wenn Ereignisse auch abonniert sind, ist die Beseitigung nicht genug, Speicherleck wird sowieso auftreten. – taffer

Antwort

1

Lösung 1 (hässlich):

Machen panMain Öffentlichkeit im Designer: modifiers

Lösung 2 (etwas besser):

öffentliche Methoden bieten, um solche Aufgaben zu erreichen sicher :

// MockUpForm code: 

public void ClearPanelControls() 
{ 
    panMain.Controls.Clear(); 
} 

public void AddControlToPanel(Control c) 
{ 
    panMain.Controls.Add(c); 
} 

Und dann diese Methoden aufrufen, anstatt die vollständige Platte zu veröffentlichen, die möglich macht, zum Beispiel die ganze Platte und solche Dinge zu verfügen ...

+0

Ich kann ** Lösung 2 ** nicht erreichen Arbeit. Ich kann nicht auf die Methoden im Hauptformular vom Benutzersteuerelement zugreifen. Obwohl sie öffentlich sind ...? – Noceo

+0

Könnten Sie bitte ein Bild hinzufügen? Es scheint mir, dass Sie die angeklickte Schaltfläche zusammen mit den anderen Steuerelementen im Panel löschen möchten ... – taffer

1

Um die Kontrolle übergeordneten Formulars aus UserControl zugreifen Sie delegate und event

können

so etwas wie dieses ....

Windows Form (Parent Form)-Code ....

public Form1() 
{ 
    InitializeComponent(); 
    userControl1.CreateOffer += UserControl1_CreateOffer; 
} 

private void UserControl1_CreateOffer() 
{ 
    var myControl = new WindowsFormsDemo.View.CreateOffer(); 
    this.panMain.Controls.Clear(); 
    this.panMain.Controls.Add(myControl); 
} 

Benutzer Control-Code ...

internal delegate void CreateOfferDelegate(); 
internal event CreateOfferDelegate CreateOffer; 

public UserControl1() 
{ 
    InitializeComponent(); 
} 

private void btnCreateOffer_Click(object sender, EventArgs e) 
{ 
    CreateOffer(); 
} 
+0

Es mag nicht die Zeile 'FinancingCalculator.CreateOffer + = FinancingCalculator_CreateOffer;'. Es gibt den folgenden Fehler: * Ein Objektverweis wird für das nicht statische Feld, die Methode oder die Eigenschaft 'FinancingCalculator.CreateOffer' benötigt * – Noceo

+0

Anscheinend musste ich 'statisches internes Ereignis' deklarieren ... – Noceo

Verwandte Themen