[英]asp.net c# prevent firing selectedindexchanged event while changing index from serverside code
I have two dropdownlist controls on the same aspx page as 我在同一个aspx页面上有两个下拉列表控件
<asp:DropDownList ID="ddlM" runat="server" Width="123px" AutoPostBack="True" OnSelectedIndexChanged="ddlM_SelectedIndexChanged">
</asp:DropDownList>
<asp:DropDownList ID="ddlC" runat="server" Width="123px" AutoPostBack="True" OnSelectedIndexChanged="ddlC_SelectedIndexChanged">
</asp:DropDownList>
the C# code for OnSelectedIndexChanged of both are as below : OnSelectedIndexChanged的C#代码如下:
protected void ddlC_SelectedIndexChanged(object sender, EventArgs e)
{
ddlM.SelectedIndex = 0;
ViewState["ddlC"] = true;
ViewState["ddlM"] = false;
BindPGrid();
}
protected void ddlM_SelectedIndexChanged(object sender, EventArgs e)
{
ddlC.SelectedIndex = 0;
ViewState["ddlC"] = false;
ViewState["ddlM"] = true;
BindPGrid();
}
both are populated by database record items using some server-side code. 两者都使用一些服务器端代码填充数据库记录项。 Now, OnSelectedIndexChanged event of "ddlM" I want to make selected the first index of "ddlC" but WITHOUT firing the event ddlC_SelectedIndexChanged.
现在,OnSelectedIndexChanged事件“ddlM”我想选择“ddlC”的第一个索引但是没有触发事件ddlC_SelectedIndexChanged。 And same for "ddlC" as OnSelectedIndexChanged event of "ddlC" I want to make selected the first index of "ddlM" but WITHOUT firing the event ddlM_SelectedIndexChanged.
对于“ddlC”和“ddlC”的OnSelectedIndexChanged事件一样,我想选择“ddlM”的第一个索引但是没有触发事件ddlM_SelectedIndexChanged。 Right not it fires the event.
对不起它发射事件。 How can I do prevent it?
我怎么办呢?
Thanks 谢谢
Alternatively you can remove and re-add the SelectedIndexChanged event handler from the control 或者,您可以从控件中删除并重新添加SelectedIndexChanged事件处理程序
ddlM.SelectedIndexChanged -= ddlM_SelectedIndexChanged;
ddlM.SelectedIndex = 0;
ViewState["ddlC"] = false;
ViewState["ddlM"] = true;
BindPGrid();
ddlM.SelectedIndexChanged += ddlM_SelectedIndexChanged;
Then you don't have to mess with global flags 然后你不必乱用全局标志
In such cases we create a global bool
flag and sets its value to true
before changing SelectedIndexChanged
. 在这种情况下,我们创建一个全局
bool
标志,并在更改SelectedIndexChanged
之前将其值设置为true
。 And in the other Control's SelectedIndexChanged
check its value if its true. 而在其他Control的
SelectedIndexChanged
检查其值是否为true。 If true we return it outside the event. 如果是真的,我们会在活动之外返回。 And change flag value again when outside.
并在外面再次更改标志值。 Make sure to always change flag value back to false or else it would never fire if that event is generated by same control.
确保始终将标志值更改回false,否则如果该事件由同一控件生成,则永远不会触发。
boool flag = false;
protected void ddlC_SelectedIndexChanged(object sender, EventArgs e)
{
flag = true;
ddlM.SelectedIndex = 0;
flag = false;
ViewState["ddlC"] = true;
ViewState["ddlM"] = false;
BindPGrid();
}
protected void ddlM_SelectedIndexChanged(object sender, EventArgs e)
{
if(flag)
return;
ddlC.SelectedIndex = 0;
ViewState["ddlC"] = false;
ViewState["ddlM"] = true;
BindPGrid();
}
or you can remove the event handler like 或者你可以删除像这样的事件处理程序
protected void ddlC_SelectedIndexChanged(object sender, EventArgs e)
{
ddlM.SelectedIndexChanged -= ddlM_SelectedIndexChanged;
ddlM.SelectedIndex = 0;
ddlM.SelectedIndexChanged += ddlM_SelectedIndexChanged;
ViewState["ddlC"] = true;
ViewState["ddlM"] = false;
BindPGrid();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.