【问题标题】:asp.net c# prevent firing selectedindexchanged event while changing index from serverside codeasp.net c# 防止从服务器端代码更改索引时触发 selectedindexchanged 事件
【发布时间】:2012-05-10 09:13:07
【问题描述】:

我在与

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

两者都使用一些服务器端代码由数据库记录项填充。现在,“ddlM”的 OnSelectedIndexChanged 事件我想选择“ddlC”的第一个索引,但不触发事件 ddlC_SelectedIndexChanged。对于“ddlC”,与“ddlC”的 OnSelectedIndexChanged 事件相同,我想选择“ddlM”的第一个索引,但不触发事件 ddlM_SelectedIndexChanged。不对,它会触发事件。我该怎么做才能防止它?

谢谢

【问题讨论】:

  • 我猜你不想触发相应的事件,因为它会重置原始事件?

标签: c# asp.net


【解决方案1】:

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

 ddlM.SelectedIndexChanged -= ddlM_SelectedIndexChanged;

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

 ddlM.SelectedIndexChanged += ddlM_SelectedIndexChanged;

那么你就不必乱用全局标志了

【讨论】:

    【解决方案2】:

    在这种情况下,我们创建一个全局bool 标志并将其值设置为true,然后再更改SelectedIndexChanged。在另一个控件的SelectedIndexChanged 中检查其值是否为真。如果为真,我们将它返回到事件之外。并在外面时再次更改标志值。确保始终将标志值更改回 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();            
    }
    

    【讨论】:

    • 很好奇为什么这会得到支持?他只是将我的答案复制到他的末尾,更重要的是他的语法错误,这甚至无法编译。
    • ddlM的索引先改变时,你的全局bool如何工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多