简体   繁体   中英

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

I have two dropdownlist controls on the same aspx page as

<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 :

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. 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. 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

 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 . And in the other Control's SelectedIndexChanged check its value if its 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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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