Dynamischer Button stellt DB-Verbindung her

Hab grad folgendes probiert:

Code:
buttons(nFree) = New Button
'Infos fuer Button: Farbe, Location usw.
AddHandler buttons(nFree).Size = new Size(100,30)
...

Im Anschluss ist "buttons(nFree).Size = new Size(100,30)" blau unterstrichen und beim Überfahren mit dem Mauszeiger bekomme ich folgenden Hinweis:

Code:
Der AddHandler- oder Remove-Handler-Anwendungsereignisoperand 
muss ein punktqualifizierter Ausdruck oder ein 
einfacher Name sein.
 
So habe bis jetzt folgendes ohne XML, kannste dir einfach in ein neues Projekt kopieren brauchst dafür Form1 und Button1

Code:
Public Class Form1

    'Die Struktur
    Structure tbArray
        Dim button As Button
        Dim db As String
        Dim user As String
        Dim pw As String
    End Structure

    'Deklaration der Struktur
    Dim barray(0) As tbArray
    'Funktion die überprüft ob das Array voll ist, wenn ja wird Platz geschaffen
    Function GetFreeIndex() As Integer
        Dim i As Integer

        For i = LBound(barray) To UBound(barray)
            If barray(i).button Is Nothing Then
                Return i
            End If
        Next

        Return i + 1
    End Function

    Private Sub barraybutton_click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        'Indexvariable
        Dim index As Integer
        ' Click-Ereignis des Picturebox-Arrays auswerten
        Dim itemClicked As Button = CType(sender, Button)
        ' Das betroffene Element im Array suchen (allgemein);
        For i As Integer = LBound(barray) To UBound(barray)
            If barray(i).button Is itemClicked Then
                index = i
                Exit For
            End If
        Next
        'Hier können nun ohne Probleme alle Daten abgerufen werden
        MsgBox(barray(index).db)
        MsgBox(barray(index).pw)
        MsgBox(barray(index).user)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Koordinaten der Buttons deklarieren und festlegen
        Dim buttonx, buttony As Integer
        buttonx = 0
        buttony = 0
        'Zählvariable deklarienen und festlegen
        Dim y As Integer
        y = 0
        'Schleife starten
        For i As Integer = 0 To 9
            'Funktion aufrufen und Array erhöhen,falls nötig
            Dim nFree As Integer
            nFree = GetFreeIndex()
            If nFree > UBound(barray) Then
                ReDim Preserve barray(0 To nFree)
            End If
            'Funktion zu Ende
            'Buttons erstellen sowie Daten ins Programm laden
            barray(nFree).db = "Hier Name einlesen" + (nFree + 1).ToString
            barray(nFree).pw = "Hier PW einlesen"
            barray(nFree).user = "Hier User einlesen"
            barray(nFree).button = New Button
            barray(nFree).button.Parent = Me
            barray(nFree).button.Location = New Point(buttonx, buttony)
            barray(nFree).button.Text = barray(nFree).db
            barray(nFree).button.Width = 100
            barray(nFree).button.Height = 50
            'Koordinaten des nächsten Buttons erhöhen
            buttonx += barray(nFree).button.Width
            y += 1
            'Bei 5 Buttons wird eine neue Reihe angefangen
            If y = 5 Then
                y = 0
                buttonx = 0
                buttony += barray(nFree).button.Height
            End If
            'Button Event zuweisen
            AddHandler barray(nFree).button.Click, AddressOf barraybutton_click
        Next
    End Sub
End Class

Addhandler ist für das Event wie du hier bei mir sehen kannst :)

statt: AddHandler buttons(nFree).Size = new Size(100,30)

benutzt: buttons(nFree).Size = new Size(100,30)

Probier mein Projekt mal aus und antworte dann erstmal ob du das alles verstanden hast oder noch fragen hast. Bin für heute nu leider off, aber werde morgen wieder on sein.

Bei dem Projekt hier sollten nun ein Button an Position 0/0 erstellt werden und 5 daneben und dann in der nächsten Reihe wieder 5. Und wenn du darauf klickst sollte sich drei Messageboxen öffnen in der jeweils die Daten gespeichert sind von jedem Button.

Probiers einfach aus :)

(Morgen wieder ab 9 Uhr anwesen)
 
Zuletzt bearbeitet:
Moin Moin,

So habe bis jetzt folgendes ohne XML, kannste dir einfach in ein neues Projekt kopieren brauchst dafür Form1 und Button1

neues Projekt angelegt. Form1.vb und Button1.vb, erstellt. Dann die "Private Sub Button1_Click" ausgeschnitten und in die Button1-Klasse eingefügt. Hier gibt's jedoch Probleme mit der Handles-Klausel, die lt. Fehlermeldung nach einer With-Event-Variable verlangt. Im Anschluss kommt eine Batterie von Fehlern, weil diverse Variablen nicht deklariert sind:

Code:
Fehler	1	Die Handles-Klausel erfordert eine WithEvents-Variable, die im enthaltenden Typ oder einem seiner Basistypen definiert wird.	C:\DynButton_3\Button1.vb	3	99	DynButton_3
Fehler	2	Der Name "GetFreeIndex" wurde nicht deklariert.	C:\DynButton_3\Button1.vb	19	21	DynButton_3
Fehler	3	Der Name "barray" wurde nicht deklariert.	C:\DynButton_3\Button1.vb	20	31	DynButton_3

usw.

Das mit der Button1-Klasse hab ich wohl falsch verstanden. Beide Module stecken jetzt wieder in der Form1.vb. Alle Fehler sind verschwunden :) Der Event-Handles-Fehler ist bis dato geblieben.
 
Kopier mal den gaaaaanzen Code in dein Projekt, also wirklich alles und überschreib dann alles bei dir...bei mir klappts nämlich so ohne Probleme :)

Also:
1. Projekt erstellen
2. Button erstellen
3. In den Code gehen und alles löschen
4. Dann alles hier kopieren und einfügen
 
Zuletzt bearbeitet:
Geht sofort los ;)

Des Lernens halber, um also ein feeling für die notwendigen Schritte zw. Sichtbarkeit/Vorgehensweise zu bekommen, würde ich gern das Button-Modul in eine separate Klasse auslagern.
Müsste doch eigentlich funktionieren, dass ich einfach eine Instanz der Klasse innerhalb der anderen erzeuge und dann via Punkt-Operator auf die einzelnen Member zugreife, oder?

Gruß
Ingo
 
Um ehrlich zu sein, ich habe mich bisher fast gar nicht mit Klassen beschäftigt ^^
Müsstest du mal ausprobieren :)
 
Um dich nicht lange auf die Folter zu spannen. Mit dem letzten Release läuft's.

Ich werd' nachher gleich mal testen, worin sich die Versionen unterscheiden. Bin zwar mit der Anwendung bei Weitem noch nicht fertig. Hab durch dich aber schon mal 'n ordentlichen Haufen gelernt und vor allem ein tolles Zwischenerfolgserlebnis :)

Thanks a lot
Ingo
 
Freut mich das es funktioniert und kein Problem :)

Falls du noch Fragen zu sowas in der Art hast frag einfach, bin in der Woche immer von 9-17 Uhr hier aktiv. :)

MfG Alaitoc
 
Hier kann ich noch ein klärendes Wort gebrauchen.

Code:
    Private Sub barraybutton_click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        'Indexvariable
        Dim index As Integer
        ' Click-Ereignis des Picturebox-Arrays auswerten
        Dim itemClicked As Button = CType(sender, Button)
        ' Das betroffene Element im Array suchen (allgemein);
        For i As Integer = LBound(barray) To UBound(barray)
            If barray(i).button Is itemClicked Then
                index = i
                Exit For
            End If
        Next
        'Hier können nun ohne Probleme alle Daten abgerufen werden
        MsgBox(barray(index).db)
        MsgBox(barray(index).pw)
        MsgBox(barray(index).user)
    End Sub

Warum CType?

Warum verwendest du in der for-Schleife das LBound- u. UBound-Array? Sind das spezielle VB-Container? Was wäre bspw. eine Alternative in C#?
 
Code:
LBound(barray) To UBound(barray)
bedeutet von unterer bis oberer Grenze
Ein Feld beginnt ja normalerweise bei 0 und geht bis x. Als Länge wird aber x+1 angezeigt,also kann man schreiben:
Code:
0 To barray.length-1
oder halt
Code:
0 To ubound(barray)
Und sollte das Feld nicht bei 0 beginnen (geht das in .Net überhaupt noch?) ist man mit lbound(barray) - also der unteren Grenze als Startwert - auf der sicheren Seite.
 

Neue Beiträge

Zurück