Neu erstellte controll ansprechen

  • VB.NET

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

    Neu erstellte controll ansprechen

    hi zusammen

    wieder eine frage meinerseits:
    ich erstelle mit einer schleife controls... wie spreche ich diese nach dem erstellen an?? ich kann ja nicht schreiben Handles label1.Click das würde vs ja als fehler ansehen...
    Guck dir AddHandler und RemoveHandler an

    - Ich meine AddHandler CTRL.Event, MyDelegate, wobei MyDelegate auch mit AddressOf MySub zu ersetzen ist

    EDIT: Zu spät -.-
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Du kannst dem Control per AddHandler seinen Handler hinzufügen und dann genau so weitermachen:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim lbl As New Label
    3. AddHandler lbl.Click, AddressOf Label_Click
    4. End Sub
    5. Private Sub Label_Click(sender As System.Object, e As System.EventArgs)
    6. End Sub

    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!
    ich habe aber gerade germerkt dass das bei mir nicht funktionieren wird, da ich dem label nacher noch einen andernen namen zuweise:

    VB.NET-Quellcode

    1. Do While Status = False
    2. Dim newflp As New FlowLayoutPanel
    3. newflp.Margin = FlowLayoutPanel1.Margin
    4. newflp.Height = 73
    5. newflp.Width = 237
    6. newflp.BorderStyle = BorderStyle.FixedSingle
    7. newflp.Name = newflp_name
    8. Dim newlbl As New Label
    9. newlbl.Margin = New Padding(6, 6, 3, 0)
    10. newlbl.Name = newlbl_name
    11. newlbl.Text = "2011.11.11 11h11m11s"
    12. newflp.Controls.Add(newlbl)
    13. FlowLayoutPanel1.Controls.Add(newflp)
    14. Loop
    Das sollte eigentlich kein Problem sein, denn Du gibst ja die Instanz eigentlich mit, nicht den Namen.
    Kann aber sein, dass ich mich irre.
    #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 :!:
    Wo ist da addhandler?

    Das liegt nicht daran dass du den Namen änderst, der name ist bloß ne Eigenschaft aber bei addhandler wird die instanz vom ctrl übergeben.

    Versuchs so (müsste eigtl gehen):

    VB.NET-Quellcode

    1. Do While Status = False
    2. Dim newflp As New FlowLayoutPanel
    3. newflp.Margin = FlowLayoutPanel1.Margin
    4. newflp.Height = 73
    5. newflp.Width = 237
    6. newflp.BorderStyle = BorderStyle.FixedSingle
    7. newflp.Name = newflp_name
    8. Dim newlbl As New Label
    9. Addhandler newlbl.click, Addressof lbl_Click
    10. newlbl.Margin = New Padding(6, 6, 3, 0)
    11. newlbl.Name = newlbl_name
    12. newlbl.Text = "2011.11.11 11h11m11s"
    13. newflp.Controls.Add(newlbl)
    14. FlowLayoutPanel1.Controls.Add(newflp)
    15. Loop
    16. Private Sub Lbl_Click(sender as Object,e as Eventargs)
    17. 'wenn auf eins der erstellten labels geklickt wird, wird diese prozedur aufgerufen
    18. End Sub

    @RushDen im letzten Teil deines Codes liegt genau das Problem für mich.. ich möchte, dass für jedes label das erstellt wird etwas anderes ausgeführt wird...
    mit dem code jetzt passiert ja egal ob ich auf label1 oder auf label2 klicke genau das gleiche...

    edit: deshalb wollte ich ja eigentlich das label via namen ansprechen....

    EDIT: EDIT: ich habe denn AddHandler bewusst draussen gelassen, damit man evlt das problem besser erkennt.. war vlt vorher ein wenig zu ungenau erklärt..

    0luca0 schrieb:

    etwas anderes ausgeführt wird
    Da musst Du entweder jedem Label einen anderen Handler zuweisen
    oder
    in dem einen Handler die Label anhand des sender-Arguments unterscheiden.
    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!
    das problem ist, dass bevor der loop ausgeführt wird noch unklar ist, wie viele controls erstellt werden...
    so wie du das meinst müsste ich dann ja jedes mal das schrieben:

    VB.NET-Quellcode

    1. Dim label1 as new label
    2. dim label2 as new label
    3. dim label3 as new label


    aber eben, wie schon beschrieben kann ich das problem nicht so lösen.. denn es können 200 label erstellt werden oder eben auch nur eines..
    Wie passen diese beiden Aussagen zusammen?

    0luca0 schrieb:

    noch unklar ist, wie viele controls erstellt werden...

    0luca0 schrieb:

    etwas anderes ausgeführt wird
    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!
    @RodFromGermany das passt für mich prima zusammen :D
    ein wenig hintergrund: ich lese dateinamen aus einem ftp server aus.. für jeden dateinamen wird ein label erstellt, dass label wird nach der datei benannt... wenn ich nun auf das label mit dem namen "test" klicke öffnet sich eine messagebox, die den inhalt der folgenden textdatei anzeigt... dh: ich klicke auf das label mit dem namen "test", dann öffnet er die datei "test" und zeigt mir den inhalt in der msgbox an(der inhalt ist dann irgendein name)...
    hoffe das ist verständlich...

    edit: @SpaceyX hoffe das ist gut so X/
    Na, dann erstell Dir eine Ableitung des Label-Controls und füge eine Property hinzu, die den Namen, bzw. den Pfad der Datei vorhält. Klickst Du nun auf ein Label, fragst Du die Property ab und liest die Datei aus. Was auch möglich ist, dass Du in der Ableitung eine Funktion festlegst, die die Datei ausliest und den Inhalt direkt in der MessageBox ausgibt. Das bleibt Dir überlassen.

    Eine andere Möglichkeit ist, dass Du eine Klasse erstellst, die alle nötigen Informationen vorhält und diese Daten dann gesammelt in einem DataGridView anzeigt (Beispiel). Es ist meist eine schlechte Lösung, hunderte von Controls zu erstellen. Ich würde an Deiner Stelle über eine Lösung nachdenken, die in diese Richtung geht.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    0luca0 schrieb:

    das passt für mich prima zusammen
    Dann fang an und poste eine vollständige Problembeschreibung und lass Dir nicht jeden Fatz aus der Nase ziehen :!: X(
    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!
    @SpaceyX gut dann werde ich das mal so probieren... datagridview ist einfach für mich optisch keine lösung.. mit label und panels lässt sich das einfach viel schönber gestalten..
    @RodFromGermany tut mir leid wenn die fragestellung am anfang nicht vollständig war

    noch eine frage, wie kann ich denn den namen des gerade angeklickten labels herausfinden? ich kann ja nicht per newlbl.name darauf zugreifen... oder muss ich das auch zuerst wie mit den handlern definieren?

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

    Der sender-Parameter zu einem Label casten und abfragen.
    EDIT: Wenn du sicher nur Labels auf diese Methode ansetzt kannst du Folgendes tun(Siehe Rods Antwort unten):

    VB.NET-Quellcode

    1. Dim Lbl = DirectCast(sender, Label)

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

    0luca0 schrieb:

    herausfinden?

    RodFromGermany schrieb:

    in dem einen Handler die Label anhand des sender-Arguments unterscheiden.
    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!