为什么 DropDownList 的 SelectedValue 在 SelectedIndexChanged 事件中不起作用?





5.00/5 (4投票s)
为什么 DropDownList 的 SelectedValue 在 SelectedIndexChanged 事件中不起作用?
错误
DropDownList
的 SelectedValue
在 SelectedIndexChanged
事件中没有给出当前选择的值,而是给出了默认值或第一个选项的值。
步骤
- 让我们首先声明一个
DropDownList
。<asp:DropDownList ID="ddlDropDownId" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlDropDownId_SelectedIndexChanged"> </asp:DropDownList>
- 现在为了绑定
DropDownList
,我们将编写一个如下的函数...private void BindDropDownList() { // Declare a Dictionary to hold all the Options with Value and Text. Dictionary<string, string> options = new Dictionary<string, string>(); options.Add("-1", "Select Option"); options.Add("1", "Option 1"); options.Add("2", "Option 2"); options.Add("3", "Option 3"); options.Add("4", "Option 4"); options.Add("5", "Option 5"); // Bind the Dictionary to the DropDownList. ddlDropDownId.DataSource = options; ddlDropDownId.DataTextField = "value"; ddlDropDownId.DataValueField = "key"; ddlDropDownId.DataBind(); }
- 所以,当您运行页面时,它会在页面上显示带有已定义选项的
DropDownList
。浏览器上的 DropDownList - 当您从
DropDownList
中选择一个选项时,它会触发代码后面的SelectedIndexChanged
事件。如果您需要获取SelectedValue
,那么您将编写...protected void ddlDropDownId_SelectedIndexChanged(object sender, EventArgs e) { string value = ddlDropDownId.SelectedValue; }
现在问题来了
当我们在事件内部放置一个调试器并检查时,无论选择哪个选项,它总是给出第一个选项的值,即 “-1”。 请参考顶部的调试屏幕截图。
毫无疑问,第一个选项的值是 “-1”,因为我们可以从 DropDownList
的 *Source HTML* 中清楚地看到。 请参阅下图中的突出显示的选项。
有什么提示吗?
因为我们总是得到默认值或第一个值,所以猜测是,当我们选择一个选项时,有什么东西导致 DropDownList
再次绑定。
让我们找出答案!!!
在步骤中,我提到了 BindDropDownList()
函数,它绑定 DropDownList
。 但是我们需要检查它到底在哪里被调用。 因为当页面加载时显示 DropDownList
,所以它必须存在于 *Page Load* 事件中。
protected void Page_Load(object sender, EventArgs e)
{
BindDropDownList();
}
现在,根据 *事件生命周期* 规则,当您从 DropDownList
中选择一个选项时,它会回发并首先转到 *Page Load* 事件,然后才会到达 SelectedIndexChanged
事件。
这意味着,在选择任何选项时,它会再次进入页面加载,并调用 BindDropDownList()
。 因此,在它进入 SelectedIndexChanged
事件之前,DropDownList
再次被绑定。 由于 DropDownList
再次被绑定,所以 SelectedValue
现在是第一个选项的值,即“-1
”(对于“选择选项”)。
修复?
您可能已经得到了答案。 那就是 IsPostBack Property。
获取一个值,该值指示页面是第一次呈现还是正在加载以响应回发。
它告诉您是第一次加载页面,还是由于任何事件引起的 *回发*。 修改后的代码如下所示
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindDropDownList();
}
}
所以,请小心并分享这个,以拯救某人的一天!!!
您可能已经在您的页面中使用了所有的代码来找出问题,但最终您会发现这是因为您忘记检查 IsPostBack
属性。 所以,喜欢并与您的朋友分享,以便任何无法找到问题的人最终都可以松一口气。
