2010-06-16 96 views
2

當前我創建了一個ASP.Net頁面,該頁面具有autopostback設置爲true的下拉控件。我還爲單個列表項添加了彩色背景。無論何時在下拉控件中選擇一個項目,樣式都會從所有列表項中完全刪除。我怎樣才能防止這種情況發生?我需要回發來根據所選的下拉項目來提取數據。這是我的代碼。Postback從頁面刪除樣式

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,而不必做一個自定義控件來保持項目級的屬性,默認不行。

你可以改變你的代碼執行以下操作中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

的問題是可能的屬性不被在視圖狀態繼續存在,因此他們無法從視圖狀態讀取並重新添加到回發上的控件。

一個快速搜索讓我看到這篇文章,我沒有完全閱讀,但似乎描述(和解決)你有的情況。它看起來並不重要。

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

+0

那篇文章不僅僅適用於ASP.NET 1.x嗎?我猜想OP是在ASP.NET 2.0上(儘管我不知道......)。 – scherand 2010-06-16 18:10:36

+0

非常真實 - 沒有注意到頂部1.1提到 - 日期看起來已經足夠2.0了(不是我知道什麼時候2.0出來)。 – 2010-06-16 18:25:01

0

我覺得你的問題是,你編程添加造型,而當你回來後這些屬性都將丟失,他們不是在ViewState中保存的頁面加載之間。 (這是我的猜測)。

您的解決方案將創建一個方法,可以循環下拉列表中的內容(如果有的話),並重新應用樣式並在每次觸發事件時調用它。

您可能希望在視圖狀態下爲這些屬性實現某種加載/保存機制,因爲從頭開始重新應用這些屬性會涉及到每個頁面的另一個查詢,但除非您有很多回發,否則可能會做得很好。

2

你可能想看看這個博客條目:ListItem, attributes and viewstate...

它歸結爲寫一個自定義列表控件(DropDownList你的情況,我認爲),顯式保存視圖狀態的屬性。我想你甚至可以考慮使用控制狀態。

該文章提到這種行爲是「按設計」(又名一個特徵),但沒有提到爲什麼做出這個決定。如果有人知道,我會對「爲什麼」感興趣:)