我发现的问题是在选择第0个索引时不会触发SelectedIndexChanged事件.然而,它会做所有其他时间.
这是一些代码:
<asp:DropDownList runat="server" ID="DropDownList1" EnableViewState="false" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" />
protected override void OnInit(EventArgs e) { this.DropDownList1.DataTextField = "Text"; this.DropDownList1.DataValueField = "Value"; this.DropDownList1.DataSource = fillQueueDropDown(); this.DropDownList1.DataBind(); base.OnInit(e); } protected void DropDownList1_SelectedIndexChanged(object sender,EventArgs e) { OnSelectedQueueChanged(e); } public void OnSelectedQueueChanged(EventArgs e) { // Do stuff. } public event EventHandler queueNamesChangedEvent; public void OnSelectedQueueChanged(EventArgs e) { if (queueNamesChangedEvent != null) queueNamesChangedEvent(this,e); }
我想我可以在Page_Load方法中进行某种类型的检查:
if(ViewState["selectedIndexChangedFlag"] != 1) // raise OnSelectedChange event
或者我可以在OnInit()方法中设置一些东西,我每次都可以重新绑定这些数据吗?
请参阅,我的自定义EventHander引发一个事件,该事件由此控件所在的父页面捕获,以便父级可以使用新选择的值执行某些操作.并且这适用于所选索引>的所有情况. 0.
我在此控件中创建了一个属性,其中包含最近选择的索引,在这种情况下,我的父页面可以对每个Page_Load … dunno上的此属性值执行操作.
接受建议.或者如何强制此SelectedIndexChanged事件触发第0个索引选择.
解决方法
zero [selected] one two
然后在客户端中更改所选索引:
zero one [selected] two
这将使用您的新索引(1)填充隐藏的输入__EVENTARGUMENT,并使用您的下拉列表的ID填充隐藏的输入__EVENTTARGET.现在服务器端代码启动并重新加载您的数据:
zero [selected] one two
“零”是选定的值,因为这是加载数据时的默认值.然后,ASP.NET在请求中查找__EVENTTARGET和__EVENTARGUMENT,找到您的下拉列表ID并找到新索引(1).现在您的下拉列表如下所示:
zero one [selected] two
由于索引已更改,因此下拉列表会引发其SelectedIndexChanged事件,指示索引已更改.显然这是正在运行的部分,现在让我们看看为什么选择列表中的第一项不会引发事件.
现在让我们说我们仍然在其所处的状态下拉(选择“一个”并且选择的索引为1).当我们选择客户端列表中的第一个项目时会发生什么?
使用下拉列表的id和新索引(0)填充__EVENTTARGET和__EVENTARGUMENT.然后服务器将数据加载到下拉列表中,下拉列表现在再次显示如下:
zero [selected] one two
请注意,由于您在事件触发之前重新加载了数据,因此索引已设置为0,因为这是默认值.现在,当您的事件触发并且下拉列表的选定索引设置为0时,下拉列表不会将此视为更改,因为所选索引(据其所知)尚未更改.
protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (!Page.IsPostBack) { this.DropDownList1.DataTextField = "Text"; this.DropDownList1.DataValueField = "Value"; this.DropDownList1.DataSource = fillQueueDropDown(); this.DropDownList1.DataBind(); } }
这样做只会在页面不是回发时将数据加载到下拉列表中.这意味着ViewState将为您维护数据以及所选索引,以便在您回发下拉列表时将新索引与您在客户端中看到的索引进行比较.