回发从页面删除样式

时间:2010-06-16 17:55:43

标签: c# asp.net sql

目前我已经创建了一个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 个答案:

答案 0 :(得分:2)

您可能需要查看此博客条目:ListItem, attributes and viewstate...

归结为编写一个自定义列表控件(我认为是DropDownList),它明确地将属性保存在viewstate中。你甚至可以考虑使用控制状态。

文章提到这种行为是“按设计”(a.k.a.一个特征),但没有提到为什么做出决定。如果有人知道,我会对“为什么”感兴趣:)

答案 1 :(得分:1)

这是一种执行自己的ViewState的快速而肮脏的方法,无需使用自定义控件将attriibute保留在项目级别,默认情况下控件不会这样做。

您可以更改代码以在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();
}

**注意:可能存在编译错误,因为我只是输入它而不通过任何编译器运行它。你应该根据上面的变化了解我想要做的事情。

答案 2 :(得分:0)

问题可能是视图状态中没有持久保存属性,因此无法从视图状态读取这些属性并在回发时重新添加到控件中。

快速搜索引导我阅读这篇文章,我没有完全阅读,但似乎描述(和解决)你的情况。它看起来并不重要。

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

答案 3 :(得分:0)

我认为你的问题是你以编程方式添加样式,当你回发这些属性时,它们不会在viewstate中的页面加载之间保存。 (这是我的猜测)。

您的解决方案是创建一个循环下拉内容的方法(如果有的话),并重新应用样式并在每次触发事件时调用它。

您可能希望在视图状态中为这些属性实现某种加载/保存机制,因为从头开始重新应用这些属性会涉及到每个页面的另一个查询,但除非您有很多回发,否则您可能会做得很好。