Benutzer mit den meisten Antworten
cascadierende DropDownList

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)
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;-)
- Bearbeitet Der Suchende Sonntag, 17. Oktober 2021 12:50
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Mittwoch, 20. Oktober 2021 06:14
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 28. Oktober 2021 14: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.
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Mittwoch, 20. Oktober 2021 06:14
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 28. Oktober 2021 14:48
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 RegionFalls 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
-
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 -
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] -
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.
- Bearbeitet Lothar Kurt Rappsilber Sonntag, 17. Oktober 2021 12:17
-
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;-)
- Bearbeitet Der Suchende Sonntag, 17. Oktober 2021 12:50
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Mittwoch, 20. Oktober 2021 06:14
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 28. Oktober 2021 14: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 -
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.
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Mittwoch, 20. Oktober 2021 06:14
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 28. Oktober 2021 14:48