Постбэк Удаление Стилинга со Страницы - PullRequest
2 голосов
/ 16 июня 2010

В настоящее время я создал страницу ASP.Net с раскрывающимся списком управления, для которого autopostback установлен в true. Я также добавил цвет фона для отдельных элементов списка. Всякий раз, когда элемент выбирается в раскрывающемся списке, стиль полностью удаляется из всех элементов списка. Как я могу предотвратить это? Мне нужен постбэк для извлечения данных на основе выбранного выпадающего элемента. Вот мой код.

файл aspx:

<asp:DropDownList ID="EmpDropDown" AutoPostBack="True" OnSelectedIndexChanged="EmpDropDown_SelectedIndexChanged" runat="server">
</asp:DropDownList>
<asp:TextBox ID="MessageTextBox" TextMode="MultiLine" Width="550" Height="100px" runat="server"></asp:TextBox>

код aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
    GetEmpList();
  }
}

protected void EmpDropDown_SelectedIndexChanged(object sender, EventArgs e)
{
  GetEmpDetails();
}

private void GetEmpList()
{
  SqlDataReader dr = ToolsLayer.GetEmpList();
  int currentIndex = 0;

  while (dr.Read())
  {
    EmpDropDown.Items.Add(new ListItem(dr["Title"].ToString(), dr["EmpKey"].ToString()));

    if (dr["Status"].ToString() == "disabled")
    {
      EmpDropDown.Items[currentIndex].Attributes.Add("style", "background-color:red;");
    }
    currentIndex++;
  }

  dr.Close();
}

private void GetEmpDetails()
{
  SqlDataReader dr = ToolsLayer.GetEmpDetails(EmpDropDown.SelectedValue);

  while (dr.Read())
  {
    MessageTextBox.Text = dr["Message"].ToString();
  }
  dr.Close();
}

Спасибо

Ответы [ 4 ]

2 голосов
/ 16 июня 2010

Возможно, вы захотите взглянуть на эту запись в блоге: ListItem, атрибуты и viewstate ... .

Все сводится к написанию пользовательского элемента управления списком (DropDownList вваш случай, я думаю), который явно сохраняет атрибут (ы) в viewstate.Я полагаю, вы могли бы даже подумать об использовании состояния управления.

В статье упоминается, что это поведение "разработано" (иначе), но не упоминается, почему решение было принято.Если кто-нибудь знает, мне было бы интересно "почему":)

1 голос
/ 16 июня 2010

Вот быстрый и грязный способ создания собственного ViewState без необходимости создания пользовательского элемента управления для сохранения атрибута на уровне элемента, чего не делает элемент управления по умолчанию.

Вы можете изменить свой кодЧтобы сделать следующее в GetEmpList():

private void GetEmpList()      
{      
    List<string> disabledKeys = new List<string>();
    SqlDataReader dr = ToolsLayer.GetEmpList();      

    while (dr.Read())      
    {      
        EmpDropDown.Items.Add(new ListItem(
            dr["Title"].ToString(), dr["EmpKey"].ToString()));      

        if (dr["Status"].ToString() == "disabled")      
        {
            disabledKeys.Add(dr["EmpKey"].ToString());
        }      
    }

    dr.Close();
    ViewState["DisabledKeys"] = disabledKeys;
}  

Затем запустите функцию, которая всегда выполняется:

public void SetDisabledStylingOnDropDown()
{
    if ((ViewState["DisabledKeys"] != null) &&
        (EmpDropDown.Items.Count > 0))
    {
        List<string> disabledKeys = (List<string>)(ViewState["DisabledKeys"]);

        for (int i = 0; i < EmpDropDown.Items.Count; i++)
        {
            if (disabledKeys.Contains(EmpDropDown.Items[i].Value))
            {
                EmpDropDown.Items[i].Attributes.Add("style", "background-color:red;"); 
            }
        }
    }
}

Затем в вашем Page_Load:

protected void Page_Load(object sender, EventArgs e)          
{        
    if (!IsPostBack)          
    {          
        GetEmpList();          
    }
    SetDisabledStylingOnDropDown();
}

** Примечание: могут быть ошибки компиляции, так как я просто набрал это без запуска какого-либо компилятора.Вы должны получить представление о том, что я пытаюсь сделать, основываясь на вышеуказанных изменениях.

0 голосов
/ 16 июня 2010

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

Ваше решение будет состоять в создании метода, который будет зацикливать содержимое вашего раскрывающегося списка, если таковой имеется, и повторно применять стиль и вызывать его каждый раз, когда вы запускаете событие.

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

0 голосов
/ 16 июня 2010

Вероятно, проблема заключается в том, что атрибуты не сохраняются в состоянии просмотра, поэтому они не могут быть прочитаны из состояния просмотра и повторно добавлены в элементы управления при обратной передаче.

Быстрый поиск привел меня кэта статья, которую я не полностью прочитал, но, кажется, описывает (и разрешает) ситуацию, в которой вы оказались.Это не выглядит тривиально.

http://www.4guysfromrolla.com/articles/110205-1.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...