Hier ist das Setup: Ich habe ein Benutzersteuerelement MyUserControl erstellt. Auf diesem Steuerelement ist ein einfaches Etikett. Wenn ich eine neue Instanz dieses Steuerelements in einem Formular ablege, möchte ich, dass das Label der Name des Steuerelements ist. Wenn dies beispielsweise die erste Instanz des Steuerelements ist, legt VStudio automatisch den Namen "myUserControl1" fest. Ich möchte einfach das Etikett "myUserControl1" lesen. Wenn dies das fünfte Steuerelement ist, wird VStudio es myUserControl5 nennen. Ich möchte, dass sich das Label entsprechend ändert ... aber nur, wenn es noch nicht festgelegt wurde. Sobald ich es auf "The Label" eingestellt habe, sollte es in Ruhe gelassen werden.
Ich dachte, es wäre einfach. Setzen Sie im Konstruktor label1.Text = this.Name. Aber dann wurde mir klar, bei der Instantiierung das. Name ist einfach MyUserControl. Es wurde noch nicht von VisualStudio und der CONTAINING InitializeComponent () -Methode benannt.
Ah! Ich überschreibe einfach das Feld "Name". Wenn es eingestellt ist, nach DesignMode suchen und das Etikett aktualisieren! ... aber ich kann den Namen nicht überschreiben. Es ist nicht virtuell oder abstrakt. Ich kann "neu" benutzen, um es zu erzwingen, aber dann feuert es nie und zerstört so den Zweck.
Welches Ereignis kann ich verwenden, um anzugeben, wann der Designer das Steuerelement benannt hat? Ich weiß, dass die Redmond-Leute die ganze Zeit tun, wenn sie eine Kontrolle über das Formular fallen lassen, also ist es sehr gut möglich. Ich bin eigentlich ziemlich bestürzt über dieses kleine Rätsel.
Also, hier ist die endgültige Antwort:
Für Hans 'Vorschlag war ein ControlDesigner erforderlich. Ich habe einen einfachen Designer erstellt, der mit einigen internen Eigenschaften verbunden ist, und ich habe es zum Laufen gebracht. Hier ist der Haken: Es ist ein bisschen wie ein Hack. Es scheint kein einziges Feld zu geben, das den gesuchten Wert hat, also musste ich ein .ToString()
für ein Objekt machen und dann den ersten Abschnitt analysieren. Ich dachte, das ist ungefähr so sauber wie es wird.
Dann habe ich oben in MyControl einfach ein neues Attribut hinzugefügt:
%Vor%Wie Sie sehen können, war es nicht sehr kompliziert, aber es ist ein bisschen hack-ish. Das Steuerelement hat die IDE gesperrt, als ich versuchte, "Text" zu überschreiben. Nicht sicher warum, aber als ich es "LabelText" nannte, funktionierte es perfekt.
Was ist mit dem Überschreiben der Methode OnLoad , die aufruft? das Load -Ereignis?
Wenn das nicht funktioniert, ist es ein wenig schlampig, aber Sie könnten die TextChanged -Ereignis oder SizeChanged Ereignis, da beide aufgerufen werden, nachdem die Eigenschaft Name
vom Designer festgelegt wurde (sie setzt die Werte in alphabetischer Reihenfolge).
Bearbeiten Sie die Designerdatei. Angenommen, ich habe ein Formular namens Form1. Also würde ich Form1.cs, Form1.resx und Form1.Designer.cs in Visual Studio haben. Wenn Sie Form1.Designer.cs öffnen, sehen Sie Folgendes:
%Vor%Dies ist eine Warnung, aber Sie können diese Datei trotzdem bearbeiten.
Hier ist eine Beispielbearbeitung, ich setze label3 text auf label1:
%Vor%Jetzt im Formular-Designer in Visual Studio sehe ich, dass label3 den Namen label1 hat:
Ein ähnlicher Ansatz könnte für Ihre Benutzersteuerung verwendet werden.