2008-11-17 7 views
6

У меня есть веб-приложение, проблема в том, что текст в ярлыке не будет обновляться при первом щелчке, мне нужно дважды щелкнуть кнопку, я отлажена в коде, и я обнаружил, что этикетка не не Получать данные, пока после второго щелчка,ASP.NET C#, нужно нажать кнопку дважды, чтобы что-то произошло

Вот мой код:

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

некоторого OT комментарий: - Вам не нужно делать Convert.ToString (Session [ «игры»]). Session [name] - это объект, поэтому вам просто нужно его вернуть: (строка) Session ["game"] - Вы должны изучить параметризованный SQL, поскольку вы очень открыты для инъекционных атак. – 2008-11-18 01:45:40

+0

Определенно изучите параметризованный SQL. – 2008-11-18 14:27:10

ответ

11

Чтобы быть предельно ясным. Событие нажатия кнопки происходит после события Page_Load, означающего, что фильтрация не применяется к первой обратной передаче. Он был обновлен во второй обратной передаче, и вы видите фильтрацию. Самое простое изменение, чтобы заставить ваш код работать, - это переместить весь код в ваше событие Page_Load в OnPreRender, чтобы перезагрузка произошла после события нажатия кнопки.

Однако более чистое решение, вероятно, должно переместить его в функцию LoadData и вызвать это на странице Load, если оно не является обратной передачей, а также вызывает его при нажатии кнопки мыши после обновления фильтров. Это предотвратит вызов к базе данных на любых циклах постбэк страниц, которые не нужно перезагружать данные:


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

последний кусок быстрого советы для начинающего разработчика ASP.Net необходимо тщательно изучить жизненный цикл страницы. Знание последовательности событий на странице имеет важное значение. Удачи.

2

Я не вижу типичный

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

в вашем методе Page_Load , что означает, что ваша привязка будет происходить каждый раз, когда страница загружается, что, скорее всего, вызывает вашу проблему. Я бы предложил добавить это в код и посмотреть, устраняет ли он проблему.

6

Обработчики событий нажатия кнопок происходят ПОСЛЕ Page_Load. Вместо этого попробуйте использовать Page_LoadComplete.

Итак, в вашем коде, после нажатия кнопки, событие page_load запускает и устанавливает данные, тогда событие btnClick запускает и изменяет данные. Но данные уже были связаны в старой форме. Вот почему для его работы требуется 2 клика.

Если вы поместите тот же код page_load в событие page_loadcomplete, это произойдет после события btnClick. Это должно привести к желаемому результату.

7

Обзор Microsoft Page Life Cycle может быть полезен для понимания потока (и решения проблемы).

+1

Это такая замечательная статья, я постоянно обращаюсь к людям с ней – 2008-11-18 01:46:31

1

JackCom, решение сработало! Спасибо. И я изучу жизненный цикл страницы. Я должен добавить, что у меня только есть опыт разработки программного обеспечения, я только начал с веб-разработки этой осенью.

0

Я застрял на этом около недели. Наконец, я поместил код для события Button_Click в событие TextChanged, и он сработал. Нажатие кнопки делает фокус покидающим TextBox, так что событие срабатывает, когда событие Button_click нет. Очень глупо. Мне это не нравится.

я наткнулся на интересную статью, которая на самом деле не работает для меня, но я рад, что в любом случае читать: Enter and the Button Click Event

Это может работать и в других ситуациях.

0

ASP.Net может иногда делать что-то странное.Сегодня у меня была такая же проблема. Я обнаружил, что я поместил AutoPostBack = "true в TextBox, и хотя он не работал, чтобы делать то, что я хотел, я забыл вывести AutoPostBack из разметки. Когда я нажал кнопку в той же строке таблицы, первый щелчок вызвал два обратных вызова, но не запустил событие кнопки. После нажатия кнопки второй раз, когда нажимается событие нажатия кнопки. Когда я обнаружил посторонний AutoPostBack из разметки, событие кнопки начало стрелять с первого щелчка. что текстовое поле никак не связано с кнопкой, за исключением того, что событие нажатия кнопки ссылается на содержимое текстового поля.

1

У меня была такая же проблема на моей странице. Каждый раз, когда мне приходилось дважды щелкнуть, чтобы заставить его работать . Это было вызвано некоторым текстовым полем и выпадающим списком с автоповтором, установленным в true. O nce Я удалил автоповтор, даже пошел гладко, а однократные нажатия срабатывают правильно.

0

Я не знаю, хорошо об этом, но этом трюке работе для меня:

function pageLoad(sender, args) { 
    $(document).ready(function() { 
     //your stuff 
    }); 
    $(":button").each(function() { 
     $(this).click(); 
     //this is a trick; click one when page load, 
    }); 
} 
Смежные вопросы