1

C# 環境で ASP.Net を使用すると、次のコードが作成されます。

<table>
      <tr>
        <td width="15"><asp:CheckBox ID="chkUsers" runat="server" Text="" AutoPostBack = "True" oncheckedchange="chkUsers_OnCheckedChange" />
        </td>
        <td width="260">
            Active Users:
        </td>
        <td width="120">
            <asp:DropDownList ID="cboActiveUsers" runat="server" Height="19px" 
                AutoPostBack="true" onselectedindexchanged="cboActiveUsers_SelectedIndexChanged">
                <asp:ListItem>Y</asp:ListItem>
                <asp:ListItem>N</asp:ListItem>
            </asp:DropDownList>
        </td>
        <td width="15"><asp:CheckBox ID="chkAccount" runat="server" Text="" AutoPostBack = "True" oncheckedchange="chkAccount_OnCheckedChange" />
        </td>
        <td width="260">
            Account Name:
        </td>
        <td width="120">
            <asp:DropDownList ID="cboAccounts" runat="server" Height="19px" 
                AutoPostBack="true" onselectedindexchanged="cboAccounts_SelectedIndexChanged">
                <asp:ListItem>Y</asp:ListItem>
                <asp:ListItem>N</asp:ListItem>
            </asp:DropDownList>
        </td>
      </tr>
    </table>

チェックボックスをトグルとして使用しようとしています。まず、OnCheckedChange の部分は実行されません。理由がわからない。とにかく、ポストバック (コード ビハインド) で、どのチェックボックスがクリックされたのかを把握しようとしているので、どのコントロールを有効または無効にするかがわかります。私は次のようなことを言いたいです(明らかなaircode):

If chkUsers is the checkbox that was just clicked
{
                cboActiveUsers.Enabled = true;
                ddlAuditor.Enabled = true;
                cboAccounts.Enabled = false;
}
If chkAccount is the checkbox that was just clicked
{
                cboActiveUsers.Enabled = false;
                ddlAuditor.Enabled = false;
                cboAccounts.Enabled = true;
}

現在、私のコードは次のようになっています。

protected void CheckboxStatus()
{
    if (chkAccount.Checked == true)
    {
        cboActiveUsers.Enabled = false;
        ddlAuditor.Enabled = false;
        cboAccounts.Enabled = true;
        chkUsers.Checked = false;

    }
    if (chkUsers.Checked == true)
    {
        cboActiveUsers.Enabled = true;
        ddlAuditor.Enabled = true;
        cboAccounts.Enabled = false;
        chkAccount.Checked = false;
    }
}

これは、chkAccount がチェックされている場合は正常に機能しますが、元に戻す場合は、最初に chkAccount のチェックを外した場合にのみ機能します。それがチェックする最初のチェックボックスであるため、これは完全に理にかなっています。どちらか一方をクリックして前後にクリックし、それに応じて有効なフィールドを変更できるようにしたいのです。

テイカーはいますか?

追加: これが私の Page_Load です:

protected void Page_Load(object sender, EventArgs e)
{

    if (!IsPostBack)
    {
        LoadSubjects();
        LoadStatusCodes();
    chkUsers.Checked = true;
    chkAccount.Checked = false;

    }
    CheckboxStatus();
}
4

1 に答える 1

0

ロジックは問題ないように見えますが、Page_Loadイベントでは、最初の lo だけを変更する必要があります。コードにいくつかの変更を加えました。サンプルについては、以下のコメントをご覧ください。

public void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        LoadSubjects();
        LoadStatusCodes();

        chkUsers.Checked = true;
        chkAccount.Checked = false;

        CheckboxStatus();
    }

    // here, every postback will execute
    // that's the reason you are getting every postback the called method
}

protected void chkUsers_OnCheckedChange(object sender, EventArgs e)
{
    CheckboxStatus();
}

protected void cboAccounts_SelectedIndexChanged(object sender, EventArgs e)
{
    CheckboxStatus();
}

protected void CheckboxStatus()
{       
    if (chkAccount.Checked)
    {
        cboActiveUsers.Enabled = false;
        ddlAuditor.Enabled = false;
        cboAccounts.Enabled = true;
        chkUsers.Checked = false;
    }

    // you could do it.. to toogle the enabled controls, instead on in checked
    /* 
    cboActiveUsers.Enabled = !chkAccount.Checked;
    ddlAuditor.Enabled = !chkAccount.Checked;
    cboAccounts.Enabled = chkAccount.Checked;
    chkUsers.Checked = chkAccount.Checked;
    */

    if (chkUsers.Checked == true)
    {
       cboActiveUsers.Enabled = true;
       ddlAuditor.Enabled = true;
       cboAccounts.Enabled = false;
       chkAccount.Checked = false;
    }    

    /*
    cboActiveUsers.Enabled = chkUsers.Checked;
    ddlAuditor.Enabled = chkUsers.Checked;
    cboAccounts.Enabled = !chkUsers.Checked;
    chkAccount.Checked = !chkUsers.Checked;*/

}
于 2013-11-08T19:35:12.073 に答える