:Francis: Skrevet 23. april 2009 Del Skrevet 23. april 2009 (endret) Hei! Jeg Har en side med to DropDownList på seg. Den ene listen populeres i Page_Load() med informasjon som hentes fra en database. Det jeg ønsker er at jeg ved å velge et element på DropDownListen min kan bruke det som står i den i en SQL spørring for å populere den andre boksen. protected void Page_Load(object sender, EventArgs e) { dbConn = tcObj.returnConnection(); try { dbConn.Open(); } catch (Exception connectionException) { } populateClientDropdown(); } private void populateClientDropdown() { clientDownList.Items.Clear(); executeReader("SELECT Company FROM Client"); dropDownElements.Clear(); while (dbReader.Read()) { dropDownElements.Add(dbReader["Company"].ToString()); } dbReader.Close(); for (int i = 0; i < dropDownElements.Count; i++) { ListItem lstItem = new ListItem(dropDownElements[i].ToString()); clientDownList.Items.Add(lstItem); } } private void populateSubClientDropdown() { subClientDropDownList.Items.Clear(); executeReader("SELECT Client_Location.Sub_Company_Name FROM Client_Location, Client WHERE Client_Location.Client_ID = Client.ID_Client AND Client.Company = '" + clientDownList.Text +"'"); dropDownElements.Clear(); while (dbReader.Read()) { dropDownElements.Add(dbReader["Sub_Company_Name"].ToString()); } for (int i = 0; i < dropDownElements.Count; i++) { ListItem lstItem = new ListItem(dropDownElements[i].ToString()); subClientDropDownList.Items.Add(lstItem); } } protected void clientDownList_SelectedIndexChanged(object sender, EventArgs e) { populateSubClientDropdown(); } <asp:DropDownList ID="clientDownList" runat="server" AutoPostBack="True" onselectedindexchanged="clientDownList_SelectedIndexChanged"> </asp:DropDownList> Det som skjer nå, er at Page_Load() kjøres hver gang jeg endrer element i DropDownListen min, noe som resulterer i at feil verdi blir brukt når jeg bruker clientDownList.Text i spørringen min. Håper at noen tar seg tid til å hjelpe meg Mvh Francis Endret 25. april 2009 av :Francis: Lenke til kommentar
Trondster Skrevet 23. april 2009 Del Skrevet 23. april 2009 Tror du godt kan starte med å legge en "if (dropDownElements.Count==0)" rundt kallet til populateClientDropdown - ellers ber du jo om å få utført den hver eneste postback - Page_Load blir jo kalt hver postback. Lenke til kommentar
Trondster Skrevet 23. april 2009 Del Skrevet 23. april 2009 Ellers: Pass på SQL injection.. Parameteriser alltid alltid alltid alltid samtlige sql-parametre: SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "SELECT Client_Location.Sub_Company_Name FROM Client_Location, Client WHERE Client_Location.Client_ID = Client.ID_Client AND Client.Company = @Company"; cmd.Parameters.AddWithValue("@Company", clientDownList.Text); Husk Bobby Tables... Lenke til kommentar
:Francis: Skrevet 23. april 2009 Forfatter Del Skrevet 23. april 2009 (endret) Tusen tusen takk! Dette løste problemet: private void populateClientDropdown() { if (clientDownList.Text == "") { clientDownList.Items.Clear(); executeReader(getClientString); dropDownElements.Clear(); while (dbReader.Read()) { dropDownElements.Add(dbReader["Company"].ToString()); } dbReader.Close(); for (int i = 0; i < dropDownElements.Count; i++) { ListItem lstItem = new ListItem(dropDownElements[i].ToString()); clientDownList.Items.Add(lstItem); } } } Francis Endret 23. april 2009 av :Francis: Lenke til kommentar
Trondster Skrevet 23. april 2009 Del Skrevet 23. april 2009 Tusen tusen takk! Dette løste problemet: Nja - "" kan også potensielt være en gyldig verdi - pleier selv da heller å teste på om Count == 0 Av paranoia-hensyn, så pleier jeg å ikke lese verdien fra dropdown'en - pleier heller å lagre det internt i en array/liste, og lagrer indekset i listen i dropdown'en. Da kan man ikke hacke seg til ugyldige verdier.. Bra det fungerer igjen! Men - parameteriser SQL-queriene dine, ellers vanker det kokos og sprekker i objektivet! Lenke til kommentar
:Francis: Skrevet 23. april 2009 Forfatter Del Skrevet 23. april 2009 (endret) Jeg er 110% sikker på at brukerne av systemet ikke kan SQL, men det er kanskje ikke så dumt å gardere seg mot det i tilfelle rottefelle. Jeg hadde helt ærlig ikke tenkt tanken en gang. Når jeg programmerte websiden min brukte jeg PHP sin innebygde funksjon for å unngå denne problematikken: $name_bad = mysql_real_escape_string($name_bad); Mvh Francis Endret 23. april 2009 av :Francis: Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå