Label: Per Doppelklick umbenennen

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Dodo.

    Label: Per Doppelklick umbenennen

    Hallo Leute,

    ich suche eine Möglichkeit die Labels (und ggf. andere Controls) auf meinem Formular per Doppelklick (oder anderes Event) umbenennen zu können.

    Man möge es damit vergleichen, wie als wenn man eine Datei über der "Rechten Maustaste - Umbenennen" im Betriebssystem umbenennen möchte.

    Ziel ist es dem Benutzer die Möglichkeit zu schaffen, sich die Formularfelder selber zu benennen.
    Über jegliche Hinweise oder Alternativ-Vorschläge wie so etwas aussehen könnte bin ich sehr Dankbar.
    das wird bei einem Label so nicht gehen, da man darin nicht schreiben kann.
    Musst du eventuell auf einen anderen Weg machen zB.: InputBox

    Bei Doppelklick auf zB Label soll die Inputbox erscheinen.
    msdn.microsoft.com/de-de/library/6z0ak68w(v=vs.80).aspx

    Anschließend die Eigenschaft .Text auf das ändern was in der InputBox eingetragen wurde
    Gibt eventuell schönere Möglichkeiten nur diese fällt mir spontan ein.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Geile Scheiße geht das hier mal schnell :)

    Danke, das war genau das was ich gesucht habe.
    Und hier der simple Code.

    VB.NET-Quellcode

    1. Private Sub lbl_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbl.DoubleClick
    2. lbl.Text = InputBox("", "Label benennen", lbl.Text, lbl.Location.X, lbl.Location.Y)
    3. End Sub


    Das ganze wird jetzt noch verfeinert, die Labels in Sprachdateien gespeichert und so weiter.
    Genial - ich Bedanke mich :)
    Da die InputBox ziemlich hässlich ist - finde ich - würde ich das einfach mit einer Textbox machen die das Label überlagert und bei einem doppelklick einfach auf Visible gesetzt wird, beim Enter druck oder Lost Focus wird der Textbox wert dem Label zugeordnet und die textbox wieder versteckt. Ziemlich einfach und viel schöner.

    Edit: Zudem ist die InputBox aus dem VisualBasic-Namespace, also dem Teil, der nicht wirklich OOP ist, sondern nur alten VB6 Hasen den Umstieg zu .NET erleichtern soll, mit Methoden und Enums die man noch auf VB6 kennt.
    Das sind ein paar Zeilen Code. Entweder machste die Textbox im Designer über das Label, oder erzeugst die Textbox Dynamisch und weist sie den Form Controls zu, die Size- und Location-Eigenschaften gibst du dann einfahc an die Textbox weiter und somit hat sie auch die gleiche Größe und Position wie dein Label.
    So in etwas stelle ich mir das dann auch vor.
    Möchte das ganze dynamisch gestalten und auf jedem Formular dann per AddHandler an die Labels einbinden.
    Da probiere ich mich gerade dran.

    Edit:
    Versuche nur gerade innerhalb der Funktion im AddHandler das Control anzusprechen.
    An so einer Kleinigkeit stecke ich gerade fest.

    Edit 2:
    Geht doch.
    Hier mal das ganze Konstrukt

    VB.NET-Quellcode

    1. Private Sub form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Try
    3. Add_Event_Handler(Me.Controls)
    4. Catch ex As Exception
    5. End Try
    6. End Sub
    7. Public Sub Add_Event_Handler(ByRef mycontrol As Control.ControlCollection)
    8. Try
    9. 'Alle controls durchlaufen
    10. For Each a As Control In mycontrol
    11. If TypeOf (a) Is Label Then
    12. Dim Lbl As Label = CType(a, Label)
    13. AddHandler Lbl.DoubleClick, AddressOf Label_Change
    14. End If
    15. Add_Event_Handler(a.Controls)
    16. Next
    17. Catch ex As Exception
    18. End Try
    19. End Sub
    20. Private Sub Label_Change(ByVal sender As System.Object, ByVal e As System.EventArgs)
    21. Try
    22. Dim Lbl As Label
    23. Lbl = CType(sender, Label)
    24. Lbl.Text = InputBox("", "Label benennen", Lbl.Text, Lbl.Location.X, Lbl.Location.Y)
    25. Catch ex As Exception
    26. End Try
    27. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bibi“ ()

    Jetzt könnte ich doch noch mal Hilfe gebrauchen.
    Statt eine Textbox direkt darüber zu setzen, möchte ich dies mit einem Formular mach.
    Das Formular hat lediglich die Textbox und keinen Rahmen, sieht also genauso aus wie eine Textbox. (Grund ist eben nur, das ich so auch Buttons und Events leichter verwenden kann).
    Wie bekomme ich diese Textbox zu dem jeweiligen Label positioniert?
    Ich habe schon sämtliche Dinge ausprobiert.

    Zu erwähnen sei, es handelt sich um MDI Formulare.
    Bei jedem Forumlar füge ich die EventHandler hinzu die mir den Doppelklick abfragen.
    Jetzt soll an dem jeweiligen Control das Fenster positioniert angezeigt werden.

    Sämtliche Werte habe ich hin bekommen, nichts aber das direkt daran positioniert ist.
    Über jegliche Hilfe bin ich sehr Dankbar :)
    Eine Form dafür ist völlig unnötig.

    Das Label Doppelklick Event:

    VB.NET-Quellcode

    1. Dim This As Label = DirectCast(sender, Label)
    2. Dim txt As New Textbox
    3. txt.Size = This.Size
    4. txt.Location = This.Location
    5. txt.Text = This.Text
    6. txt.Tag = This
    7. Me.Controls.Add(txt)
    8. AddHandler txt.KeyPress, AddressOf Text_KeyPress


    Text_KeyPress Event

    VB.NET-Quellcode

    1. Dim This As TextBox = DirectCast(sender, Textbox)
    2. If e.KeyCode = Keys.Enter Then
    3. DirectCast(This.Tag, Label).Text = This.Text
    4. Me.Controls.Remove(This)
    5. RemoveHandler This.KeyPress, AddressOf Text_KeyPress
    6. End If


    So mal eben aus dem Kopf geschrieben, muss nicht 100%ig funktionieren, aber ich hoffe mal das Prinzip kommt rüber.
    Hallo,

    vielen dank für die nette Hilfe :)
    Hier ereignet sich leider das selbe Problem mit der Positionierung.

    Wenn ich das ganze anklicke, dann habe ich das Gefühl das die Textbox an der Stelle Positioniert wird, wie die Entfernung des Labels zu dem Übergeordnetem qPanel (GroupBox) ist.

    Ein Bild um dies etwas zu verdeutlichen.
    Vielleicht weißt du ja woran dies liegen könnte.
    Bilder
    • beispiel2.jpg

      58,76 kB, 629×369, 149 mal angesehen
    Ist dies denn dynamisch möglich?
    Ich habe gerade gar keinen Ansatz/Idee wie ich das bewerkstelligen müsste.

    Ich danke dir vielmals für die Hilfe bisher.

    Edit:
    Mit folgendem bekomme ich es ordentlich positioniert.
    Das Entfernen des Elemts im Event-Handler funktioniert dann nicht mehr

    VB.NET-Quellcode

    1. This.Parent.Controls.Add(txt)

    anstatt

    VB.NET-Quellcode

    1. Me.Controls.Add(txt)


    Edit 2:
    Blödsinn, habs gleich


    Edit 3:
    Beim Handler, wo das Element wieder entfernt wird, muss ebenfalls das Parent-Control gewählt werden.

    VB.NET-Quellcode

    1. This.Parent.Controls.Remove(This)


    Vielen Dank

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Bibi“ ()