我有以下简单的代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="testForm.aspx.cs" Inherits="Orbs.testForm" %>
<html>
<body>
<form id="form1" runat="server">
<asp:DropDownList ID="dropdown1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="dropdown1_SelectedIndexChanged" ViewStateMode="Enabled">
<asp:ListItem Value="1" Text="Item 1" />
<asp:ListItem Value="2" Text="Item 2" />
<asp:ListItem Value="3" Text="Item 3" />
<asp:ListItem Value="4" Text="Item 4" />
<asp:ListItem Value="5" Text="Item 5" />
</asp:DropDownList>
<asp:Label runat="server" ID="label1"></asp:Label>
</form>
</body>
</html>
这是我背后的代码
using System;
namespace Orbs {
public partial class testForm: System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
label1.Text = "???!!";
}
protected void dropdown1_SelectedIndexChanged(object sender, EventArgs e) {
label1.Text = "Fired on " + dropdown1.SelectedValue;
}
}
}
首次进入该页面时,label1
会显示'???!!'
。现在我从下拉列表中选择一个项目,label1
显示正确的值但是当我在下拉列表中选择第一个项目时,它会再次显示???!!
而不是Fired on 1
我做错了什么?
编辑:我注意到如果我将Selected="True"
添加到下拉列表中的任何项目,该项目就会成为受害者,并且不会触发该事件!
答案 0 :(得分:14)
对于仍有问题的人;我用一种不同的,更简单的方式解决了它: 只需将一个虚拟ListItem添加到DropDownList的开头,并将该项的Enabled属性设置为false。 即。
<asp:DropDownList ID="dropdown1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="dropdown1_SelectedIndexChanged" ViewStateMode="Enabled">
<asp:ListItem Value="" Text="" Enabled="false" />
<asp:ListItem Value="1" Text="Item 1" />
<asp:ListItem Value="2" Text="Item 2" />
<asp:ListItem Value="3" Text="Item 3" />
<asp:ListItem Value="4" Text="Item 4" />
<asp:ListItem Value="5" Text="Item 5" />
</asp:DropDownList>
答案 1 :(得分:3)
我自己解决了这个问题,
我在某个地方看到关闭ViewStateMode
会导致DropDownList
无法正常工作。在我的Web应用程序中,我不得不关闭ViewStateMode
来完成一些全局任务并逐个启用它。
以某种方式启用ViewStateMode
上的DropDownList
无法正常工作,我甚至尝试为页面和母版页打开ViewStateMode
,但仍然DropDownList
无效。只有当我在ViewStateMode
中启用web.config
时,它才有效。
由于ViewStateMode
中的web.config
无法启用,我找到了替代解决方案。我把它包括在这里,希望能有所帮助。
HiddenField
。 Page_Load
HiddenField
与Request.Forms[DropDownList1.UniqueID]
SelectedIndexChanged
比较值
HiddenField
Request.Forms[DropDownList1.UniqueID]
的值设置为{{1}}的值。答案 2 :(得分:1)
有同样的问题 - 选择第一个选项时,SelectedIndexChanged不会触发, 我不干净的解决方案是(不确定它是如此聪明但它对我有用),
在Page_Load,我添加了以下脚本:
if (!IsPostBack)
{
//bind data first time
}
else
{
int ddlSortByValue = int.Parse(ddlSortBy.SelectedValue);
if (ddlSortByValue == 0)
{
ddlSortBy_SelectedIndexChanged(this, EventArgs.Empty);
}
}
这样我强制启动SelectedIndexChanged事件
答案 3 :(得分:1)
这个问题比其他帖子更能涵盖所有可能性,所以我添加了这个明确的答案。就我而言,@ Edyn的评论有效,尽管最初的问题已经存在:
在下拉控件本身设置x:name
我还在页面顶部的页面声明中设置它,以防万一。
这是.Net 4.0,所以也许有些东西被改变了(但肯定没有很好地修复)。
答案 4 :(得分:1)
我遇到了同样的问题,但我通过手动调用onindexchanged
函数解决了这个问题,如下所示:
ddl_SelectedIndexChanged(null, null);
我知道这可能不是一个完美的方式,但它对我有用。
答案 5 :(得分:0)
这种情况正在发生,因为您将标签设置为“??? !!”每一页活动。
您需要修改页面加载以检测未发生回发。
protected void Page_Load(object sender, EventArgs e) {
if(!IsPostBack)
{
label1.Text = "???!!";
}
}
答案 6 :(得分:0)
在我的情况下,发生这种情况是因为我使用本地dropdownlist变量引用了该下拉列表,并在函数末尾处理了该变量。我在设置数据源后将第一项添加到下拉列表中。花了我2个小时找到这个,并在我取消处理电话后工作得很好。