0

我有两个下拉列表,第二个下拉列表中的项目仅取决于第一个下拉列表中的选定项目。因此,我希望从第一个下拉列表中对项目选择进行第二个 dropdows 项目更改。我的第一个下拉菜单如下

<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();

以上按预期工作,但是在我在第二个下拉列表中选择一个项目后,它不会按选择提交所选项目。它默认提交列表中的第一项。此外,当我单击提交按钮时,它会快速刷新并提交列表中的第一项。我很困惑,任何帮助将不胜感激。

4

4 回答 4

0

你为什么不使用onSeletedIndexChanged事件,在事件上调用相同的函数onSeletedIndexChanged,可能对你有帮助

OnSelectedIndexChanged="cboRegion_SelectedIndexChanged"

将代码绑定到!IsPostBack检查中的第一个下拉列表

if (!Page.IsPostBack)
{
    //Bind your first dropdown here
}
于 2013-09-03T08:30:36.700 回答
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 回答
0

伙计们感谢大家的时间。我终于弄清楚了问题所在。首先,它为什么不触发之前的事件的原因是因为我将第二个 Dropdown“AutoPostback”设置为 true,并且没有为我想要触发的第一个 DropDown 设置相同的值。当我反转这个过程时,它会触发如下。

<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>

现在它着火了。其次,第二个下拉菜单中的选定项目在按钮单击并提交第一个项目时快速变化的原因是第二个下拉菜单的 dataValueField 。我将这两个表如下所示。

 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 回答