2011-07-29 2 views
3

UpdatePanel 내에 드롭 다운 목록, 두 개의 단추 및 두 개의 목록 상자가있는 양식이 있습니다. 드롭 다운 목록 및 목록 상자는 모두 SqlDatasources에 바인딩됩니다.ASP.NET 4 - UpdatePanel이 목록 상자를 업데이트하지 않습니다.

드롭 다운 목록을 통해 부서를 선택할 수 있습니다.

첫 번째 목록 상자는 부서에서 선택한 항목과 관련된 작업 목록을 표시합니다.

두 번째 목록 상자에는 해당 항목의 역 목록이 표시됩니다.

첫 번째 목록 상자에서 항목을 제거하면 두 번째 목록 상자에 항목이 표시됩니다 ...
두 번째 목록 상자에서 항목을 제거하면 해당 항목이 두 번째 목록 상자에 표시됩니다. 그것은이 기능을 사용하면 추가 및 제거 버튼과 페이지 기능에 부서

로부터 두 개의 버튼을 작업입니다 추가하고 제거 할 수 있습니다

... 1 목록 상자에 표시해야한다. 목록 상자가 안정적으로 업데이트되지 않는 것을 제외하고는 모두 작동합니다. 데이터 자체가 데이터베이스에서 업데이트되고 새로 고침 (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 

그것은 내가 추가하거나 작업을 제거 할 때 같은 느낌, 내가 마지막에있는 항목을 선택 목록 상자는 하나입니다 그 업데이트되지 않습니다.

또한 드롭 다운 목록의 자동 저장을 True로 설정하지 않고도 목록 상자를 업데이트 할 수있는 드롭 다운 목록을 가져올 수 없습니다.

업데이트 : 내가 겪었던 추악한 bandaid 픽스는 listbox.items.clear() 메소드를 사용하고 각리스트 박스에 대한 데이터를 다시 바인딩하는 것입니다.

+0

비동기 포스트 백을위한 서버 측 코드를 추가 할 수 있습니까? – Becuzz

+0

당신이 UpdatePanel과 결혼하지 않았다면 javascript/jQuery와 웹 메소드로 해보는 것이 좋습니다. 저는 항상 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

관련 문제