我在同一个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。对不起它发射事件。我怎么办呢?
由于
答案 0 :(得分:4)
或者,您可以从控件中删除并重新添加SelectedIndexChanged事件处理程序
ddlM.SelectedIndexChanged -= ddlM_SelectedIndexChanged;
ddlM.SelectedIndex = 0;
ViewState["ddlC"] = false;
ViewState["ddlM"] = true;
BindPGrid();
ddlM.SelectedIndexChanged += ddlM_SelectedIndexChanged;
然后你不必乱用全球旗帜
答案 1 :(得分:3)
在这种情况下,我们会创建一个全局bool
标记,并在更改true
之前将其值设置为SelectedIndexChanged
。在其他Control的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();
}