Gå til innhold

C#: Snodig problem med ASP.NET, må trykke på knappen 2 ganger for at noe skjer


Gjest Slettet-aNZFa3

Anbefalte innlegg

Gjest Slettet-aNZFa3

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
Videoannonse
Annonse

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 av BennyXNO
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...