Dynamische Buttons - dynamische Zuweisung von actions

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Nikolai.

    Dynamische Buttons - dynamische Zuweisung von actions

    Hi,

    ich bin mal wieder ein wenig dabei mittels VB etwas zu basteln.
    Ich möchte auf einer Form dynamische Buttons erstellen.
    Die Anzahl der Buttons richtet sich nach dem Inhalt einer bestimmten Textdatei, deren Zeilen einen UNC-Pfad widerspiegeln.
    Das Erstellen der Buttons klappt mittlerweile super:
    [code]
    PrivateSub dyn_buttons()
    Dim StmReader = File.OpenText(sLinks)
    Dim strline
    Dim i AsInteger = 1
    While (StmReader.Peek() <> -1)
    strline = StmReader.ReadLine()
    Dim Btn AsNew Button
    With Btn
    .Name = String.Format("btn{0}", i)
    .Text = strline
    .Tag = 999
    .Top = 200 * i / 5
    .Left = 20
    .Width = 200
    .Height = 30
    EndWith
    i += 1
    TabPage4.Controls.Add(Btn)
    EndWhile
    StmReader.Close()
    EndSub
    [/code]



    Wie weiter oben beschrieben, stehen in der Textdatei Zeilen, die aus einem UNC-Pfad (like [url='file://server/freigabe/abc.htm']\\server\freigabe\abc.htm[/url]) bestehen.
    Nun mein Problem, was ich auch nach längerer Suche nicht lösen konnte:

    Wie kann ich den dynamischen Buttons ein Klick-Event zuweisen? Der Anwender soll später durch klicken auf den Button zum UNC-Pfad geführt werden (in diesem Fall soll sich der IE mit der abc.html-Seite öffnen).

    (Bei 'normal' erstellen Buttons füge ich folgenden Inhalt ein:

    [code]
    Shell("C:\WINDOWS\explorer.exe \\server\freigabe\abc.htm")
    [/code]

    Wie ich die Textzeile in deren Bestandteile zerlege - weiß ich (für die Benennung). Ist nur noch nicht Bestandteil.

    Bitte um Hilfe.

    Viiiilen Dank.
    so far...
    Wumpel


    ...manchmal ist es einfacher als man denkt...
    Normalerweise hätte ich jetzt Anonyme Delegates gesagt, die gibts aber scheinbar in vb.net nicht :(
    Ich nehm mal nicht an, dass du flott auf c# umsteigen willst? :D

    Mit AddHandler (siehe MSDN) kannst du eine Sub als Ereignis-Handler von z.B. Buttons zur Laufzeit hinzufügen. In einen Array oder eine Hashlist (oder wie das Teil heißt) kannst du dann die Pfade und Steuerelement-Namen schreiben. Das Click-Ereignis hat als 1. Parameter sender as Object, von dem nimmst du den namen (sender.Name) und holst den Pfad aus der Hashlist.

    ich würde das so machen

    hallo,

    im prinzip würde das so aussehen.
    den pfad zum explorer brauchst du nicht mit anzugeben, windows kennst den schon !
    da nicht alle ihr windows im gleichen pfad installieren ist das auch sicherer !!!

    Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Dim b As New Button
    4. b.Text = "test"
    5. Me.Controls.Add(b)
    6. AddHandler b.Click, AddressOf b_click
    7. End Sub
    8. Private Sub b_click(ByVal sender As Object, ByVal e As System.EventArgs)
    9. Dim pi As New ProcessStartInfo
    10. pi.FileName = "explorer.exe"
    11. pi.Arguments = "\\server\freigabe\abc.htm"
    12. 'noch eine kleine abfrage
    13. If System.IO.Directory.Exists(pi.Arguments) = True Then
    14. Process.Start(pi)
    15. Else
    16. MessageBox.Show("Die Datei konnte nicht gefunden werden !")
    17. End If
    18. End Sub
    19. End Class

    gruss

    mikeb69

    Versucht...

    Hey,

    ich habe versucht eure Hilfe in die Tat umzusetzen.
    Leider bin ich ein wenig zu blöd.

    Wenn ich einen Button dynamisch erstelle, basiert dieses auf einen Eintrag in einer Textdatei. Dieser Eintrag ist ein UNC-Pfad. Nun soll durch klicken des Button die Website (aus dem UNC-Pfad) geöffnet werden.
    Ich arbeite mit dem Steamreader und hole mir die Zeile aus der Textdatei.
    Den zerschnippel ich. sodass ich sämtliche Schnipsel habe (Button-Name... usw), die ich benötige.


    Mit Arrays habe ich bisher noch nicht gearbeitet - werde mir in der kommenden Woche dazu Wissen aneignen.
    Könntet ihr mir bis dahin schon einmal ein wenig auf die Sprünge helfen?

    Was muss ich machen um mit der Sub b_click den UNC-Pfad des entsprechenden Buttons auszuführen?

    Tut mir leid, wenn ich mit solch trivialen Dinge nerve, aber ich bin kein Programmierer. Ich versuche lediglich unseren Anwendern hier das Leben mittels "kleinerer" Programme das Leben zu erleichtern (und mir natürlich auch :D ).



    Vielen Dank schon mal im Voraus.
    so far...
    Wumpel


    ...manchmal ist es einfacher als man denkt...
    hallo wumpel,

    im prinzip steht alles schon im code aus meinem letzten post.
    der teil, der in form_load steht erzeugt deinen button und zeigt ihn an.

    wenn du jetzt also ein array hast (vom streamreader) dann setzt du am besten kurz danach einen breakpoint.
    damit kannst du dir den inhalt aller variablen anzeigen lassen.

    .....

    um das ganze klarer zu machen, wäre es hilfreich wenn du ein bischen code posten könntest.

    gruss

    mikeb69

    Ähnliches Problem

    Hallo und Guten Tag allen hier im Forum.
    Ich hab ein ähnliches Problem alledings in VB6 (muss ich nehmen da kein .Net 2.0 installiert auf den Rechnern wo es laufen soll)
    In einer Form werden Dynamisch CommandButtons geladen. Anzahl, Beschriftung und Ereignis stehen in einer Textdatei und werden in Arrays geladen.

    Quellcode

    1. For B = 1 To S
    2. Set objButton(B) = Me.Controls.Add("VB.CommandButton", strButton(B + 1))
    3. objButton(B).Caption = strButton(B + 1)
    4. objButton(B).Top = strLageY(B)
    5. objButton(B).Left = strLageX(B)
    6. objButton(B).Height = 500
    7. objButton(B).Width = 1600
    8. objButton(B).Visible = True
    9. Next

    Nun hab ich die Buttons in der Form.
    Wie weise ich den Buttons das _Click-Ereignis zu?

    Wäre schön wenn mir einer für VB6 helfen könnte. In VB2008 hab ichs hinbekommen, nützt mir aber im Moment nichts.
    danke tobili03
    Habs selbs rausgefunden:

    Quellcode

    1. For B = 1 To S
    2. Load objButton(B)
    3. objButton(B).Caption = strButton(B + 1)
    4. objButton(B).Top = strLageY(B)
    5. objButton(B).Left = strLageX(B)
    6. objButton(B).Height = 500
    7. objButton(B).Width = 1600
    8. objButton(B).Visible = True
    9. Next

    Jetzt gehts.
    Danke trotzdem an alle.
    tobili03 :)
    Hallo Leute


    wieder mal ähnliches Problemchen

    aber ein wenig komplizierter

    Und zwar erstelle ich dynamische picturbox und muss dann IN der Function wissen, welcher button betätigt wurde

    VB.NET-Quellcode

    1. With pcb_help
    2. .Name = "pcb" & int_anzahl
    3. .AccessibleDescription = str
    4. .BackgroundImage = Drawing.Icon.ExtractAssociatedIcon(str).ToBitmap
    5. .BackgroundImageLayout = ImageLayout.Stretch
    6. .BackColor = Color.Transparent
    7. .Cursor = Cursors.Hand
    8. .Width = 48
    9. .Height = 48
    10. .Top = (Me.lbl_conf.Top + Me.lbl_conf.Height + 20 + (int_anzahl * .Height))
    11. .Left = (Me.Width / 2) - (.Width / 2)
    12. AddHandler pcb_help.Click, AddressOf dummy_Click
    13. End With
    14. Controls.Add(pcb_help)


    dann habe ich noch eine dummy - Picturebox gemacht, die halt den Click ereignis übernehmen soll und die exe starten, die ich temporär in accessibledescription abgelegt hab

    wie finde ich heraus, welche picturebox ich geklickt hab?

    Gruß
    hallo nikolai,

    in deinem picturebox click event einfach

    VB.NET-Quellcode

    1. Dim pb as PictureBox = CType(sender,Picturebox)

    in pb hast du dann die picturebox, welche das click ereignis ausgelöst hat.

    gruss

    mikeb69
    hallo nikolai,

    ich unterstelle jetzt mal, dass deine funktion so aussieht

    VB.NET-Quellcode

    1. Private Sub dummy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    2. End Sub

    gruss

    mikeb69
    Noch eine Frage:

    geht es auch dynamisch einen ToolTippText zuweisen?

    also ich habe ja dieses dummy PictureBox. und ich will als tooltipptext den pfad haben denn ich in einer eigenschaft von picturebox gespeichert halte

    ich habe bis jetzt so ausprobiert:

    VB.NET-Quellcode

    1. Tipp.SetToolTip(CType(sender, PictureBox), CType(sender, PictureBox).AccessibleDescription)
    2. Tipp.Show(CType(sender, PictureBox).AccessibleDescription, CType(sender, PictureBox))


    geht aber beides nicht. also kommt kein Fehler, passiert aber auch nichts

    Danke schon mal, Gruß
    hallo nikolai,

    ich bin mir nicht sicher ob ich verstanden habe was du meinst.

    probier mal das hier

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim tipp As New ToolTip
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Dim p As New PictureBox
    5. p.Tag = "Mein Tooltiptext"
    6. p.Location = New Point(10, 10)
    7. p.Size = New Size(100, 100)
    8. p.BorderStyle = BorderStyle.Fixed3D
    9. AddHandler p.Click, AddressOf dummy_Click
    10. Me.Controls.Add(p)
    11. End Sub
    12. Private Sub dummy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    13. Dim p As PictureBox = CType(sender, PictureBox)
    14. tipp.Show(p.Tag.ToString, p)
    15. End Sub
    16. End Class

    gruss

    mikeb69
    ja mike, so meine ich es


    außer dass ich es bei "maus-drüber-fahr" einfügen will


    habe es schon mit mouseenter und mousehover versucht. geht nicht

    liegt auch wahrscheinlich an den code denke ich

    wird es überhaupt angezeigt? ich meine mein dummy box ist unsichtbar und liegt am rand der form

    dieses ToolTippText soll ja über dynamisch generierten pboxen angezeigt werden
    hallo nikolai,

    ändere die addhandler zeile in

    VB.NET-Quellcode

    1. AddHandler p.MouseMove, AddressOf dummy_Click

    dann wird der tooltip text angezeigt während du mit der maus drüber fährst

    gruss

    mikeb69