如何在第二次单击ASP.net时重置按钮颜色?

时间:2013-02-20 00:31:12

标签: c# asp.net events

我有一个button突出显示第一次点击。在上单击它应该重置为相同的颜色。我使用boolean isSelected来确定其是否突出显示。该按钮正在突出显示,但不知何故它没有重置回原来的颜色。任何帮助将不胜感激。

我正在判断被选为private bool isSelected = false;

按钮事件处理程序

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

2 个答案:

答案 0 :(得分:1)

你试图在回发之间保存一个变量状态......这并不像你想象的那么简单......
在你的情况下,你在下一个Postback上设置IsSelected = true(下次单击按钮时)它会回到false,因为变量是在每次回发时重新声明的(在它的原始false值中这个案例)。 Asp.Net基本上是无状态的。

您可以通过在 Session ViewState 或甚至 hiddenfield 中保存IsSelected来解决此问题。 ...

我认为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即可。您应该阅读一下它们之间的区别(我添加了链接)并查看哪些最符合您的需求。

答案 1 :(得分:1)

问题在于:isSelected始终为假。

你必须记住的关于ASP.NET(以及一般的Web应用程序)的事情是,一切都是无状态的。这基本上意味着为每个回发创建了一个 new 页面类的实例。由于isSelected是此类中的变量,因此它也将再次实例化,并且不会存储其先前的值。

那你怎么解决这个问题呢?您将isSelected的值存储在某处。您可以使用会话变量(存储在服务器内存中),或者最好使用ViewState变量(存储在页面文本中)。你可以使用这样的getter和setter将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)中。