我有两个下拉列表,第二个下拉列表中的项目仅取决于第一个下拉列表中的所选项目。所以我希望第一个下拉列表中的第二个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();
以上按预期工作,但在我在第二个下拉列表中选择一个项目后,它不会按所选项提交所选项目。它默认提交列表中的第一个项目。此外,当我单击提交按钮时,它会快速刷新并提交列表中的第一个项目。我很困惑,任何帮助将不胜感激。
答案 0 :(得分:0)
为什么不使用onSeletedIndexChanged
事件,在onSeletedIndexChanged
事件上调用相同的功能,可能会对您有所帮助
OnSelectedIndexChanged="cboRegion_SelectedIndexChanged"
放置代码以绑定!IsPostBack
支票
if (!Page.IsPostBack)
{
//Bind your first dropdown here
}
答案 1 :(得分: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>
答案 2 :(得分: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();
}
}
答案 3 :(得分: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>
现在它开火了。其次,第二个下拉列表中的选择项在按钮点击时快速变化并提交第一个项目的原因是因为第二个DropDown的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来自不同的表。我需要的列是“name”,因此必须将drContact.DataValueField更改为name为列的表的主键。因此。
drContact.Enabled = true;
drContact.DataSource = reader;
drContact.DataTextField = "name";
drContact.DataValueField = "contactID";
drContact.DataBind();
以上工作对我来说很好。谢谢你的时间。