3

同じaspxページに2つのドロップダウンリストコントロールがあります

<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を発生させません。そうではなく、イベントを発生させます。どうすればそれを防ぐことができますか?

ありがとう

4

2 に答える 2

4

または、SelectedIndexChangedイベントハンドラーをコントロールから削除して再度追加することもできます

 ddlM.SelectedIndexChanged -= ddlM_SelectedIndexChanged;

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

 ddlM.SelectedIndexChanged += ddlM_SelectedIndexChanged;

そうすれば、グローバルフラグをいじる必要はありません

于 2012-05-09T13:11:17.910 に答える
3

このような場合、グローバルboolフラグを作成し、true変更前にその値を に設定しますSelectedIndexChanged。そして、他のコントロールで、SelectedIndexChangedその値がtrueの場合にチェックします。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();            
}
于 2012-05-09T13:09:13.027 に答える