2010-06-16 2 views
2

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

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

Спасибо

ответ

1

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

Вы можете изменить свой код, чтобы сделать следующее в 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(); 
} 

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

0

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

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

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

+0

Является ли эта статья не только для ASP.NET 1.x? Я бы предположил, что OP находится на ASP.NET 2.0 (хотя я не знаю ...). – scherand

+0

Очень верно - не заметил упоминания 1.1 в верхней части - дата выглядела достаточно недавно, чтобы быть 2.0 (не то, что я точно знаю, когда вышел 2.0). –

0

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

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

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

2

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

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

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