2 Stimmen

Dynamisch erstellte Benutzersteuerelemente in C#

Ich arbeite in einem C# Winforms-Projekt und ich habe ein Benutzer-Steuerelement, das auf seine Auswahl aus einem Toolstrip-Menü geladen wird. Ich habe ein Wörterbuch-Lookup-Set, um beim Laden des Formulars der Benutzersteuerung für andere Funktionen auftreten. Wenn ich das Benutzersteuerelement schließe, verwende ich einfach die Methode ".Hide();". Mir ist aufgefallen, dass beim ersten Laden der Benutzerkontrolle alles in Ordnung ist, aber wenn ich sie schließe und sie beim zweiten Mal wieder öffne, wird eine neue Instanz des Objekts erstellt, wodurch meine Wörterbuchabfrage durcheinander gerät. Daher schrieb ich etwas Code in einem Versuch, das Problem zu beheben.

Was ich tun muss, ist irgendwie zu sagen, dass, wenn eine Instanz der Benutzersteuerung bereits vorhanden ist, nicht eine neue Instanz dieses Objekts erstellen. Stattdessen soll die Benutzersteuerung einfach wieder sichtbar gemacht werden. Daher habe ich Code geschrieben, um zu versuchen, diesen Zweck zu erreichen. Wenn ich das Element das erste Mal auswähle, ist alles in Ordnung. Wenn ich die Benutzersteuerung ausblende und versuche, sie wieder zu öffnen, passiert nichts.

Nachfolgend der Code, den ich zu diesem Zweck geschrieben habe und der bei der Auswahl des Eintrags aus dem Toolstrip-Menü erscheint:

      if (Controls.ContainsKey("CheckAvailUserControl"))
       {
           Controls["CheckAvailUserControl"].Dock = DockStyle.Fill;
           Controls["CheckAvailUserControl"].Visible = true;
           Controls["CheckAvailUserControl"].Show();
           Controls["CheckAvailUserControl"].Refresh();
       }

       else
       {
          UserControl checkAvailUserControlLoad = new CheckAvailUserControl();
          Controls.Add(checkAvailUserControlLoad);
          checkAvailUserControlLoad.Dock = DockStyle.Fill;
          checkAvailUserControlLoad.Visible = true;
          checkAvailUserControlLoad.Show();
       }

Wenn ich meinen Code im Debugger verfolge, trifft er tatsächlich auf die richtigen Teile der obigen if/else-Anweisung. Seine nur nicht die Anzeige der Benutzer-Steuerelement auf dem Bildschirm das 2.

Die Frage ist: Wie schaffe ich es, dass das Steuerelement korrekt geladen wird, wenn ich es schließe und dann erneut aus dem Toolstrip-Menü auswähle?

0 Stimmen

Die Frage ist: Wie schaffe ich es, dass das Steuerelement korrekt geladen wird, wenn ich es schließe und dann erneut aus dem Toolstrip-Menü auswähle?

9voto

Daniel LeCheminant Punkte 49305

Ich denke, dass Controls.ContainsKey(...) immer false zurückgibt, weil Sie Ihrem Steuerelement nie einen Namen zugewiesen haben, als Sie es erstellt haben.

Wenn Sie beim Erstellen des Steuerelements sagen

//...
checkAvailUserControlLoad.Name = "Something"
//...
Controls.Add(checkAvailUserControlLoad);

entonces

Controls.ContainsKey("Something") 

wird true zurückgegeben, und Sie können das Steuerelement wiederverwenden, indem Sie Controls["Something"]

0 Stimmen

@Henk: Ist das nicht der Sinn meines Beitrags, dass Sie die Eigenschaft Name festlegen müssen?

2voto

Jerry Nixon Punkte 30239

Hier ist es:

private void button_Click(object sender, EventArgs e)
{
    // pass in the containing panel
    LoadControl<MyControls.MyControl>(panelContainer);
}

void LoadControl<T>(Panel panel) where T : Control, new()
{
    T _Control = GetControl<T>(panel);
    if (_Control == null)
    {
        _Control = new T();
        _Control.Dock = DockStyle.Fill;
        panel.Controls.Add(_Control);
    }
    _Control.BringToFront();
}

T GetControl<T>(Panel panel) where T : Control
{
    Type _Type = typeof(T);
    String _Name = _Type.ToString();
    if (!panel.Controls.ContainsKey(_Name))
        return null;
    T _Control = panel.Controls[_Name] as T;
    return _Control;
}

1voto

Joel Coehoorn Punkte 377088

Das könnte funktionieren, aber ich denke, es ist ein wenig rückwärtsgewandt: Sie werfen neuen Code auf ein Problem, das stattdessen durch Verschieben Ihres alten Codes gelöst werden könnte.

Überlegen Sie stattdessen, wie die Ereignisse in Ihrem Formular funktionieren. Ich wette, wenn Sie Ihren Erstellungscode auf ein etwas anderes Ereignis verschieben oder erkennen, wann das Ereignis später ausgelöst wird, und diese ignorieren, könnten Sie das Problem auf eine viel schönere Weise lösen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X