2013-02-20 2 views
1

У меня есть button, который выделяется на первый клик. На второй щелчок по нему должен возвращаться к тому же цвету. Я использую booleanisSelected, чтобы определить, выделено ли оно или нет. Кнопка подсвечивается, но как-то не возвращается к исходному цвету. Любая помощь будет оценена по достоинству.Как сбросить цвет кнопки на втором клике ASP.net?

Я decalring IsSelected в private bool isSelected = false;

Кнопка Event Handler

protected void Button2_Click(object sender, EventArgs e) 
    { 
     if (!isSelected) 
     { 
      isSelected = true; 
      Styles.buttonHighlight(Button2); 
     } 
     else 
     { 
      isSelected = false; 
      Styles.buttonReset(Button2); 
     } 
    } 

Стайлинг Методы

public static void buttonHighlight(Button button) 
    { 
     button.BackColor = Color.Blue; 
     button.ForeColor = Color.White; 
    } 
    public static void buttonReset(Button button) 
    { 
     button.BackColor = ColorTranslator.FromHtml("#ffffff"); 
     button.ForeColor = ColorTranslator.FromHtml("#848484"); 
    } 
+0

Где находится "isSelected"? –

+0

@SystemDown объявлено вне обработчика события – DarknessBeginsHere

+0

Я бы переключил класс css с помощью javascript. Но это только я :) –

ответ

1

Вы пытаетесь сохранить состояние переменной между постбэков ... Это не так просто, как вы думаете ...
В вашем случае вы устанавливаете IsSelected = true еще на следующем Postback (при следующем нажатии кнопки) он возвращается к false, так как переменная re Объявляется при каждой обратной передаче (в этом случае исходное значение false). Asp.Net в основном без гражданства.

Вы могли бы решить эту проблему путем сохранения IsSelected в Session или ViewState или даже как ... скрытое

Я думаю, что ViewState должна быть достаточной для ваших потребностей ...

protected void Button2_Click(object sender, EventArgs e) 
{ 
    bool selected = false; 

    if (ViewState["IsSelected"] != null) 
    { 
     selected = (bool) ViewState["IsSelected"]; 
    } 

    if (!selected) 
    { 
     ViewState["IsSelected"] = true; 
     Styles.buttonHighlight(Button2); 
    } 
    else 
    { 
     ViewState["IsSelected"] = false; 
     Styles.buttonReset(Button2); 
    } 
} 

Использование Сессии совершенно одинаково, просто измените ViewState на Session в вышеуказанном коде. Вы должны немного прочитать о различии между ними (я добавил ссылки) и посмотреть, что лучше всего соответствует вашим потребностям.

+0

@Blachsma, если я включаю его в AJAX 'updatePanel', мне все еще нужно хранить его в переменных сеанса ? – DarknessBeginsHere

+0

UpdatePanel действительно не вносит изменений в переменные сеанса. Он * может * иметь влияние, если вы сохраните его в скрытом поле, например (вне рамки обновления) – Blachshma

+0

спасибо! +1 и принят – DarknessBeginsHere

1

В этом проблема: isSelected всегда будет ложным.

Вещь, которую вы должны помнить об ASP.NET (и веб-приложениях в целом), заключается в том, что все без гражданства. Что в основном означает, что для каждой обратной передачи создается экземпляр класса страницы . И так как isSelected является переменной в этом классе, он тоже будет создан снова, а его предыдущие значения не будут сохранены.

Итак, как вам обойти это? Вы храните значение isSelected где-то. Вы можете использовать переменные сеанса (которые хранятся в памяти сервера) или предпочтительно переменные ViewState (которые хранятся в самом тексте страницы). Вы могли бы сделать isSelected в собственность с геттер и сеттер, как это:

private bool isSelected 
{ 
    get 
    { 
     if(ViewState["isSelected"] != null && ViewState["isSelected"] is bool) 
      return (bool)ViewState["isSelected"]; 
     else 
      return false; 
    } 
    set 
    { 
     ViewState["isSelected"] = value; 
    } 

} 

Использование ViewState потребует ViewState быть включен, что это по умолчанию. Другая возможность заключается в сохранении содержимого isSelected внутри элемента управления скрытым полем (который также использует ViewState в фоновом режиме).

+0

спасибо! но я должен был принять Blachshma becaz он ответил ранее – DarknessBeginsHere

+0

@DarknessBeginsHere - проблем нет. Рад, что мы могли решить вашу проблему. –

Смежные вопросы