0

2 つのドロップダウンがあります。2 番目のドロップダウンの項目は、最初のドロップダウンで選択した項目にのみ依存します。したがって、最初のドロップダウンからのアイテム選択で2番目のドロップダウンアイテムの変更が必要です。私の最初のドロップダウンは次のとおりです

<td>
                <asp:DropDownList ID="DropClient" runat="server" style="margin-left: 0px" AutoPostBack="true" Width="200px" OnTextChanged="DropClient_TextChanged">
                </asp:DropDownList> </td>
<td>

以前に onselectedindexchanged を使用したかったのですが、必要に応じて起動しません。したがって、以下のように onTextChanged イベントにメソッドを配置します。

 protected void DropClient_TextChanged(object sender, EventArgs e)
        {

                bindDrEmail();

        }

そして私の bindEmail();

 connection.Open();
            string sql = "SELECT a.clientID,a.cname,c.name FROM [CLIENT] a INNER JOIN [BRANCH] b ON a.clientID=b.clientID JOIN [CONTACT] c ON b.bid=c.bid WHERE a.cname =@clientname";
            SqlCommand cmd = new SqlCommand(sql, connection);
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.AddWithValue("@clientname", DropClient.SelectedItem.Text);

            SqlDataReader reader = cmd.ExecuteReader();

            drEmail.Enabled = true;
            drEmail.DataSource = reader;
            drEmail.DataTextField = "name";
            drEmail.DataValueField = "clientID";
            drEmail.DataBind();

            reader.Dispose();
            reader.Close();

            connection.Close();

上記は期待どおりに機能しますが、2番目のドロップダウンでアイテムを選択した後、選択したアイテムが選択されたとおりに送信されません。デフォルトでは、リストの最初のアイテムを送信します。また、送信ボタンをクリックすると、すぐに更新され、リストの最初の項目が送信されます。私は混乱しています。

4

4 に答える 4

0

皆さん、お時間をありがとうございました。私はついに問題を理解しました。最初に、以前にイベントが発生しない理由は、2 番目のドロップダウン「AutoPostback」を true に設定し、発生させたい最初のドロップダウンに同じ設定をしなかったためです。このプロセスを逆にすると、以下のように起動します。

<asp:DropDownList ID="DropDownClient" runat="server" style="margin-left: 0px"  AutoPostBack="true"
                    Width="200px" onselectedindexchanged="DropDownClient_SelectedIndexChanged">
                </asp:DropDownList>

 <asp:DropDownList ID="drContact" runat="server" style="margin-left: 0px" Width="200px"> </asp:DropDownList>

今、それは発火します。2 番目のドロップダウンから選択された項目がボタンのクリックですばやく変化し、代わりに最初の項目を送信する理由は、2 番目のドロップダウンの dataValueField が原因でした。2 つのテーブルを次のようにまとめます。

 string sql = "SELECT a.clientID,a.cname,c.contactID,c.name FROM [CLIENT] a INNER JOIN [BRANCH] b ON a.clientID=b.clientID JOIN [CONTACT] c ON b.bid=c.bid WHERE a.cname =@clientname";
            SqlCommand cmd = new SqlCommand(sql, connection);
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.AddWithValue("@clientname", DropDownClient.SelectedItem.Text);

            SqlDataReader reader = cmd.ExecuteReader();

            drContact.Enabled = true;
            drContact.DataSource = reader;
            drContact.DataTextField = "name";
            drContact.DataValueField = "clientID";
            drContact.DataBind();

drContact.DataValueField が "clientID" として設定されていることに注意してください。また、clientID と drContact.DataTextField は異なるテーブルからのものです。必要な列は「名前」であるため、drContact.DataValueField を名前が列であるテーブルの主キーに変更する必要があります。したがって。

 drContact.Enabled = true;
        drContact.DataSource = reader;
        drContact.DataTextField = "name";
        drContact.DataValueField = "contactID";
        drContact.DataBind();

上記は私にとってはうまくいきます。御時間ありがとうございます。

于 2013-09-04T04:42:52.197 に答える
0

使用できますUpdate Panel
これはサンプルコードです。

<asp:UpdatePanel ID="UpdatePanel2" runat="server">
<ContentTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true">
<asp:ListItem Value="0">Choose...</asp:ListItem>
<asp:ListItem Value="1">test1</asp:ListItem>
<asp:ListItem Value="2">Test2</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="DropDownList2" runat="server">
</asp:DropDownList>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="DropDownList1" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel> 
于 2013-09-03T08:35:04.993 に答える
0

ポストバックが発生するたびにページの読み込みがトリガーされるため、毎回コードを読み込み、ドロップダウンリストをリセットしないようにするには、次の手順を実行します。

 protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
    {
    //Put your code in here. This will only load the first time the page loads.
    bindDrEmail();
    }
}
于 2013-09-03T08:40:26.663 に答える