2008-11-17 24 views
6

Tengo una aplicación web, el problema es que el texto de la etiqueta no se actualizará con el primer clic, tengo que hacer clic dos veces en el botón, depurado de código, y descubrí que la etiqueta no recive los datos hasta después del segundo clic,ASP.NET C#, necesito presionar un botón dos veces para que suceda algo

Aquí está mi código:

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

algunos comentarios de OT: - que no es necesario hacer Convert.ToString (Session [ "juego"]). Session [name] es un objeto, por lo que solo tiene que devolverlo: (cadena) Session ["game"] - Debe buscar SQL parametrizado, ya que está muy abierto a los ataques de inyección –

+0

Definitivamente busque SQL parametrizado. –

Respuesta

11

Para ser muy claro. El evento de clic de botón ocurre después del evento Page_Load, lo que significa que el filtrado no se aplica en la primera devolución de datos. Se ha actualizado en la segunda devolución y ves el filtrado. El cambio más simple para hacer que su código funcione es mover todo el código en su evento Page_Load a OnPreRender para que la recarga ocurra después del evento de clic del botón.

Sin embargo, una solución más limpia probablemente sea moverla a una función LoadData y llamarla a PageLoad cuando no sea una devolución de datos y también llamarla al hacer clic en el evento después de actualizar sus filtros. Eso evitará que una llamada a la base de datos en cualquier ciclo página devolución de datos que no necesitan volver a cargar los datos:


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(); 
} 

Un último consejo rápido para un desarrollador ASP.Net en ciernes es aprender a fondo el ciclo de vida de la página. Conocer la secuencia de eventos en una página es esencial. Buena suerte.

2

que no estoy viendo la típica

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

en su método Page_Load , lo que significa que su enlace de datos ocurrirá cada vez que se cargue la página, lo que probablemente cause su problema. Sugiero agregar eso al código y ver si resuelve el problema.

6

Los manejadores de eventos de clic de botón suceden DESPUÉS de Page_Load. Intenta usar Page_LoadComplete en su lugar.

Por lo tanto, en su código, una vez que se hace clic en el botón, el evento page_load dispara y establece los datos, luego el evento btnClick desencadena y cambia los datos. Pero, los datos ya estaban vinculados en su forma anterior. Es por eso que toma 2 clics para que funcione.

Si coloca el mismo código page_load en el evento page_loadcomplete, sucederá después del evento btnClick. Eso debería producir el resultado deseado.

7

La descripción general de Microsoft del Page Life Cycle puede ser útil para comprender el flujo (y resolver su problema).

+1

Ese es un artículo tan bueno, constantemente lo refiero a personas –

1

JackCom, ¡la solución funcionó! Gracias. Y estudiaré el ciclo de vida de la página. Debo añadir, que solo tengo experiencia en desarrollo de software, recién comencé con el desarrollo web este otoño.

0

Me quedé atrapado en esto durante aproximadamente una semana. Finalmente, he guardado el código para el evento Button_Click en el evento TextChanged y funcionó. Al presionar el botón, el foco sale del TextBox para que el evento se desactive cuando el evento Button_click no. Muy kludgy. No me gusta

me encontré con un artículo interesante que en realidad no funciona para mí, pero estoy contento de haber leído todos modos: Enter and the Button Click Event

que podría funcionar en otras situaciones.

0

ASP.Net puede hacer cosas realmente raras a veces.Estaba teniendo el mismo problema hoy. Descubrí que había puesto un AutoPostBack = "verdadero en un TextBox y aunque no funcionó para hacer lo que quería, olvidé sacar el AutoPostBack del marcado. Cuando hice clic en un botón en la misma fila de la tabla, el primer clic causó dos devoluciones, pero no desencadenó el evento del botón. Al hacer clic en el botón la segunda vez que se activó el botón, cuando se produjo el error de AutoPostBack en el marcado, el evento del botón comenzó a dispararse en el primer clic. que el cuadro de texto no estaba conectado de ninguna manera al botón excepto que el botón clic evento hizo referencia al contenido del cuadro de texto.

1

Tuve el mismo problema en mi página Cada vez que tenía que hacer clic dos veces para que funcione Esto fue causado por un cuadro de texto y una lista desplegable que tenían el autopostback establecido en verdadero. O Una vez que quité el autopostback, incluso se realizó sin problemas y los clics individuales se activan correctamente.

0

No sé bien sobre esto, pero este trabajo truco para mí:

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

Si bien esto puede funcionar técnicamente, ¿puedes mirar el código y determinar por qué el código no funciona en primer lugar? –

Cuestiones relacionadas