Zum Inhalt springen

C# Probleme mit Dropdownlisten


Empfohlene Beiträge

Geschrieben

Ich bin dabei eine Webanwendung zu schreiben die dummerweise viele Dropdownlistenfelder enthält(25). Das Problem ist das ich eine Funktion geschrieben habe mit der ich aus einer Datenbank die Werte wieder in die Dropdownlisten hole, diese aber in dem Page_Load ereignis nicht funktioniert.

Die funktion Funktion wird auch in einen OnClick erreignis aufgerufen und funktioniert ohne Probleme.

Das besondere an dem Problem ist das in alle Dropdownlisten der selbe wert geschrieben wird und zwar der der in die letzte DDL geschrieben wird.

Der Code der die Dropdownlisten füllen soll:

Für die SQLAbfragen wird eine extra Klasse verwendet


SqlCommand CntrHaupt = new SqlCommand("SELECT O_ID, TAETIGKEIT, STUNDEN, U_ID, LAUFENDE_NUMMER, AUSBILDUNGSJAHR FROM Haupt WHERE N_ID = '" + NID() + "' AND Haupt.DATUMVOM='" + Convert.ToDateTime(lb_NachweisDatum.Text.Substring(9, 10)) + "'", scn);

SqlDataReader dat = CntrHaupt.ExecuteReader();


for(int i=1;i<26;i++)

{

   DropDownList UDDL = (DropDownList)this.FindControl("Schule" + z.ToString());

   UDDL.SelectedIndex = dat.GetInt32(3);

}

Der Fehler tritt auch nur im Form_Load auf.

Ich hoffe ihr könnt mir helfen.

Ich danke schonmal für alle hilfreiche Beiträge.

Geschrieben (bearbeitet)

Sorry aber der Fehler mit i und z ist nur hier hab mich verschrieben!

Und der Fehler ist das allen Dropdownfelder am Schluss den Selben Index kriegen und das is immer der index den die letzte Dropdownlist zugewiesen kriegt.

Sprich wenn der index der 25. Dropdownliste 1 ist dann haben alle dropdownlisten den index von 1 und in der Datenbank die werte sind auch richtig.


SqlCommand CntrHaupt = new SqlCommand("SELECT O_ID, TAETIGKEIT, STUNDEN, U_ID, LAUFENDE_NUMMER, AUSBILDUNGSJAHR FROM Haupt WHERE N_ID = '" + NID() + "' AND Haupt.DATUMVOM='" + Convert.ToDateTime(lb_NachweisDatum.Text.Substring(9, 10)) + "'", scn);

SqlDataReader dat = CntrHaupt.ExecuteReader();


for(int i=1;i<26;i++)

{

   DropDownList UDDL = (DropDownList)this.FindControl("Schule" + i.ToString());

   UDDL.SelectedIndex = dat.GetInt32(3);

   dat.Read();

}

so is richtig

Bearbeitet von Asenir
Geschrieben

Okay, aber das ist doch auch genau das was du programmiert hast:

Hier mal in Pseudocode:



SQLStatement = "...";

SQLStatement.Ausführen();


von (i = 1 bis 26)

{

   DropDownList UDDL = finden wo der name = "Schule" + i;

   Index von UDDL setzen auf = Immer die gleiche Row des SQL-Results Spalte 3

}


Hier ist kein Code vorhanden der die DDLs füllt sondern nur einer der den Index setzt, und dann auch immer auf den gleichen Wert weil du nicht durch das Resultset itterierst. Ich hätte sogar vermutet das eine Exception auftritt weil man den DataReader normalerweise erst verwenden kann nachdem man einmal Read() aufgerufen hat.

Wenn du in alle DDLs die gleichen Werte schreiben willst solltest du einen TableAdapter oder DataAdapter verwenden um ein Dataset zu füllen und den DDLs über uddl.DataSource = myDataSet; uddl.DataBind(); die Werte zuweisen. Danach kannst du z.B. noch ein uddl.SelectedIndex = 0; machen um immer das erste Element auszuwählen.

Sofern die DDLs im Viewstate der Seite gespeichert werden musst du im Page_Load im Falle eines Postbacks die Daten auch nicht nochmal laden.

Geschrieben (bearbeitet)

Ich will aber nicht in jede DDL den selben Wert haben sondern den der in der DB steht(in der DB stehen die indexes). Im Page_Load habe steht das ganze auch unter if(!Page.IsPostBack) also nur wenn die Seite zum erstenmal geladen wird genauso steht vorher im Code noch ein if(dat.Read()).

Das ganze funktioniert auch wenn ich es mit dem OnClick erreignis aufrufe aber nicht im Page_Load.

Habe außerdem noch das dat.read() mit drin(mein 2.post) welches denn datareader jedesmal in die nächste zeile springen lässt.

Das komische ist das wenn ich den teil vom Code auskommentiere und


Schule3.SelectedIndex = 3;

(so heißen die DDL im asp)

schreibe dann werden auch alle 25 ddl auf index=3 gesetzt was ich dabei nicht verstehe ist das keine schleife vorhanden ist welche die anderen ddls auf den indexwert setzt.(aber auch nur im page_load)

@Amstelchen

Mein debugger funktioniert leider nicht aber ich kann mit sicherheit sagen des im SQLDataReader aufjedenfall eine Ergebnismenge steht.

Bearbeitet von Asenir
Geschrieben

Vergessen wir erstmal das es bei OnClick zufällig funktioniert: Der Code ist auf jeden Fall nicht korrekt und unsauber. Du musst den ersten Read auf dem DataReader machen bevor du auf die Ergebnismenge zugreifst und zusätzlich prüfen ob er überhaupt Werte liefert, sonst bekommst du Probleme wenn sich dein Resultset ändert.

Das Standardvorgehen ist:


while (reader.Read() != null )

{

    ....

}


In deinem ersten Post schreibst du: "Der Code der die Listen füllen soll: .." Der Code den du dort gepostet hast füllt die Liste aber in keinem Fall (hierzu müsstes du ddl.Items.Add(...) oder noch besser DataBind(); aufrufen) sondern setzt lediglich Indizies. Wenn deine DDLs trotzdem gefüllt sind, hast du noch irgendetwas anderes gemacht, z.B. DataBinding auf dem WebForm, und das wird vermutlich dein Problem sein weil es bei bestimmten fällen erst nach dem Index-Wechsel-Code ausgeführt wird.

Um jetzt irgendwie zum Ziel zu kommen: Beschreib dochmal komplett was du machen willst, das habe ich noch nicht verstanden. Du willst vermutlich

1. Die DDLs mit einem SQLQuery Result befüllen und dann

2. a) Die SelectedIndizes der DDLs mit einem zweiten Query setzen? Oder soll B) jedes DDLs immer einen SelectedIndex von +1 zu dem vorherigen haben?

3. Welche Version von Visual Studio und .NET verwendest du?

Geschrieben

Ok ich hab mich unsauber ausgedrückt mit "ddl füllen" meinte ich eigentlich nur das ich die selectedIndex setzten will.

Was ich machen will:

1. Ich habe eine DB mit meheren Tabellen in einer davon habe ich eine Spalte U_ID, welche einen wert von 0 bis 6 enthält.

Mit der Abfrage hole ich diesen wert für ein bestimmtes datum und einen bestimmten user. Das abfrageergebnis hat sozusagen immer genau 25 Datensätze.

2. Nun soll den ddls dieser wert als SelectedIndex zugewiesen werden, dabei soll der reihe nach vorgegangen werden also 1. datensatz des readers = 1.ddl.selectedindex, 2. datensatz des readers = 2. ddl.selectedIndex, usw.

Befüllen mit ddl.additem habe ich die ddls schon vorher mit als erstes im Page_Load daran liegt es also nicht.

Ich arbeite mit der version vs 2005 und .NET 2.0

Ich hoffe das war einiegermaßen verständlich erklärt.

Und hier nochmal der Code wie er der reihen nach im Page_Load ausgefürt wird.(Es ist nicht der gesamte Code sondern nur der Teil der mit den ddls zutun hat. Der gesamte Code wäre einfach zuviel)


Fill_DDL();  //Hier werden die DDLs gefüllt mit ddl.additem

if(!Page.IsPostBack)

{

   SqlCommand CntrHaupt = new SqlCommand("SELECT O_ID, TAETIGKEIT, STUNDEN, U_ID, LAUFENDE_NUMMER, AUSBILDUNGSJAHR FROM Haupt WHERE N_ID = '" + NID() + "' AND Haupt.DATUMVOM='" + Convert.ToDateTime(lb_NachweisDatum.Text.Substring(9, 10)) + "'", scn);

   SqlDataReader dat = CntrHaupt.ExecuteReader();


   if(dat.Read())

   {

      for(int i=1;i<26;i++)

      {

         DropDownList UDDL = (DropDownList)this.FindControl("Schule" + i.ToString());

         UDDL.SelectedIndex = dat.GetInt32(3);

         dat.Read();

      }

   } 

}

Sorry das ich das nicht gleich so gemacht habe aber danke für die gedult!!!

Geschrieben

Hm...ich hab das gerade mal ausprobiert, das hier funktioniert auf Anhieb (ich habe eine Webpage mit 3 DDls erstellt)


public partial class _Default : System.Web.UI.Page 

{

    private string[] data = { "Value1", "Value2","Value3"};


    protected void Page_Load(object sender, EventArgs e)

    {

        if (!this.IsPostBack)

        {

            // Beim ersten laden....

            this.FillDDLs();


            for (int i = 1; i < 4; i++)

            {

                DropDownList ddl = this.FindControl("DropDownlist" + i.ToString()) as DropDownList;

                if (ddl != null)

                {

                    ddl.SelectedIndex = i-1;

                }

            }

        }

    }



    private void FillDDLs()

    {

        this.DropDownList1.DataSource = this.data;

        this.DropDownList1.DataBind();


        this.DropDownList2.DataSource = this.data;

        this.DropDownList2.DataBind();


        this.DropDownList3.DataSource = this.data;

        this.DropDownList3.DataBind();

    }

}

Dadurch das die DDLs per Default im Viewstate sind, braucht man die Selektion und das Binding nur beim ersten laden der Seite machen. Ich hab hier gerade keine Datenbank zum testen, aber ich würde das aus dem Kopf dann so abwandeln:

// .... SqlConnection, SqlCommand usw. erstellen und ausführen...


            for (int i = 1; i < 4; i++)

            {

                if (!reader.Read()) // Wichtig, Read() vor erstem Zugriff!

                {

                    throw new ArgumentOutOfRangeException("Not enough Rows in Resultset!");

                }


                DropDownList ddl = this.FindControl("DropDownlist" + i.ToString()) as DropDownList;

                if (ddl != null)

                {

                    ddl.SelectedIndex = reader.GetInt32(0);

                }

                else  // Control nicht gefunden oder gefundenes Control ist kein DDL

                {

                    throw new ArgumentOutOfRangeException("Control could not be found!");

                }

            }


            reader.Close();  // Ganz wichtig!


So funktioniert das bei mir ohne Probleme, wenn es bei dir trotzdem nicht gehen sollte musst du den kompletten Page-Source posten.

Geschrieben

Das ist eigentlich genau das selbe wie ich es geschrieben habe.

Zum Verständniss die Anwendung ist dazu da um Ausbildungsnachweise zuerstellen die in einer db gespeichert werden um Sie eventuell wieder aufrufen oder ausdrucken zu können.


protected void Page_Load(object sender, EventArgs e)

    {

        //Datenbank deklarieren

        data_bases dbs = new data_bases();

        SqlConnection scn = dbs.sql_con("Ausbildungsnachweis");


        Arbeit1.Focus();

        Fehler.Text = "";

        access_gr();

        DBNameInsert();

        Schulfunk(sender, e);


        //jscript verweis

        //Ausführen wenn Textbox Gesamt 1 bis 5 Fokus verliert

        Gesamt1.Attributes.Add("onblur", "Gesamtstunden()");

        Gesamt2.Attributes.Add("onblur", "Gesamtstunden()");

        Gesamt3.Attributes.Add("onblur", "Gesamtstunden()");

        Gesamt4.Attributes.Add("onblur", "Gesamtstunden()");

        Gesamt5.Attributes.Add("onblur", "Gesamtstunden()");

        RechneGesamt.Attributes.Add("onKeyDown", "pressKey()");


        //Wenn Seite zum ersten mal geladen wird

        if (!Page.IsPostBack)

        {

            fill_DDL();

            Laufnummer();


            // Aktuellen nachweis Eintragen

            try

            {

                //Höchstes Datum auslesen

                SqlCommand Datum = new SqlCommand("SELECT MAX(DATUMVOM), MAX(DATUMBIS) FROM Haupt WHERE N_ID = '" + NID() + "'", scn);

                SqlDataReader ReadDate = Datum.ExecuteReader();


                if (ReadDate.Read())

                    lb_NachweisDatum.Text = "Nachweis:" + ReadDate.GetDateTime(0).ToString().Substring(0, 10) + " - " + ReadDate.GetDateTime(1).ToString().Substring(0, 10);


                //Kalenderdatum selectieren

                Kalender.SelectedDate = Convert.ToDateTime(lb_NachweisDatum.Text.Substring(9, 10));

                ReadDate.Close();


                //DB auslesen

                GetAll(sender, e);

                //Fehler.Text=Schule1.SelectedIndex.ToString() + " & " + Schule2.SelectedIndex.ToString();


                //Kalenderwochennummer erstellen und Ausgeben

                lb_status.Text = KalenderWochenNr();

            }

            catch

            {

                Fehler.Text = "Bitte Zuerst ein Datum auswählen.";

            }

        }


        //Maximale Länge der Zeichen in den Textboxen Arbeit festlegen und javascript verweis

        for (int z = 1; z < 26; z++)

        {

            TextBox TBML = (TextBox)this.FindControl("Arbeit" + z.ToString());

            if (Schule.Checked)

            {

                TBML.MaxLength = 31;

            }

            else

            {

                TBML.MaxLength = 37;

            }

        }

        Laufnummer();

        //Nachsehen ob die Steuerelemente für Zugriff gesperrt

        //werden müssen oder Button Erstelle sichtbar                       

        try

        {

            SqlCommand sperr = new SqlCommand("SELECT SPERRE FROM Haupt WHERE N_ID='" + NID() + "' AND KALENDERWOCHE = '" + Convert.ToInt32(lb_status.Text) + "'", scn);

            SqlDataReader abfsperr = sperr.ExecuteReader();


            if (abfsperr.Read())

            {

                if (abfsperr.GetSqlBoolean(0) == true)

                {

                    abfsperr.Close();

                    SperreSteuer();

                    Druck.Visible = true;

                    if (!Page.IsPostBack)

                    {

                        Kalender.SelectedDate = Convert.ToDateTime(lb_NachweisDatum.Text.Substring(9, 10)).AddDays(7);

                        change_Date(sender,e);

                        EntSperre();

                    }

                }

                else

                {

                    abfsperr.Close();

                    EntSperre();

                    if (CntrCompl())

                        Druck.Visible = true;

                    else

                        Druck.Visible = false;

                }

            }

            else

            {

                EntSperre();

                Druck.Visible = false;

            }


        }

        catch

        {

            EntSperre();

            Druck.Visible = false;   

        }

        scn.Close();

    }


 void fill_DDL()

    {

        //Dropdownlisten Schule1 bis Schule25 füllen

        ListItem[] lic = new ListItem[] { new ListItem("WSK"), new ListItem("BP"), new ListItem("AS"), new ListItem("ITS"), new ListItem("SP"), new ListItem("TEN"), new ListItem("")};

        for (int i = 1; i < 26; i++)

        {

            DropDownList Schule = (DropDownList)this.FindControl("Schule" + i.ToString());

            Schule.Items.Clear();

            Schule.Items.AddRange(lic);

        }

    }


public void GetAll(object sender, EventArgs e)

    {

        //Überprüfen ob für das gewählte Datum einträge vorhanden sind


        data_bases dbs = new data_bases();

        SqlConnection scn = dbs.sql_con("Ausbildungsnachweis");


        SqlCommand CntrHaupt = new SqlCommand("SELECT O_ID, TAETIGKEIT, STUNDEN, U_ID, LAUFENDE_NUMMER, AUSBILDUNGSJAHR FROM Haupt WHERE N_ID = '" + NID() + "' AND Haupt.DATUMVOM='" + Convert.ToDateTime(lb_NachweisDatum.Text.Substring(9, 10)) + "'", scn);

        SqlDataReader dat = CntrHaupt.ExecuteReader();


        //Steuerelement füllen


        if (dat.Read())

        {

            //DropDownList UDDL;


            //Überprüfen ob Schule oder Betrieb

            if (dat.GetInt32(0) == 1)

            {

                Betrieb.Checked = true;

                Schule.Checked = false;

                Schulfunk(sender, e);

            }

            else

            {

                Schule.Checked = true;

                Betrieb.Checked = false;

                Schulfunk(sender, e);

            }


            for (int z = 1; z < 26; z++)

            {

                //Textboxen füllen

                TextBox tb = (TextBox)this.FindControl("Arbeit" + z.ToString());

                tb.Text = dat.GetString(1);


                switch (z)

                {

                    case 1:

                        Gesamt1.Text = dat.GetDecimal(2).ToString();

                        break;

                    case 6:

                        Gesamt2.Text = dat.GetDecimal(2).ToString();

                        break;

                    case 11:

                        Gesamt3.Text = dat.GetDecimal(2).ToString();

                        break;

                    case 16:

                        Gesamt4.Text = dat.GetDecimal(2).ToString();

                        break;

                    case 21:

                        Gesamt5.Text = dat.GetDecimal(2).ToString();

                        break;

                }

                //Dropdonlisten Schule1 - bis Schule25 füllen

                //

                //DAS IST DER RELEVANTE TEIL

                //

                DropDownList UDDL = (DropDownList)this.FindControl("Schule" + z.ToString());

                UDDL.SelectedIndex = dat.GetInt32(3) - 1;


                //Laufende Nummer und Ausbildugsjahr eintragen

                Label LaufNr = (Label)this.FindControl("LaufendeNummer");

                LaufNr.Text = Convert.ToString(dat.GetInt32(4));


                TextBox ABJ = (TextBox)this.FindControl("Ausbildungsjahr");

                ABJ.Text = Convert.ToString(dat.GetInt32(5));


                dat.Read();

            }


            dat.Close();

        }


        else

        {

            dat.Close();

            Laufnummer();

        }

        scn.Close();

    }

Ich kann auch definitiv sagen das die dropdownlisten in keiner anderen funktion beeinflusst werden!

Nochmal zur der Version ist die Express Edition falls das irgentwie relevant ist.

Falls der Code noch nicht reicht poste ich wirklich den ganzen sind allerdings knapp 1400 Zeilen also sehr unübersichtlich.

Geschrieben

Ich kann das so nicht nachvollziehen, ich hab mir den Code jetzt mal angesehen aber sind zu viele Elemente drin die Auswirkung auf das Verhalten haben können (Was macht das JScript, wie sind die DDLs definiert wie sieht das Resultset der SQL Abfrage aus usw.)

Wenn du so nicht weiterkommst würde ich eine neue leere Seite erstellen und mit dem Code von mir als Grundlage anfangen, da kopierst du deinen Fill und SelectedIndex Code rein und guckst ob das Verhalten wie gewünscht ist, dann musst du nur noch die Unterschiede zwischen den Pages vergleichen.

Geschrieben

So mein Ausbilder hat das Problem jetzt entdeckt.

Es war beim Befüllen der ddls entstanden.

statt


void fill_DDL()

    {

        //Dropdownlisten Schule1 bis Schule25 füllen

        ListItem[] lic = new ListItem[] { new ListItem("WSK"), new ListItem("BP"), new ListItem("AS"), new ListItem("ITS"), new ListItem("SP"), new ListItem("TEN"), new ListItem("")};

        for (int i = 1; i < 26; i++)

        {

            DropDownList Schule = (DropDownList)this.FindControl("Schule" + i.ToString());

            Schule.Items.Clear();

            Schule.Items.AddRange(lic);

        }

    }


mus das ganze so aussehen

void fill_DDL()

    {

        //Dropdownlisten Schule1 bis Schule25 füllen

        for (int i = 1; i < 26; i++)

        {

            ListItem[] lic = new ListItem[] { new ListItem("WSK"), new ListItem("BP"), new ListItem("AS"), new ListItem("ITS"), new ListItem("SP"), new ListItem("TEN"), new ListItem("")};

            DropDownList Schule = (DropDownList)this.FindControl("Schule" + i.ToString());

            Schule.Items.Clear();

            Schule.Items.AddRange(lic);

        }

    }

Muss wahrscheinlich ein Bug sein!

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...