Zur Laufzeit erstelltes Label in Panel anzeigen

  • VB.NET

Es gibt 39 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Sorry, aber bei InitializeComponents() ist - meiner Ansicht nach - nichts zum nachempfinden, weil die dort aufgeführten Labels zur Entwurfzeit erstellt und auch zur Entwurfzeit (ggf) gelöscht werden.
    Ich habe die Eigenschaften von einem angeclickte "MyLabels"-Objekt angeschaut, aber nichts außer "Handle" gefunden, was auf eine Zuordnung schließen ließe.
    InitializeComponents() wird sowohl vom Designer als auch zur Laufzeit ausgeführt.
    Also was da drin steht - so hässlich und unelegant es auch gecodet sein mag - ist 100% verlässlich und korrekt. (nein, nur 99,5%)

    Allerdings ist dynamisches Generieren von Controls fast immer ein Holzweg, den die Leuts beschreiten, meist weil OwnerDrawing nicht bekannt ist.
    Siehst ja, wie aufwändig das wird, diese dynamischen Controls ständig mit den Daten synchron zu halten.
    nein - siehst du noch nicht, weil: du bist ja noch nicht durch damit :P
    Danke ErfinderDesRades, aber ich kann InitializeComponents() zur Laufzeit nicht einsehen und daher nicht wissen, was geschieht. Und OwnerDrawing kenne ich tatsächlich nicht. Aber abgesehen davon hilft mir das nicht wirklich weiter. Ich habe schon alles andere in den Griff bekommen (und meiner Meinung nach ganz passabel), nur die Entfernung/Löschung per Code von dynamisch erzeugten Labels fehlt mir noch.

    Aus diesen Angaben im Designer

    VB.NET-Quellcode

    1. 'lbl_01
    2. '
    3. Me.lbl_01.BackColor = System.Drawing.Color.Transparent
    4. Me.lbl_01.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
    5. Me.lbl_01.Location = New System.Drawing.Point(90, 27)
    6. Me.lbl_01.Name = "lbl_01"
    7. Me.lbl_01.Size = New System.Drawing.Size(24, 20)
    8. Me.lbl_01.TabIndex = 2
    9. Me.lbl_01.Text = "01"
    10. Me.lbl_01.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
    11. '

    kann ich beim besten Willen nichts ableiten. Wohl bemerkt: Das ist ein zur Entwurfszeit generiertes Label!

    Vielleicht hat ja jemand noch einen konstruktiven Tip.
    Also du willst ein Label auf einer Form Positionieren ? wenn ja

    VB.NET-Quellcode

    1. Label.Location = new Point(X,Y)


    der X wert ist die Position von Links(abstand zum Linken rand) und Y ist der Abstand von Oben. oder du nimmst

    VB.NET-Quellcode

    1. Label.left = 50
    2. Label.Top = 50


    Grüße Andy
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    ja - war keine gute Idee von RFG, weil in InitializeComponents wird nirgends gelöscht - es wird nur geadded.
    Aber vlt. hilft dir ja auch die .Add-Zeile - die sollteste noch aufsuchen, das ist natürlich die wichtigste.

    ggfs. performance-relevant ist, wie in InitializeComponents das Layout suspendiert wird, bis alle Controls fertig konfiguriert sind.

    Ich habe schon alles andere in den Griff bekommen
    da täuscht man sich leicht

    (und meiner Meinung nach ganz passabel)
    mag sein. Kann aber auch sehr gut sein, dasses dir nur so erscheint, eben weil dir die eiglich für sowas vorgesehenen Technologien nicht bekannt sind.

    Etwa das ChartControl kann auch Balkendiagramme, und ich glaub sogar es kann Klickse auf Balken "wahrnehmen" - bei letzterem bin ich nicht sicher.

    Zu Ownerdrawing kannste auch mal StoryCards gucken, aber da gehts eher um Dragging von selbstgezeichneten Objekten.
    Oder gugge Outlined und ziehbare Schrift - das sind richtige Datensätze, wie du sie auch verwenden solltest - die sich selbst zeichnen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Und hier eine Methode zum Löschen also du brauchst einen Button wenn du Darauf Klickst soll ein Label gelöscht werden. Das label das gelöscht werden soll legst du mit einem Klick daruf fest und wenn du auf den Button Clickst wird es Gelöscht

    Also

    Global Deklarieren

    VB.NET-Quellcode

    1. Private label as Label


    dann die Selktierung

    VB.NET-Quellcode

    1. private sub getLabel(sender as object, e as EventArgs)
    2. ' Das label wird Ausgewählt
    3. me.label = sender
    4. End sub


    nun wenn das label erzeugt wird

    VB.NET-Quellcode

    1. Dim lab as new Label
    2. lab.Location = new Point(50,50)
    3. lab.size = new Size(100,22)
    4. AddHandler lab.Click, AddressOf getLabel


    und nun im Button Click event

    VB.NET-Quellcode

    1. Me.label.Dispose()
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

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

    Das kompiliert? Und selbst wenn, der Code ist sinnlos und auch keine gute Lösung.
    Me.Label?! Wat? Afaik geht das doch garnicht, die Funktion macht auch keinen Sinn und du hast schon wieder die Guidelines missachtet.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Trade: egal was ich schreibe du hast immer was auszusetzen das ist ein Beispiel ungetestet und es Funktioniert. Das labe Global in der Klasse Deklariert ist. Es soll als Beispiel dienen. was soll nicht funktionieren

    1) Man Click auf das label das Gelöscht werden soll, das Label wird in der Variable Deklariert.
    2) Man Click auf den Button zum Löschen und das eben Deklarierte Label wird gelöscht.
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    ungetestet

    funktioniert

    Widerspricht sich auch garnicht. OT: Seien wir uns mal ehrlich, fast jeder Post von dir enthält irgendwas falsches oder schlechtes... Bitte, bemühe dich sowas zu vermeiden oder antworte nicht.

    Zum Code: Me.Label?! Was soll das sein?
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Die Globele Variable label kann man mit Me Anssprechen

    VB.NET-Quellcode

    1. Private label as Label

    Edit: ok @Trade: ein Kleiner fehler war drin anstatt Remove muss man Disose nehmen aber Ansonsten funktioniert alles Einwnadfrei.
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

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

    Moins an alle :)

    Also mal Grundlegendes: Es handelt sich um einen Vermietungskalender. Da hilft mir kein Balkendiagramm.
    @ Andy16823: Ich generieren Labels per Code. Wenn ich das Label anclicke, kann ich es löschen

    VB.NET-Quellcode

    1. '==> Global Dim MayLabel as Label
    2. Sub Label_Click(ByVal sender As Object, ByVal e As EventArgs)
    3. MyLabel = CType(sender, Label)
    4. MyLabel.Dispose()
    5. End Sub

    Ich muß die zuvor generierten Labels per Code (Ohne Click-Ereignis) löschen können, zum Beispiel beim Monatswechsel. Dann wird der alte Monat sozusagen gelöscht und die Daten vom neuen Monat "gezeichnet".

    Das Problem ist also, das es keinen Click-Handler gibt. Aber irgendwie sind die Labels da und müssen demzufolge ansprechbar sein. Sie haben ja einen Namen

    VB.NET-Quellcode

    1. MyLabels.Name="Hallo"

    Aber daüber kann ich es auch nicht anprechen und mit

    VB.NET-Quellcode

    1. MyLabels.Dispose

    löschen. Welche Daten kommen vom Click-Ereignis, die das Label identifizieren? Kann man sich die bei der Erstellung merken, um sie zum Löschen zu verwenden?

    @ErfinderDesRades: Ich bin ein kleiner LbD-Programmierer und schreibe für mich selber. Sicherlich gibt es perfektere Techniken und ich lerne auch gerne dazu, aber für meine recht simpleren Belange reicht es (bis auf kleine Ausnahmen wie jetzt gerade ;) ). Also sei bitte nicht sooooo streng mit mir...

    Gruß aus Berlin
    Hy, beim erstellen kannst du

    VB.NET-Quellcode

    1. AddHandler lab.Click, AddressOf getLabel
    einfügen, somit hast du für jedes label das Click event. Du könntest aber auch eine list of Label erstellen und diese mit einer For Each schleife durchlaufen und alle Löschen

    VB.NET-Quellcode

    1. For Each lab as Label in myLabelList
    2. lab.Dispose()
    3. Next
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Hallo Andy16823,

    danke für Deine Antwort.

    Nix ist schlimmer, als ein Problem ohne Lösung. Alle Labels sind aufgebaut nach dem Muster "'Zahl':'Name", also allen Labels ist der ":" gemein.
    Das ist meine Lösung für max. vielleicht 15 Labels:

    VB.NET-Quellcode

    1. For i As Integer = Me.Controls.Count - 1 To 0 Step -1
    2. If TypeOf (Controls(i)) Is Label And InStr(Controls(i).Name, ":") <> 0 Then
    3. Controls.RemoveAt(i)
    4. End If
    5. Next


    Über Controls bekomme ich den Namen des Labels und kann da auf den ":" prüfen.

    Vielleicht nicht die schönste Lösung, aber es funzt :thumbsup:

    Vielen Dank an alle, die sich für mich ihren Kopf zerbrochen haben
    Ich würde es so machen

    VB.NET-Quellcode

    1. Class .....
    2. Private labList as List(of Label)


    Dann beim erstellen der Labels

    VB.NET-Quellcode

    1. labList = new List(of Label)
    2. For i As Integer = 0 To Einträge - 1
    3. Dim lab as Label
    4. lab .AutoSize = False
    5. lab.Width = 200
    6. lab .Name = "Label" & i
    7. lab .Text = "Ich bin Label Nummer " & i.ToString
    8. Me.TableLayoutPanel.Controls.Add(lab , Col, Row)
    9. labList.Add(lab)
    10. Next


    Und wenn du Sie löschen willst

    VB.NET-Quellcode

    1. For Each lab as Label in labList
    2. lab.Dispoe()
    3. Next
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Auch eine Variante, ich hatte mich, ehrlich gesagt, vor dem Führen einer Liste gedrückt.
    Wenn ich einzelne Labels lösche (weil vielleicht eine Buchung storniert wurde), muß ich dieses auch aus der LabList nehmen. Das erspare ich mir mit der anderen Methode, weil nur die noch übrig gebliebenen Controls (im Testlauf 4 Buchungslabels, insgesamt 10 Controls) ohne merkliche Verzögerung abgefragt und gelöscht werden können.

    Trotzdem werde ich mir diesen Ansatz vormerken - Wer weiß, was noch kommt und ob Deine Variante dann nicht sinnvoller ist.
    Löschen könntest du mit

    VB.NET-Quellcode

    1. For i As Integer = 0 To Einträge - 1
    2. Dim lab as Label
    3. lab .AutoSize = False
    4. lab.Width = 200
    5. lab .Name = "Label" & i
    6. lab .Text = "Ich bin Label Nummer " & i.ToString
    7. Me.TableLayoutPanel.Controls.Add(lab , Col, Row)
    8. AddHandler lab.click , AddressOf labelDispose()
    9. labList.Add(lab)
    10. Next
    11. private sub labelDispose(sender as Object, e as EventArgs)
    12. Dim lab as Label = sender
    13. labList.Remove(lab)
    14. lab.Dispose()
    15. End sub


    So ist es aus der Liste und aus der Form
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    mepema2 schrieb:

    Sorry, aber bei InitializeComponents() ist - meiner Ansicht nach - nichts zum nachempfinden
    Dann hast Du es noch nicht gelernt. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    mepema2 schrieb:

    Learning By Doing
    So kann man eben nicht effizient lernen.

    Bei lbd reproduzierst du zwangsläufig immer nur dieselben Ansätze, die dir bereits bekannt sind, und verfeinerst die vlt. auch.
    Aber grundlegend neue Konzepte (wie hier etwa OwnerDrawing und databinding anstünden) bleiben gewissermassen ausserhalb des Lichtkegels der "lbd-Taschenlampe".