2008-11-17 11 views
6

Mam aplikację internetową, problem polega na tym, że tekst na etykiecie nie zostanie zaktualizowany za pierwszym kliknięciem, muszę dwukrotnie kliknąć przycisk, I debugowania kodu, a okazało się, że etykieta nie recive danych aż po drugim kliknięciemASP.NET C#, trzeba nacisnąć dwa razy przycisk, aby coś się stało

Oto mój kod:

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; 
} 
+0

niektóre komentarze OT: - Nie trzeba robić Convert.ToString (Session [ „gra”]). Sesja [nazwa] jest obiektem, więc musisz go odrzucić: (ciąg) Sesja ["gra"] - Powinieneś zajrzeć do paramertyzowanego SQL, ponieważ jesteś bardzo otwarty na ataki przy wtrysku –

+0

Zdecydowanie zajrzyj do sparametryzowanego SQL. –

Odpowiedz

11

Aby było bardzo jasne. Zdarzenie click button występuje po zdarzeniu Page_Load, co oznacza, że ​​filtrowanie nie zostanie zastosowane po pierwszym odświeżeniu. Został zaktualizowany na drugim ogloszeniu zwrotnym i zobaczysz filtrowanie. Najprostszą zmianą w uruchomieniu kodu jest przeniesienie całego kodu w zdarzeniu Page_Load do OnPreRender, aby przeładowanie odbywało się po zdarzeniu kliknięcia przycisku.

Czystszym rozwiązaniem jest prawdopodobnie przeniesienie go do funkcji LoadData i wywołanie go na PageLoad, gdy nie jest to odświeżenie, a także wywołanie go w zdarzeniu kliknięcia przycisku po aktualizacji filtrów. Który uniemożliwi połączenie z bazą danych na temat wszelkich cykli stronie odświeżenie strony, które nie potrzebują aby odświeżyć dane:


protected void Page_Load(object sender, EventArgs e) 
{  
    if (!Page.IsPostBack) 
     { 
      LoadData() 
     } 
} 

private void LoadData() 
{ 
    labDownloadList.Text = null; 
    //Session variables:  
    if (Session["Game"] != null) 
    ... 
} 

protected void btnFilter_Click(object sender, EventArgs e) 
{  
    game = lstGames.SelectedValue; 
    modtype = lstTypeMod.SelectedValue; 
    filter = true; 
    LoadData(); 
} 

Ostatnim kawałkiem szybkiej porady dla początkującego programisty ASP.Net jest, aby dokładnie dowiedzieć się cykl życia strony. Konieczna jest znajomość sekwencji zdarzeń na stronie. Powodzenia.

2

nie widzę typowy

if (!Page.IsPostBack) 
{ 
    ... 
} 

w swojej metodzie Page_Load , co oznacza, że ​​twoje powiązanie będzie występować za każdym razem, gdy strona zostanie załadowana, najprawdopodobniej powodując twój problem. Sugeruję dodanie tego kodu i sprawdzenie, czy to rozwiązuje problem.

6

Przyciski obsługi zdarzeń click button występują PO LOCZENIU strony. Zamiast tego użyj strony Page_LoadComplete.

W kodzie, po kliknięciu przycisku, zdarzenie page_load uruchamia i ustawia dane, a następnie zdarzenie btnClick uruchamia się i zmienia dane. Ale dane były już związane w starej formie. Dlatego potrzeba dwóch kliknięć, aby zadziałał.

Jeśli zamiast tego wstawisz ten sam kod page_load do zdarzenia page_loadcomplete, stanie się to po zdarzeniu btnClick. To powinno dać pożądany rezultat.

7

Przegląd firmy Microsoft pod numerem Page Life Cycle może być pomocny w zrozumieniu przepływu (i rozwiązania problemu).

+1

To jest świetny artykuł, ciągle go do niego kieruję. –

1

JackCom, rozwiązanie zadziałało! Dziękuję Ci. I będę studiować cykl życia strony. Muszę dodać, że mam tylko doświadczenie w tworzeniu oprogramowania. Właśnie zacząłem od rozwoju tej jesieni.

0

Utknąłem na tym przez około tydzień. Na koniec umieściłem kod dla zdarzenia Button_Click w wydarzeniu TextChanged i zadziałało. Naciśnięcie przycisku powoduje, że fokus zostanie pozostawiony TextBox, aby zdarzenie zostało wywołane, gdy zdarzenie nie zostanie wykonane. Bardzo kludgy. Nie podoba mi się to.

natknąłem się na ciekawy artykuł, który faktycznie nie działa dla mnie, ale cieszę się, że czytać to tak: Enter and the Button Click Event

To może działać w innych sytuacjach.

0

ASP.Net potrafi czasami robić naprawdę dziwne rzeczy.Miałem ten sam problem dzisiaj. Zauważyłem, że umieściłem AutoPostBack = "true na TextBox i chociaż nie działało to, co chciałem, zapomniałem usunąć AutoPostBack ze znaczników. Kiedy kliknąłem przycisk w tym samym rzędzie tabeli, pierwsze kliknięcie spowodowało dwa powiadomienia zwrotne, ale nie wywołało zdarzenia przycisku Po kliknięciu przycisku po raz drugi wywołano zdarzenie click button, a po znalezieniu nieistotnej funkcji AutoPostBack ze znacznika zdarzenie przycisku zaczęło się uruchamiać za pierwszym kliknięciem. że pole tekstowe nie było w żaden sposób połączone z przyciskiem z wyjątkiem tego, że zdarzenie click button odnosiło się do zawartości pola tekstowego

1

Miałem ten sam problem na mojej stronie Za każdym razem musiałem kliknąć dwa razy, aby uruchomić .Narzędzie: Zostało to spowodowane przez niektóre pola tekstowe i listę rozwijaną z ustawieniem autopostraka na wartość true. nce Usunąłem autopostback nawet poszło gładko i jedno kliknięcie uruchamia się poprawnie.

0

nie dobrze o tym wiedzą, ale praca ta sztuczka dla mnie:

function pageLoad(sender, args) { 
    $(document).ready(function() { 
     //your stuff 
    }); 
    $(":button").each(function() { 
     $(this).click(); 
     //this is a trick; click one when page load, 
    }); 
} 
+0

Chociaż może to technicznie zadziałać, czy możesz spojrzeć na kod i ustalić, dlaczego kod nie działa w pierwszej kolejności? –

Powiązane problemy