Dropdownlisten: Dummyeintrag und aktive auswahl


Scouty

Mitglied
Hallo,

ich habe in meiner asp.net seite mehrere Dropdownmenüs. Die Inhalte holt er sich aus einer Access Datenbank. Das ganze soll am Ende so aussehen, daß beim ersten laden noch alle, bis auf das erste drop down deaktiviert sind. Sobald man aber im ersten dropdown was ausgewählt hat, wird das zweite dropdown aktiviert und man kann da wieder was auswählen.
Problem 1: Sobald man im dropdown1 was ausgewählt hat, aktiviert sich nicht nur der zweite sondern auch gleich alle anderen dropdownlisten. Hier ein kurzer ausschnitt aus dem code. Was/ wie muss ich das verändern, daß das dann auch mit den anderen drop downs klappt. Es sind insgesamt 5 dropdownlisten.

Code:
...

' Projekte einlesen
         Dim sql As String
         sql = "SELECT * FROM tblProjekt"
         cmd.CommandText = sql
         Dim myDS As New DataSet()
	 myAdapter.Fill (myDS, "Projekt")
	 Projekt.DataSource = myDS.Tables("Projekt")
         Projekt.DataTextField = "TxtProjekt"
         Projekt.DataValueField = "IdProjekt"
	
' Arbeitspaket einlesen
         sql = "SELECT * FROM tblArbeitspaket"
	 cmd.CommandText = sql
         myAdapter.Fill (myDS, "Arbeitspaket")
         Arbeitspaket.DataSource = myDS.Tables("Arbeitspaket")
	 Arbeitspaket.DataTextField = "TxtArbeitspaket"
	 Arbeitspaket.DataValueField = "IdArbeitspaket"
				
' Jahr einlesen
         sql = "SELECT tblPerioden.NumJahr FROM tblPerioden GROUP BY tblPerioden.NumJahr;"
         cmd.CommandText = sql
         myAdapter.Fill (myDS, "Jahr")
         Jahr.DataSource = myDS.Tables("Jahr")
         Jahr.DataTextField = "NumJahr"
         Jahr.DataValueField = "NumJahr"
    
' Monat einlesen
         sql = "SELECT tblPeriodenStruktur.NumMonat FROM tblPeriodenStruktur;"
         cmd.CommandText = sql
         myAdapter.Fill (myDS, "Monat")
         Monat.DataSource = myDS.Tables("Monat")
         Monat.DataTextField = "NumMonat"
         Monat.DataValueField = "NumMonat"
    
' Tag einlesen
         sql = "SELECT tblTage.numTag FROM tblTage;"
         cmd.CommandText = sql
         myAdapter.Fill (myDS, "Tag")
         Tag.DataSource = myDS.Tables("Tag")
         Tag.DataTextField = "NumTag"
         Tag.DataValueField = "numTag"

If Not IsNothing(Projekt.SelectedItem)
arbeitspaket.enabled = true
End If
		
If Not IsNothing(Arbeitspaket.SelectedItem)
Jahr.enabled = true
End If

If Not IsNothing(Jahr.SelectedItem)
Monat.enabled = true
End If
		 
If Not IsNothing(Monat.SelectedItem)
Tag.enabled = true
End If 
 
If Not IsNothing(Tag.SelectedItem)
End If 

...
Problem 2: Wie bekomme ich bei jeder dropdownliste eine art dummy eintrag? Zum Beispiel "Bitte auswählen". Da der Inhalt der listen aus einer Datenbank geholt wird, hat das mit listitems (<asp:ListItem value="">element1</asp:ListItem>) nicht geklappt.
Ich brauche so einen Dummy Eintrag, weil sonst nichts passiert, wenn man den ersten Eintrag in der Dropdownliste auswählt, auch wenn vorher schon ein anderer ausgewählt wurde. Er springt auch immer wieder zum ersten eintrag in der Liste zurück. Kann man das auch noch ändern? Wenn ja, womit?

Ich hoffe, ich hab mein Problem verständlich erklärt und hoffe auf schnelle Hilfe.

Herzliche Grüße Scouty
 

drvj

Mitglied
Hallo,
Problem 2:
Du könntest, anstatt der DropDownList den DataTable per DataSource zu übergeben, per Schleife jede DataRow des DataTablesdurchlaufen und so mit Hilfe der Funktion DropDownList.Items.Add() die selektierbaren Items hinzufügen. Somit kannst du zu anfangs:
Code:
DropDownList.Items.Add("Bitte wählen ...")
aufrufen und danach die Daten des DataTables hinzufügen.

Problem 1:
Wenn du es wie oben beschrieben realisierst, kannst du folgenden Code nehmen, um die Aktivierunge der einzelnen DropDownLists zu erreichen.
Code:
if (Monat.SelectedItem ==0)
{
    Tag.Enabled = false;
}
else
{
    Tag.Enabled = true;
}

if (Jahr.SelectedItem == 0)
{
    Monat.Enabled = false;
    Tag.Enabled = false;   
}
else
{
    Monat.Enabled = false;
}

if (Arbeitspacket.SelectedItem == 0)
{
    Jahr.Enabled = false;
    Monat.Enabled = false;
    Tag.Enabled = false; 
}
else
{
    Jahr.Enabled = true;
} 

if (Projekt.SelectedItem == 0)
{
    arbeitspaket.Enabled = false;
    Jahr.Enabled = false;
    Monat.Enabled = false;
    Tag.Enabled = false;
}
else
{
    arbeitspaket.Enabled = true;
}
Anmerkung: Ist C# Code, jedoch dürfte es kein Problem sein es in VB umzuwandeln.

Ich hoffe, ich konnte helfen.

Mfg,

Jens
 

Scouty

Mitglied
Hallo Jens,

entschuldige, wenn ich erst heute Antworte, ich hatte die letzen drei Tage frei.

zu Problem 2:
gibt es noch eine andere möglichkeit, daß ich den code, so, wie er momentan ist, bestehen lassen kann und trotzdem eine "Bitte wählen..." Zeile bekomme? Dazu gesagt, ich bin noch Anfängerin in sachen asp.net und ahbe mir bisheriges auch nur aus vielen Beispielen abgeguckt und kopiert. Deswegen fällts mir schwer, da irgendwie den ganzen Code umzuschreiben.

Den Code von C# in VB umzuwnadeln, damit denke ich habe ich keine Probleme, wenn er denn passen würde.

Viele Grüße Judith
 

Scouty

Mitglied
Hi,

mittlerweile habe ich das schonmal so hinbekommen, daß ich jedes Dropdown erst nacheinander auswählen kann. Somit ist Problem 1 gelöst.
siehe Code:

Code:
...

    
           ' Projekte einlesen
         	Dim sql As String
         	sql = "SELECT tblMitarbeiter.Login, tblProjekt.TxtProjekt, tblProjekt.IDProjekt FROM tblMitarbeiter INNER JOIN ((tblProjekt INNER JOIN tblArbeitspaket ON tblProjekt.IDProjekt = tblArbeitspaket.IDProjekt) INNER JOIN tblTeamMembers ON tblArbeitspaket.IDArbeitspaket = tblTeamMembers.IDArbeitspaket) ON tblMitarbeiter.IDMitarbeiter = tblTeamMembers.IDMitarbeiter WHERE Login='" & Cstr(session("Username")) & "' GROUP BY tblMitarbeiter.Login, tblProjekt.TxtProjekt, tblProjekt.IDProjekt;"
         	cmd.CommandText = sql
         	Dim myDS As New DataSet()
		 	myAdapter.Fill (myDS, "Projekt")
		 	Projekt.DataSource = myDS.Tables("Projekt")
         	Projekt.DataTextField = "TxtProjekt"
			Projekt.DataValueField = "IdProjekt"

		If Not IsNothing(Projekt.SelectedItem)
			arbeitspaket.enabled = true
			label.text = "... " & Projekt.SelectedItem.Text & "."
		
			' Arbeitspaket einlesen
			sql = "SELECT * FROM tblArbeitspaket WHERE ((tblArbeitspaket.IDProjekt)=" & Projekt.SelectedItem.value & ")"
			cmd.CommandText = sql
			myAdapter.Fill (myDS, "Arbeitspaket")
			Arbeitspaket.DataSource = myDS.Tables("Arbeitspaket")
			Arbeitspaket.DataTextField = "TxtArbeitspaket"
			Arbeitspaket.DataValueField = "IdArbeitspaket"
		Else
			arbeitspaket.enabled = false
			Jahr.enabled = false
			Monat.enabled = false
			Tag.enabled = false
		End If
		
		If Not IsNothing(Arbeitspaket.SelectedItem)
			Jahr.enabled = true
			
			' Jahr einlesen
            sql = "SELECT tblPerioden.NumJahr FROM tblPerioden GROUP BY tblPerioden.NumJahr;"
            cmd.CommandText = sql
            myAdapter.Fill (myDS, "Jahr")
            Jahr.DataSource = myDS.Tables("Jahr")
            Jahr.DataTextField = "NumJahr"
            Jahr.DataValueField = "NumJahr"
		Else
			Jahr.enabled = false
			Monat.enabled = false
			Tag.enabled = false
		End If

		If Not IsNothing(Jahr.SelectedItem)
			Monat.enabled = true
			
			' Monat einlesen
            sql = "SELECT tblPeriodenStruktur.NumMonat FROM tblPeriodenStruktur;"
            cmd.CommandText = sql
            myAdapter.Fill (myDS, "Monat")
            Monat.DataSource = myDS.Tables("Monat")
            Monat.DataTextField = "NumMonat"
            Monat.DataValueField = "NumMonat"
		Else
			Monat.enabled = false
			Tag.enabled = false
		End If

		If Not IsNothing(Monat.SelectedItem)
			Tag.enabled = true

			' Tag einlesen
            sql = "SELECT tblTage.numTag FROM tblTage;"
            cmd.CommandText = sql
            myAdapter.Fill (myDS, "Tag")
            Tag.DataSource = myDS.Tables("Tag")
            Tag.DataTextField = "NumTag"
            Tag.DataValueField = "numTag"
		Else
			Tag.enabled = false
		End If 

...
Ist dann nur noch Problem 2 offen.
Es muss doch irgendwas geben, daß man zusätzlich zu den Einträgen aus einer Datenbank, auch noch eine "statische" Zeile in die Dropdownlist einfügen kann. Die nichts anderes zu tun hat, als zu sagen: "Bitte wählen..:"
Gehts das nicht auch so, daß ich den Code so, wie er jetzt ist, nicht groß verändern muss, sondern ledigleich eine Codezeile zusätzlich reinkopieren muss.

Schöne Grüße und Danke schonmal
Judith
 

drvj

Mitglied
Hallo,
nachdem ich mir nochmal die Class Members der Klasse RowCollection angesehen habe, kann man dein Problem auch lösen, indem man nur Code zu deinem Vorhandenem hinzufügt.

Du fügst nun zwischen den jeweiligen Codezeilen:
myAdapter.Fill (myDS, "xxx")
xxx.DataSource = myDS.Tables("xxx")
den folgenden Code:
Code:
Dim newRow as DataRow = myDS.Tables("xxx").NewRow()
newRow(0) = "Bitte auswählen ..."
myDS.Tables("xxx").Rows.InsertAt(newRow,0)
Anmerkung: xxx stellt einen Platzhalter dar.

Dadurch wird an den Anfang deiner Datetabelle eine Zeile hinzugefügt mit dem Inhalt "Bitte wählen".

Ich hoffe, diese Lösung dürfte nun funktionieren.

mfg,

Jens
 

Scouty

Mitglied
Hallo,

die Lösung funktioniert leider nicht ganz. :-(
Fürge ich die drei Zeilen ein und ändere jeweils die Platzhalter bekomme ich erstmal folgende Meldung. Die Variable "newRow" verbirgt eine Variable in einem einschließenden Block.

Dementsprechend habe ich dann die fettgedrucken stellen jeweils geändert in 1, 2, 3 und 4 (weil 5 DropDowns)
Code:
Dim newRow1 as DataRow = myDS.Tables("xxx").NewRow()
newRow1(0) = "Bitte auswählen ..."
myDS.Tables("xxx").Rows.InsertAt(newRow1,0)
Als Ergebnis habe ich zwar wieder meine Dropdowns und an der Stelle wo "Bitte wählen..." stehen soll ist nur ein leeres Feld. Das ist ja nicht ganz so schlimm, wenn da nichts steht, aber wähle ich dann aus dem ersten Dropdown ein Projekt aus, bekomme ich folgende lange Meldung:

System.FormatException: Die Eingabezeichenfolge hat das falsche Format. at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) at System.String.System.IConvertible.ToInt32(IFormatProvider provider) at System.Convert.ToInt32(Object value) at System.Data.Common.Int32Storage.Set(Int32 record, Object value) at System.Data.DataColumn.set_Item(Int32 record, Object value)<Bitte auswählen ...> konnte nicht in der IDArbeitspaket-Spalte gespeichert werden. Erwarteter Typ: Int32.

Beschreibung: Beim Ausführen der aktuellen Webanforderung ist ein unverarbeiteter Fehler aufgetreten. Überprüfen Sie die Stapelüberwachung, um weitere Informationen über diesen Fehler anzuzeigen und festzustellen, wo der Fehler im Code verursacht wurde.

Ausnahmedetails: System.ArgumentException: System.FormatException: Die Eingabezeichenfolge hat das falsche Format. at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) at System.String.System.IConvertible.ToInt32(IFormatProvider provider) at System.Convert.ToInt32(Object value) at System.Data.Common.Int32Storage.Set(Int32 record, Object value) at System.Data.DataColumn.set_Item(Int32 record, Object value)<Bitte auswählen ...> konnte nicht in der IDArbeitspaket-Spalte gespeichert werden. Erwarteter Typ: Int32.

Quellfehler:

Zeile 50: myAdapter.Fill (myDS, "Arbeitspaket")
Zeile 51: Dim newRow1 as DataRow = myDS.Tables("Arbeitspaket").NewRow()
Zeile 52: newRow1(0) = "Bitte auswählen ..."
Zeile 53: myDS.Tables("Arbeitspaket").Rows.InsertAt(newRow1,0)
Zeile 54: Arbeitspaket.DataSource = myDS.Tables("Arbeitspaket")


Was und warum will er in die Spalte der einen Tabelle schreiben?

Ich hoffe, ihr könnt mir noch einmal helfen.

Viele Grüße Judith
 

drvj

Mitglied
Hallo,
anhand der Fehlermeldungen würde ich sagen, dass in deiner Arbeitspaket Tabelle lediglich Zahlenwerte gespeichert sind. Daher scheint es nicht möglich einen String darin zu speichern.
Von daher müsstest du es anders lösen. Einen anderen Weg nannte ich bereits, indem du mit Hilfe einer Schleife die Tabelle durchläufst und so die DropDownListe füllst. So kannst du bevor du die Schleife durchläufst der DropDownList ein Element "Bitte wählen ..." hinzufügen.

mfg,

Jens
 

Scouty

Mitglied
Hallo,

aber warum soll/will er denn einen String in die Tabelle speichern? Das will ich doch gar nicht. Hmmm...

Kannst du mir das mit der Schleife nochmal genauer erklären? An welcher Stelle ich was einfügen muss usw.
Danke dir

Viele Grüße Judith
 

drvj

Mitglied
Hallo,

ersetze jeweils die Zeile
Code:
xxx.DataSource = myDS.Tables("xxx")
durch

Code:
xxx.Items.Add("Bitte auswählen ...")

Dim newRow as DataRow
For Each myRow in myDS.Tables("xxx")
      xxx.Items.Add(myRow[0].ToString())
Next myRow
mfg

Jens
 

Scouty

Mitglied
Hallo Jens,

zuerst kam die Meldung, daß die lokale Variable "newRow" bereits im aktuellen Block deklariert ist. Habe Dim newRow as DataRow dann auskommentiert.
Dann kam die Meldung, daß der Name "myRow" nicht deklariert wurde. Habe dann einfach die Zeile, die ich eben auskommentiert habe, wieder einkommentiert und das new durch my ersetzt.
Danach kam dann folgende Meldung und ab da an wußt ich dann auch nicht mehr weiter.

Kompilierungsfehler
Beschreibung: Beim Kompilieren einer Resource, die für diese Anforderung erforderlich ist, ist ein Fehler aufgetreten. Überprüfen Sie folgende Fehlerinformationen und ändern Sie die Quelldatei entsprechend.

Compilerfehlermeldung: BC32023: Der Ausdruck hat den Typ "System.Data.DataTable", der kein Auflistungstyp ist.

Quellfehler:

Zeile 40: Projekt.Items.Add("Bitte auswählen ...")
Zeile 41: Dim myRow as DataRow
Zeile 42: For Each myRow in myDS.Tables("Projekt")
Zeile 43: Projekt.Items.Add(myRow[0].ToString())
Zeile 44: Next myRow


Ich hoffe ihr seid nicht so verzweifelt wie ich und könnt mir immernoch helfen.

Schöne Grüße Judith
 

drvj

Mitglied
Hallo,
sry mein Fehler. Die rot-markierte Zeile müsste so heißen:
For Each myRow in myDS.Tables("Projekt").Rows

mfg Jens
 

Scouty

Mitglied
Hallo,

Hab ich geändert und dann kam folgende Meldung:

Kompilierungsfehler
Beschreibung: Beim Kompilieren einer Resource, die für diese Anforderung erforderlich ist, ist ein Fehler aufgetreten. Überprüfen Sie folgende Fehlerinformationen und ändern Sie die Quelldatei entsprechend.

Compilerfehlermeldung: BC30518: Die Überlandungsauflösung ist fehlgeschlagen,da keine zugreifbare "Add" mit diesen Argumenten aufgerufen werden kann:

Quellfehler:

Zeile 41: Dim myRow as DataRow
Zeile 42: For Each myRow in myDS.Tables("Projekt").Rows
Zeile 43: Projekt.Items.Add(myRow[0].ToString())
Zeile 44: Next myRow
Zeile 45: Projekt.DataTextField = "TxtProjekt"




Schöne Grüße Judith
 

Scouty

Mitglied
Hallo,

hat dazu niemand weiter eine idee? Ich verzweile hier gerade, weil ich da ewig nicht weiterkomme.

Gruß Scouty