изменение цвета определенной кнопки ссылки - PullRequest
2 голосов
/ 06 августа 2010

Я использую серию кнопок ссылок A-z, которые динамически создаются, что я хочу, по щелчку каждого из них цвет текста меняется на что-то другое, чтобы отличаться от других, что я делаю

protected void Page_Init(object sender, EventArgs e)
    {
        // Adding Dynamically linkbuttons for all alphabets(i.e. A-Z)
        for (char asciiValue = 'A'; asciiValue <= 'Z'; asciiValue++)
        {
            LinkButton lbtnCharacter = new LinkButton();
            lbtnCharacter.ID = "lbtnCharacter" + asciiValue;
            divAlphabets.Controls.Add(lbtnCharacter);

            lbtnCharacter.Text = Convert.ToString(asciiValue);
            lbtnCharacter.CssClass = "firstCharacter";
            lbtnCharacter.ToolTip = "Show users whose name starts with '" + Convert.ToString(asciiValue) + "'";
            lbtnCharacter.CommandArgument = Convert.ToString(asciiValue);
            lbtnCharacter.Command += new CommandEventHandler(lbtnCharacter_Command);
        }
    }
void lbtnCharacter_Command(object sender, CommandEventArgs e)
    {
        ViewState["Selected_Character"] = e.CommandArgument;
        LinkButton lbtn = (LinkButton)divAlphabets.FindControl("lbtnCharacter" + e.CommandArgument);
        lbtn.ForeColor = System.Drawing.Color.Orange;
        txtNameFilter.Text = string.Empty;
        BindUserList();
    }

работает нормально, но при нажатии более одной кнопки все кнопки, которые нажимаются, меняют свой цвет на оранжевый, но я хочу, чтобы какая бы кнопка не нажималась, цвет кнопки должен меняться при нажатии следующей кнопки, предыдущая кнопка должна перейти состояние по умолчанию - это правильный подход, или скажите, можно ли его достичь с помощью css

1 Ответ

2 голосов
/ 06 августа 2010

Ваша проблема в том, что ViewState кнопок ссылки сохраняется непосредственно перед визуализацией элементов управления, включая обновленный стиль. Затем на обратной передаче после Page_Init ViewState повторно применяется к каждому элементу управления с оранжевым стилем. Это переопределяет параметр, который вы добавляете в Page_Init. Таким образом, в Page_Load вам необходимо сбросить стилизацию для каждого из элементов управления.

Добавить другой стиль в таблицу стилей

.highlighted { color:orange; }

В lbtnCharacter_Command замените

lbtn.ForeColor = System.Drawing.Color.Orange;

с

lbtn.CssClass = "firstCharacter highlighted ";

В Page_Load добавить:

foreach (var ctrl in divAlphabets.Controls)
{
    if (ctrl is LinkButton)
        ((LinkButton)ctrl).CssClass = "firstCharacter";
}

На каждом Page_Load все классы ссылок css будут сброшены к значениям по умолчанию. Это после того, как ViewState был применен к ним (между PageInit и PageLoad). Затем в событии Command к нажатой кнопке будет добавлен новый стиль. Настройка цвета в этом стиле переопределит любую настройку цвета в стиле firstCharacter.

UPDATE

    protected void Page_Init(object sender, EventArgs e) {
        for (char asciiValue = 'A'; asciiValue <= 'Z'; asciiValue++) {
            var lbtnCharacter = new LinkButton {
                ID = "lbtnCharacter" + asciiValue,
                Text = Convert.ToString(asciiValue),
                ToolTip = "Show users whose name starts with '" + Convert.ToString(asciiValue) + "'", 
                CommandArgument = Convert.ToString(asciiValue)
            };
            lbtnCharacter.Command += lbtnCharacter_Command;
            divAlphabets.Controls.Add(lbtnCharacter);
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["CurrentLetter"] != null) {
            foreach (var ctrl in divAlphabets.Controls) {
                if (ctrl is LinkButton) {
                    if (((LinkButton) ctrl).Text == Session["CurrentLetter"].ToString()) {
                        ((LinkButton) ctrl).CssClass = "firstCharacter highlighted";
                    }
                }
            }
        }
    }

    void lbtnCharacter_Command(object sender, CommandEventArgs e) {
        //Reset all of the other buttons only when clicking a new one
        foreach (var ctrl in divAlphabets.Controls) {
            if (ctrl is LinkButton) {
                ((LinkButton) ctrl).CssClass = "firstCharacter";
            }
        }
        //Set the clicked button and save the Session state
        var lbtn = (LinkButton)divAlphabets.FindControl("lbtnCharacter" + e.CommandArgument);
        lbtn.CssClass = "firstCharacter highlighted";
        Session["CurrentLetter"] = lbtn.Text;
    }
...