2011-07-29 39 views
3

我有一個窗體,在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="&lt;&lt;" Width="70px" 
      CausesValidation="False" /> 

     <asp:Button ID="btnRemoveJob" runat="server" Text="&gt;&gt;" 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()方法,然後重新綁定每個列表框的數據。

+0

您可以添加異步回發的服務器端代碼嗎? – Becuzz

+0

如果你沒有和UpdatePanel結婚,我建議你只用javascript/jQuery和web方法來做。 我一直對ASP更新面板感到頭痛。 – Dan

+0

@Becuzz Async Postbacks的服務器端處理程序是我理解的ScriptManager。 Lucretius

回答

1

基本上發生的是你更新你的數據庫,但從不重新綁定你的控件。我不知道你將不得不把你的點擊處理,使這項工作(因爲我從來沒有使用過的SQL數據源控件)到底是什麼,但它應該是這個樣子:

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

    //may need to do explicit call to DB to get data here 
    //after you have the data, rebind 
    lstJobsIn.DataBind(); 
    lstJobsOut.DataBind(); 
End Sub 

這是大致它會是什麼樣子。我很想知道你究竟做了什麼來解決你的問題。

+0

這就是我最終做的,(編輯我的第一篇文章)。我不知道是否有必要,但是我在'.DataBind()'之前在這兩個列表框上做了一個'.clear()',它們現在可以正常工作。如果您將「修改數據綁定項目」屬性設置爲true,則列表框可能只需要'.clear()'。 – Lucretius

1

只需將dropdownlist autopostback設置爲true,即可刪除所有觸發器並在updatepanel上設置ChildrenAsTriggers =「true」。

+0

在屏幕截圖中,我從部門下拉列表中選擇了「維護」。我試圖將右側列表框中的「混音器」作業移至左側的列表框。它顯示在左側,但不會從右側的列表框中刪除。 http://i53.tinypic.com/35i4srb.png如果我然後手動刷新頁面(F5),它將從右側列表中刪除。 – Lucretius

+0

你可以把你的DataSource控件放入同一個UpdatePanel嗎? –

+0

試過了,沒有工作。數據庫中的數據本身正在發生變化,因此更新這些數據將無助於列表框的更新。 – Lucretius