2016-01-21 201 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

相關問題