繁体   English   中英

asp.net c#在从服务器端代码更改索引时阻止触发selectedindexchanged事件

[英]asp.net c# prevent firing selectedindexchanged event while changing index from serverside code

我在同一个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>

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();
}

两者都使用一些服务器端代码填充数据库记录项。 现在,OnSelectedIndexChanged事件“ddlM”我想选择“ddlC”的第一个索引但是没有触发事件ddlC_SelectedIndexChanged。 对于“ddlC”和“ddlC”的OnSelectedIndexChanged事件一样,我想选择“ddlM”的第一个索引但是没有触发事件ddlM_SelectedIndexChanged。 对不起它发射事件。 我怎么办呢?

谢谢

或者,您可以从控件中删除并重新添加SelectedIndexChanged事件处理程序

 ddlM.SelectedIndexChanged -= ddlM_SelectedIndexChanged;

 ddlM.SelectedIndex = 0;
 ViewState["ddlC"] = false;
 ViewState["ddlM"] = true; 
 BindPGrid();

 ddlM.SelectedIndexChanged += ddlM_SelectedIndexChanged;

然后你不必乱用全局标志

在这种情况下,我们创建一个全局bool标志,并在更改SelectedIndexChanged之前将其值设置为true 而在其他Control的SelectedIndexChanged检查其值是否为true。 如果是真的,我们会在活动之外返回。 并在外面再次更改标志值。 确保始终将标志值更改回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();
}

或者你可以删除像这样的事件处理程序

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM