none
cascadierende DropDownList RRS feed

  • Frage

  • Ich komme leider nicht weiter. Habe eine cascadierende DropDownList (Land, Bundesland, Region). Aber bei der where-Klausel verzweifle ich. Habe schon unzählige Varianten erfolglos probiert.

    Jede Hilfe willkommen. Meine hauptseite.aspx.vb:

            Dim strQuery As [String] = "Select Distinct Bundesland, idBundesland, idLand from Campingplatz ORDER BY Bundesland ASC where idLand = @LandID"
            Dim con As New MySqlConnection(strConnString)
            Dim cmd As New MySqlCommand()
            cmd.Parameters.AddWithValue("@LandID", DropDownLand.SelectedItem.Value)
    Samstag, 16. Oktober 2021 14:04

Antworten

  • Dein Hauptproblem ist, dass du als DataSource den Reader anhängst. Durch den Close der Connection können die Daten allerdings nicht mehr gelesen werden.
    Also:

    Dim MyTable as DataTable
    
    MyTable = new DataTable()
    MyTable.Load(cmd.ExecuteReader())
    
    DropDownBundesland.DataSource = MyTable

    Nun bleiben die Daten auch nach dem Close verfügbar.

    Die Fragestellung hat ja nichts direkt mit MySql sondern mit VB.Net zu tun.
    Ich denke nicht, dass im Form vom MySQL wiederum VB.Net-Fragen beantwortet werden;-)

    Sonntag, 17. Oktober 2021 12:48
  • Da du ja offensichtlich VB.Net nutzt und u.U. VisualStudio oder Visual Code nutzt, solltest du auch in der Lage sein mittels Debugger die Steps durch zu gehen und die Variablen-Inhalte zu betrachten.
    Dann, denke ich, kommst du dem Fehler bistimmt besser auf die Spur.
    Anders arbeite ich i.Ü. auch nicht.

    Bei VisualStudio z.B. kann ichmir den Inhalt der geladenen Tabelle sogar tabellarisch anzeigen lassen.
    Untersuche dein Command.CommandText und prüfe den SQL native in MySQL.

    Dann noch was zu dem Thema (Tipp):

    Dim myObject as new TypeObject

    Dies ist bei VB-Programmierern (bei mir war das auch) gerne verwendet, da es Schreibarbeit spart.
    Allerdings ist das durch Intellisense vernachlässigbar.
    Das Problem ist einfach folgendes:
    - Bei jedem Zugriff wird geprüft ob das Objekt erstellt wurde um dann ggf. ein neues zu erstellen.
    - Du kannst die Variable nie auf Nothing (Null) setzten, da ja beim Zugriff sofort ein Neues erstellt wird.
    - Es führt manchmal auch zu Folgefehlern, da man das Objekt u.U. mehrfach verwendet aber nicht auf Nothing gesetzt hatte.

    Bei C# ist das anders, da du per "TypeObject MyObject = new TypeObject()" nur eine einmalige Initialisierung machst.

    Sonntag, 17. Oktober 2021 15:21

Alle Antworten

  • Wie immer:
    Wie sehen deine Daten aus?

    Ich weiß auch nicht warum du immer Distinct incl.  ID-Felder machst.
    Wenn alle Infos in derselben Tabelle stehen, dann gibts folgendes:

    Liste 1. Select Land from Campingplatz group by Land
    Liste 2. Select Bundesland from from Campingplatz where Land = @Liste1.Land group by Bundesland
    Liste 3. Select Region from Campingplatz where Land = @Liste1.Land and Bundesland  = @Liste2.Bundesland group by Region

    Falls die Id's der von Land, Bundsland und Region immer eindeutig zugeordnet ist, kannst du jeweils die Id's mit reinnehmen. In den Dropdownlisten hast du häufig 2 Felder, 1 Value-Feld und 1 Display-Feld

    Samstag, 16. Oktober 2021 15:54
  • Geht leider immer noch nicht. Ich weis nicht, was ich falsch mache. Anbei der Code Land und Bundesland. Helfe mir bitte auf die Sprünge!!!


        Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
            If Not IsPostBack Then
                DropDownLand.AppendDataBoundItems = True
                Dim strConnString As [String] = ConfigurationManager _
                 .ConnectionStrings("conString").ConnectionString
                Dim strQuery As [String] = "Select LandDE, idLand from Campingplatz Group BY LandDE ORDER BY LandDE ASC"
                Dim con As New MySqlConnection(strConnString)
                Dim cmd As New MySqlCommand()
                cmd.CommandType = CommandType.Text
                cmd.CommandText = strQuery
                cmd.Connection = con
                Try
                    con.Open()
                    DropDownLand.DataSource = cmd.ExecuteReader()
                    DropDownLand.DataTextField = "LandDE"
                    DropDownLand.DataValueField = "idLand"
                    DropDownLand.DataBind()
                Catch ex As Exception
                    'Throw ex
                Finally
                    con.Close()
                    con.Dispose()
                End Try
            End If
        End Sub
        Protected Sub idLand_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
            DropDownBundesland.Items.Clear()
            DropDownBundesland.Items.Add(New ListItem("--Select Country--", ""))
            DropDownRegion.Items.Clear()
            DropDownRegion.Items.Add(New ListItem("--Select City--", ""))

            DropDownBundesland.AppendDataBoundItems = True
            Dim strConnString As [String] = ConfigurationManager _
                       .ConnectionStrings("conString").ConnectionString
            Dim strQuery As [String] = "Select Bundesland, idBundesland, idLand from Campingplatz ORDER BY Bundesland ASC where idLand = @LandID Group BY Bundesland"
            Dim con As New MySqlConnection(strConnString)
            Dim cmd As New MySqlCommand()
            cmd.Parameters.AddWithValue("@LandID", DropDownLand.SelectedItem.Value)
            cmd.CommandType = CommandType.Text
            cmd.CommandText = strQuery
            cmd.Connection = con
            Try
                con.Open()
                DropDownBundesland.DataSource = cmd.ExecuteReader()
                DropDownBundesland.DataTextField = "Bundesland"
                DropDownBundesland.DataValueField = "idBundesland"
                DropDownBundesland.DataBind()
                If DropDownBundesland.Items.Count > 1 Then
                    DropDownBundesland.Enabled = True
                Else
                    DropDownBundesland.Enabled = False
                    DropDownRegion.Enabled = False
                End If
            Catch ex As Exception
                'Throw ex
            Finally
                con.Close()
                con.Dispose()
            End Try
        End Sub

    Sonntag, 17. Oktober 2021 09:06
  • Geht leider immer noch nicht

    Hallo Lothar,

    "Geht nicht", liegt daran, das Code nun mal halt keine Beine hat; ohne Beine kann man nicht gehen; ergo geht es per se nicht.
    Ersthaft, etwas mehr an Problemschreibung Deinerseits ist hier schon nötig.

    Dim con As New MySqlConnection(strConnString)

    Du weisst schon, das MySQL kein MS Produkt und dies hier aber ein MS Forum ist?


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Sonntag, 17. Oktober 2021 12:04
  • Ja, das weis ich, aber ich dachte das liegt nicht an SQL, sondern an meiner Dummheit!!! Es geht ja bei Land. Alle id's sind als Interger programmiert.
    Sonntag, 17. Oktober 2021 12:16
  • Dein Hauptproblem ist, dass du als DataSource den Reader anhängst. Durch den Close der Connection können die Daten allerdings nicht mehr gelesen werden.
    Also:

    Dim MyTable as DataTable
    
    MyTable = new DataTable()
    MyTable.Load(cmd.ExecuteReader())
    
    DropDownBundesland.DataSource = MyTable

    Nun bleiben die Daten auch nach dem Close verfügbar.

    Die Fragestellung hat ja nichts direkt mit MySql sondern mit VB.Net zu tun.
    Ich denke nicht, dass im Form vom MySQL wiederum VB.Net-Fragen beantwortet werden;-)

    Sonntag, 17. Oktober 2021 12:48
  • Danke für Deinen Vorschlag, aber es geht immer noch nicht. Wahrscheinlich habe ich Deinen Vorschlag an falscher Stelle eingefügt!

            Try
                con.Open()
                'DropDownBundesland.DataSource = cmd.ExecuteReader()
        Dim MyTable as DataTable

        MyTable = new DataTable()
        MyTable.Load(cmd.ExecuteReader())

        DropDownBundesland.DataSource = MyTable
                DropDownBundesland.DataTextField = "Bundesland"
                DropDownBundesland.DataValueField = "idBundesland"
                DropDownBundesland.DataBind()
                If DropDownBundesland.Items.Count > 1 Then
                    DropDownBundesland.Enabled = True
                Else
                    DropDownBundesland.Enabled = False
                    DropDownRegion.Enabled = False
                End If
            Catch ex As Exception
                'Throw ex
            Finally
                con.Close()
                con.Dispose()
            End Try

    Sonntag, 17. Oktober 2021 13:37
  • Da du ja offensichtlich VB.Net nutzt und u.U. VisualStudio oder Visual Code nutzt, solltest du auch in der Lage sein mittels Debugger die Steps durch zu gehen und die Variablen-Inhalte zu betrachten.
    Dann, denke ich, kommst du dem Fehler bistimmt besser auf die Spur.
    Anders arbeite ich i.Ü. auch nicht.

    Bei VisualStudio z.B. kann ichmir den Inhalt der geladenen Tabelle sogar tabellarisch anzeigen lassen.
    Untersuche dein Command.CommandText und prüfe den SQL native in MySQL.

    Dann noch was zu dem Thema (Tipp):

    Dim myObject as new TypeObject

    Dies ist bei VB-Programmierern (bei mir war das auch) gerne verwendet, da es Schreibarbeit spart.
    Allerdings ist das durch Intellisense vernachlässigbar.
    Das Problem ist einfach folgendes:
    - Bei jedem Zugriff wird geprüft ob das Objekt erstellt wurde um dann ggf. ein neues zu erstellen.
    - Du kannst die Variable nie auf Nothing (Null) setzten, da ja beim Zugriff sofort ein Neues erstellt wird.
    - Es führt manchmal auch zu Folgefehlern, da man das Objekt u.U. mehrfach verwendet aber nicht auf Nothing gesetzt hatte.

    Bei C# ist das anders, da du per "TypeObject MyObject = new TypeObject()" nur eine einmalige Initialisierung machst.

    Sonntag, 17. Oktober 2021 15:21