Gjest Slettet-aNZFa3 Skrevet 17. november 2008 Del Skrevet 17. november 2008 Jeg har lagd en liten side, når den laster så henter den ut all data fra databasen, det funker fint. Jeg har også lagd et lite filter system, så når brukeren velger å filtrere bort noen ting, så skal selvsagt da bare de dataene som møter de kriteriene komme fram, det funker fint, men jeg må trykke 2 ganger på filter knappen for at noe skal skje, jeg har debugga koden, og det viser at variablene blir ikke oppdatert før andre gangen jeg trykker på knappen, hvorfor det? Legger ved koden: Klikk for å se/fjerne innholdet nedenfor using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class Download : System.Web.UI.Page { System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(); System.Data.SqlClient.SqlConnection connection; string CommandText; string game; string modtype; bool filter; protected void Page_Load(object sender, EventArgs e) { labDownloadList.Text = null; //Session variables: if (Session["Game"] != null) { game = Convert.ToString(Session["Game"]); } if (Session["ModType"] != null) { modtype = Convert.ToString(Session["ModType"]); } if (Session["FilterBool"] != null) { filter = Convert.ToBoolean(Session["FilterBool"]); } string ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\inetpub\\wwwroot\\stian\\App_Data\\Database.mdf;Integrated Security=True;User Instance=True"; connection = new System.Data.SqlClient.SqlConnection(ConnectionString); System.Data.SqlClient.SqlDataReader reader; command = connection.CreateCommand(); connection.Open(); CommandText = "SELECT * FROM Command"; if (filter) { CommandText = "SELECT * FROM Command WHERE Game='" + game + "' AND Type='" + modtype + "'"; } command.CommandText = CommandText; reader = command.ExecuteReader(); labDownloadList.Text = ""; while (reader.Read()) { string game = reader.GetString(1); string author = reader.GetString(2); string downloadlink = reader.GetString(3); string size = reader.GetString(4); string description = reader.GetString(5); string version = reader.GetString(6); string screenshotlink = reader.GetString(7); Int64 AmountDownloaded = reader.GetInt64(8); labDownloadList.Text += "Game: " + game + "<br>"; labDownloadList.Text += "Author: " + author + "<br>"; labDownloadList.Text += "Size: " + size + "<br>"; labDownloadList.Text += "Description: " + description + "<br>"; labDownloadList.Text += "Version: " + version + "<br>"; labDownloadList.Text += "<img src='" + screenshotlink + " /><br>"; labDownloadList.Text += "Downloaded: " + AmountDownloaded + " times<br><hr>"; labDownloadList.Text += "<a href='" + downloadlink + "'>Download</a><br>"; } } protected void Page_UnLoad(object sender, EventArgs e) { Session["Game"] = game; Session["ModType"] = modtype; Session["FilterBool"] = filter; connection.Close(); } protected void btnFilter_Click(object sender, EventArgs e) { game = lstGames.SelectedValue; modtype = lstTypeMod.SelectedValue; filter = true; } } Lenke til kommentar
BennyXNO Skrevet 21. november 2008 Del Skrevet 21. november 2008 (endret) Du må få kontroll over event systemet i Asp.net først ser det ut som. PageLoad blir kalt før eventet ditt ser du. Slik at filteret du har satt, blir aktiv først gangen etter at du velger det. Du kan jo prøve å endre det, og selv se at dette skjer når du bytter filter. - du bør lære deg å skille funksjoner fra hverandre. En metode skal bare gjøre en spesifikk oppgave og kun det. PageLoaden din gjør alt for mye på en gang, anbefaler deg at du skiller iniatialisering av databaseting fra alt det andre. Gjerne lag deg et bibliotek som gjør oppgaven for deg, dette kan du gjenbruke til andre oppgaver du får i fremtiden! I pageLoaden bør du bruke funksjonen IsPostBack for å sjekke om det er første gangen LoadPage blir kalt. Initalisering av systemet skjer hver gang hos deg. Det er skikkelig dumt. Særlig siden eventsystemet sørger for at pageload blir kalt før eventene. Du bruker nå Page_Unload til å lukke Connection, det er så fyfy som det går an. Du må lukke connection i den samme methoden som du åpner den. Du lukker ikke readeren din, det er du nødt til å gjøre. Anbefaler deg at du bruker følgende syntax på når du skal bruke readere for fremtiden. Dette sørger for at readeren din blir ryddet opp automatisk. Using (IDataReader reader = FetchGameAndModByReader(filterAktive, game, modtype)) { while (reader.Read()) { ... } } Som en siste bemerkning synes jeg noen er optimitisk når det gjelder antall forventa nedlastninger Endret 21. november 2008 av BennyXNO 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å