Dynamischer Button stellt DB-Verbindung her

bolshi

Mitglied
Hallo,
mit XMLDocument.selectSingleNodes lese ich die jeweiligen Knoten der XML-Datei aus. Per for-each-Schleife so oft, wie Knoten vorhanden sind. Der "Button"-Konstrukotr soll innerhalb der Schleife für jeden vorhandenen XML-Knoten entpsrechende viele Knöpfe generieren.

Beim click-Ereignis soll der Benutzer mit einer DB verbunden werden, deren Zugangsdaten bereits innerhalb der Button-Klasse gespeichert sind.

Wie gehe ich vor?

Gruß und Dank
Ingo
 
Tach du,

Hm...ich würde so vorgehen, falls ich das nu nicht falsch verstanden habe :)

Code:
    'Erstmal ein Button Array erstellen
    Dim buttons(0) As Button

    'Diese Funktion erhöht jedesmal wenn nötig das Button Array, sodass man vorher nix festlegen muss
    Function GetFreeIndex() As Integer
        Dim i As Integer
        For i = LBound(buttons) To UBound(buttons)
            If buttons(i) Is Nothing Then
                Return i
            End If
        Next
        Return i + 1
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Wird halt die Funktion aufgerufen
        Dim nFree As Integer
        nFree = GetFreeIndex()
        If nFree > UBound(buttons) Then
            ReDim Preserve buttons(0 To nFree)
        End If
        buttons(nFree) = New Button
        'Hier setzt du dann alle Informationen für den Button hin, wie Farbe, Location und sowas halt...
        'Dann kommt noch das Event
        AddHandler buttons(nFree).Click, AddressOf HIERDASEVENTANGEBEN 'Bsp: Button1_Click
    End Sub

Also als Erstes erstellst du ein Button Array, dann eine For Each Schleife die jedesmal wenn ein Knotenpunkt vorhanden ist die Funktion aufruft wo die Größe des Arrays erhöhrt wird, dann wird bei mir hier via buttons(nfree) = new button im Array ein Button erstellt, dem musst du dann .Location und sowas zuweisen. Und zum Schluss einfach noch via AddHandler das Event hinzufügen.

Hoffe war einigermaßen verständlich und ich habe mich beim Code net vertippt oder was falsch kopiert.
Falls es noch Fragen gibt frag ^^
 
Zuletzt bearbeitet:
Achja bei dem Werten des Buttons:

Code:
buttons(nFree).Size= new Size(100,100)

immer schön "new" benutzen ;)

benötigen tust du eigentlich aber nur:

Code:
buttons(nfree) = new button
buttons(nFree).parent= me

Nebenbei hab ich oben die 0 vergessen bei der Variablendeklaration:

Code:
dim buttons(0) as button

ist nu aber auch oben verbessert...

MfG Alaitoc
 
Zuletzt bearbeitet:
Hi,

Die Methode zum Auslesen der Daten aus der XML-Datei hab' ich wie folgt gebaut:

Code:
Public Class Form1

    Private formdata As New SQLServerDialogFormData


    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'Hier passiert die XML-Deserialisierung
        Me.LoadSettings()
    End Sub

    Private Sub LoadSettings() 'ByVal fileName As String)

         Try
            'Button Array erstellen
            Dim buttons(0) As Button


            Dim document As XPathDocument = New XPathDocument("C:\debug\SQLStandardLogin.xml")
            Dim navigator As XPathNavigator = document.CreateNavigator()
            Dim nodes As XPathNodeIterator = navigator.Select("/SQLServerDialogFormData")

            While nodes.MoveNext()

                'Hier kommt die Instanz der Button-Klasse rein:
                Debug.Print(navigator.Value.ToString)
            End While

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        MessageBox.Show("ok")

    End Sub
End Class

Ich komme mit der Button-Klasse noch nicht zurecht. Wie übergebe ich jetzt am Geschicktesten die einzelnen Werte aus dem XpathNavigator in die Button?

Muss die Klasse, wenn sie im gleichen Projekt liegt, dennoch per inherit eingebunden werden?

Gruß
Ingo
 
Anbei der link zur Arbeitsweise des XPathNavigators

Ich möchte das Projekt nicht unnötig verkomplizieren, da mir ein Zwischenergebnis als Erfolgserlebnis sicher Auftrieb bringt. Daher schlage ich vor, dass wir das an Hand deiner Vorgehensweise durchspielen.

Starte ich o.g. Form, bekomme ich als Ausgabe die in den jeweiligen XML-Knoten gespeicherten Werte. Im o.g. Bsp. allerdings mit der ToString-Methode, um zu sehen, ob es funktioniert.

Ich brauch aber jedes ausgelesene Datenpaar [DB,user,pwd] in je einer per new erzeugten Button-Instanz. Die darin gespeicherten Benutzerdaten sollen den Anwender beim onClick-Ereignis mit der entsprechenden DB verbinden.

Mit welchen Mitteln ist egal. Ich nutze den XPathNavigator, weil er performant läuft und ich noch lange nicht alles kenne.

Gruß
Ingo
 
Zuletzt bearbeitet:
So ich verstehe das nun so das jeder Button die Logindaten für eine bestimmte Datenbank in sich hat?

Dann würde ich eine Struktur erstellen:

Code:
Structure tbArray
  Dim button As Button
  Dim db As String
  Dim user As String
  Dim pw As String
End Structure

Code:
dim bArray(10) as tbArray
Und dann in etwa dieses Ereignis jedem Button per addhandler wie oben schonmal beschrieben zuweisen.

Code:
    Private Sub bArray_Click(ByVal sender As Object, _
                       ByVal e As System.EventArgs)
        ' Click-Ereignis des Button-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

Dann weiß der welcher Array angeklickt wurde, das heißt man kann nun da man ja weiß welcher Array das ist einfach als bsp. via bArray(i).pw das PW abfragen.

Beim Erstellen (siehe oben) wird einfach nur :
Code:
barray(nfree).pw = XXX
barray(nfree).user = XXX
barray(nfree).db = XXX
hinzugefügt.

Hoffe annährend verständlich, vielleicht kannst du ja auch mal die Struktur deiner XML Datei hochladen, dann kann ich dir das vll mal so in etwa hinbasteln
 
Auszug aus der XML-Datei:
Code:
<?xml version="1.0"?>
<bla>
<SQLServerDialogFormData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <Server>dt-server-06</Server>
   <Database>anlagenregister</Database>
   <User>user_1</user>
   <password>pwd_hash</password>
</SQLServerDialogFormData>
<SQLServerDialogFormData>
   <Server>pt01</Server>
   <Database>firmen_1</Database>
   <User>user_1</user>
   <password>pwd_hash</password>
</SQLServerDialogFormData>
<SQLServerDialogFormData>
   <Server>pt01</Server>
   <Database>firmen</Database>
   <User>user_1</user>
   <password>pwd_hash</password>
 </SQLServerDialogFormData>
</bla>
In der Button-Basis-Klasse sind Standard features enthalten. Innerhalb der Schleife soll jedem generierten Button als Label der database-Eintrag zugewiesen werden. Anschließend soll dieser beim onClick-Ereignis den Benutzer mit der entsprechenden DB verbinden.
 
Zuletzt bearbeitet:
Jut, ich mach mich mal kurz da ran. Mache es halt nur mit dem DOM Verfahren also musste etwas abändern, aber denke das schaffst du :)
 

Neue Beiträge

Zurück