2016-01-21 203 views
0

所以我试图从另一个下拉列表中选择一个下拉列表。我测试了我正在使用的存储过程,并在输入值时获得正确的结果。我知道有很多这样的问题,但似乎没有解决我的问题。从第二个下拉列表中选择下拉菜单

protected void Page_Load(object sender, EventArgs e) 
{ 
    DataTable environments = new DataTable(); 
    var connection = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString; 

    using (SqlConnection conn = new SqlConnection(connection)) 
    { 
     SqlDataAdapter adapter = new SqlDataAdapter("SELECT Environment FROM Environments", conn); 
     adapter.Fill(environments); 
     ddlEnvironment.Items.Insert(0, new ListItem(String.Empty, String.Empty)); 
     ddlEnvironment.SelectedIndex = 0; 
     ddlEnvironment.DataSource = environments; 
     ddlEnvironment.DataTextField = "Environment"; 
     ddlEnvironment.DataValueField = "Environment"; 
     ddlEnvironment.DataBind(); 

     SqlCommand cmd = new SqlCommand(); 
     SqlDataAdapter adapter2 = new SqlDataAdapter(); 
     DataTable servers = new DataTable(); 

     cmd = new SqlCommand("sp_EnvironmentSelection", conn); 
     cmd.Parameters.AddWithValue("@Environment", ddlEnvironment.SelectedValue); 
     cmd.CommandType = System.Data.CommandType.StoredProcedure; 
     adapter2.SelectCommand = cmd; 
     adapter2.Fill(servers); 

     ddlServer.Items.Insert(0, new ListItem(String.Empty, String.Empty)); 
     ddlServer.SelectedIndex = 0; 
     ddlServer.DataSource = servers; 
     ddlServer.DataTextField = "ServerName"; 
     ddlServer.DataValueField = "ServerIP"; 
     ddlServer.DataBind(); 
    } 
} 

问题是,无论我在第一个下拉列表中选择什么,我都没有在第二个下拉列表中得到任何选择。

这里是存储过程,如果需要的话。

@Environment nvarchar(50) 

AS 
BEGIN 

SET NOCOUNT ON 

SELECT Server.ServerName, Server.ServerIP, Environments.Environment 
FROM Server 
INNER JOIN Environments 
ON 
Environments.Environment=Server.Environment 
WHERE [email protected] 

END 
+1

回发是否发生?当您更改第一个下拉列表时,Page_Load是否会运行? – GendoIkari

+1

另外,你有代码处理ddlEnvironment更改事件?这是你绑定第二个下拉列表的位置,而不是在page_load – GendoIkari

+0

我需要回发的位置?在页面加载开始或下拉更改后?我已经将第二个下拉列表添加到第一个下拉列表的已更改事件中。 – maltman

回答

1

如果通过,因为它正在执行你的代码一步,你会看到,当cmd.Parameters.AddWithValue("@Environment", ddlEnvironment.SelectedValue);被调用,ddlEnvironment.SelectedValue将不会设置任何东西。这是因为在你运行这段代码时,在ddlEnvironment绑定到它的数据之后是正确的。当时没有关于用户选择的信息。

您需要将第二个列表的绑定移动到处理ddlEvironment.SelectedIndexChanged事件的事件处理程序中。在那里,ddlEnvironment.SelectedValue将被设置为用户选择的内容。并且在Page_Load中,每次发生回发时都不想重新绑定第一个列表,因此需要将其封装在if (!Page.IsPostBack)中。

看到这里的问题是:DropDownList's SelectedIndexChanged event not firing

在ASP代码中你的第一个下拉列表需要看起来像这样:

<asp:DropDownList ID="ddlEnvironemnt" runat="server" AutoPostBack="True" 
     onselectedindexchanged="ddlEnvironemnt_SelectedIndexChanged"> 
    </asp:DropDownList> 

你的Page_Load会是这样的:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Page.IsPostBack) 
    { 
     return; 
    } 
    DataTable environments = new DataTable(); 
    var connection = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString; 

    using (SqlConnection conn = new SqlConnection(connection)) 
    { 
     SqlDataAdapter adapter = new SqlDataAdapter("SELECT Environment FROM Environments", conn); 
     adapter.Fill(environments); 
     ddlEnvironment.Items.Insert(0, new ListItem(String.Empty, String.Empty)); 
     ddlEnvironment.SelectedIndex = 0; 
     ddlEnvironment.DataSource = environments; 
     ddlEnvironment.DataTextField = "Environment"; 
     ddlEnvironment.DataValueField = "Environment"; 
     ddlEnvironment.DataBind(); 
    } 
} 

你会有一个事件处理程序:

protected void ddlEnvironemnt_SelectedIndexChanged(object sender, EventArgs e) 
{ 

    var connection = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString; 

    using (SqlConnection conn = new SqlConnection(connection)) 
    { 
     SqlCommand cmd = new SqlCommand(); 
     SqlDataAdapter adapter2 = new SqlDataAdapter(); 
     DataTable servers = new DataTable(); 

     cmd = new SqlCommand("sp_EnvironmentSelection", conn); 
     cmd.Parameters.AddWithValue("@Environment", ddlEnvironment.SelectedValue); 
     cmd.CommandType = System.Data.CommandType.StoredProcedure; 
     adapter2.SelectCommand = cmd; 
     adapter2.Fill(servers); 

     ddlServer.Items.Insert(0, new ListItem(String.Empty, String.Empty)); 
     ddlServer.SelectedIndex = 0; 
     ddlServer.DataSource = servers; 
     ddlServer.DataTextField = "ServerName"; 
     ddlServer.DataValueField = "ServerIP"; 
     ddlServer.DataBind(); 
    } 
} 
+0

所以我启用了Auto Post Back,并且它可以正常工作。但是,当我更改第一个时,它只是保持绑定。我可能需要在那里添加一个明确的时间吗?每次回帖后? – maltman

+0

你的意思是它增加了更多的选项,以现有的? ddlServer.Items.Clear()应该解决这个问题。 – GendoIkari

+0

谢谢。我添加了明确的事件,并且一切都很完美。 – maltman

相关问题