目前我已经创建了一个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();
}
谢谢
答案 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)
问题可能是视图状态中没有持久保存属性,因此无法从视图状态读取这些属性并在回发时重新添加到控件中。
快速搜索引导我阅读这篇文章,我没有完全阅读,但似乎描述(和解决)你的情况。它看起来并不重要。
答案 3 :(得分:0)
我认为你的问题是你以编程方式添加样式,当你回发这些属性时,它们不会在viewstate中的页面加载之间保存。 (这是我的猜测)。
您的解决方案是创建一个循环下拉内容的方法(如果有的话),并重新应用样式并在每次触发事件时调用它。
您可能希望在视图状态中为这些属性实现某种加载/保存机制,因为从头开始重新应用这些属性会涉及到每个页面的另一个查询,但除非您有很多回发,否则您可能会做得很好。