我有一個窗體,在UpdatePanel中有一個下拉列表,兩個按鈕和兩個Listbox。 Dropdownlist和列表框都綁定到SqlDatasources。ASP.NET 4 UpdatePanel不會更新Listbox
下拉列表允許您選擇您的部門。
第一個列表框顯示與您從部門中選擇的內容相關聯的作業列表。
第二個列表框顯示了這些項目的反向列表。 (不與您所在的部門在相關數據庫中的職位)
當一個項目從列表框中一號去掉,應該在第二個列表框中顯示出來...
當一個項目從第二列表框中刪除,它應該在第一列表框中顯示出來......
此功能允許您從您的部門
的頁面功能添加和刪除按鈕添加和刪除工作是兩個按鈕。一切正常,除了列表框不能可靠地更新。數據本身在數據庫中更新,如果我刷新(F5),它將正確顯示。
<asp:ScriptManager ID="smgrDeptsJobs" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="uPanelDeptsJobs" runat="server">
<ContentTemplate>
<asp:DropDownList ID="ddlDepartments" runat="server"
DataSourceID="sqldsDepartments" DataTextField="Department"
DataValueField="DeptID" Width="150px" AutoPostBack="True">
</asp:DropDownList>
<asp:ListBox ID="lstJobsIn" runat="server" DataSourceID="sqldsJobsIn"
DataTextField="JobName" DataValueField="JobID" height="156px"
width="220px">
</asp:ListBox>
<asp:Button ID="btnAddJob" runat="server" Text="<<" Width="70px"
CausesValidation="False" />
<asp:Button ID="btnRemoveJob" runat="server" Text=">>" Width="70px"
CausesValidation="False" />
<asp:ListBox ID="lstJobsOut" runat="server" DataSourceID="sqldsJobsOut"
DataTextField="JobName" DataValueField="JobID" height="156px"
width="220px">
</asp:ListBox>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ddlDepartments"
EventName="SelectedIndexChanged" />
<asp:AsyncPostBackTrigger ControlID="btnAddJob" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="btnRemoveJob" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
兩個按鈕單擊事件的代碼如下:
Protected Sub btnAddJob_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddJob.Click
Dim sqlJobsDB As New SqlConnection(ConfigurationManager.ConnectionStrings("JobsDB").ConnectionString)
Dim sqlCmdInsert As SqlCommand = sqlJobsDB.CreateCommand()
sqlJobsDB.Open()
sqlCmdInsert.CommandText = _
"INSERT INTO tblDeptsJobs (DeptID, JobID) VALUES " + _
"(@DeptID, @JobID)"
' Declare the data types for the parameters
sqlCmdInsert.Parameters.Add("@DeptID", SqlDbType.TinyInt)
sqlCmdInsert.Parameters.Add("@JobID", SqlDbType.TinyInt)
' Assign the parameters values from the form
sqlCmdInsert.Parameters("@DeptID").Value = ddlDepartments.SelectedValue
sqlCmdInsert.Parameters("@JobID").Value = lstJobsOut.SelectedValue
' Execute the insert Statement
sqlCmdInsert.ExecuteNonQuery()
sqlJobsDB.Close()
End Sub
Protected Sub btnRemoveJob_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRemoveJob.Click
Dim sqlJobsDB As New SqlConnection(ConfigurationManager.ConnectionStrings("JobsDB").ConnectionString)
Dim sqlCmdDelete As SqlCommand = sqlJobsDB.CreateCommand()
sqlJobsDB.Open()
sqlCmdDelete.CommandText = _
"DELETE FROM tblDeptsJobs WHERE tblDeptsJobs.DeptID = @DeptID AND tblDeptsJobs.JobID = @JobID"
' Declare the data types for the parameters
sqlCmdDelete.Parameters.Add("@DeptID", SqlDbType.TinyInt)
sqlCmdDelete.Parameters.Add("@JobID", SqlDbType.TinyInt)
' Assign the parameters values from the form
sqlCmdDelete.Parameters("@DeptID").Value = ddlDepartments.SelectedValue
sqlCmdDelete.Parameters("@JobID").Value = lstJobsIn.SelectedValue
' Execute the insert Statement
sqlCmdDelete.ExecuteNonQuery()
sqlJobsDB.Close()
End Sub
這感覺就像當我添加或刪除工作,我上次在選擇項目列表框,是一個不更新。
我也無法獲得下拉列表來更新列表框,而沒有將下拉列表中的autopostback設置爲True。
更新:我想出的醜陋的bandaid修復程序是使用listbox.items.clear()方法,然後重新綁定每個列表框的數據。
您可以添加異步回發的服務器端代碼嗎? – Becuzz
如果你沒有和UpdatePanel結婚,我建議你只用javascript/jQuery和web方法來做。 我一直對ASP更新面板感到頭痛。 – Dan
@Becuzz Async Postbacks的服務器端處理程序是我理解的ScriptManager。 asp:ScriptManager> –
Lucretius