ASP.NET 4 - UpdatePanel не будет обновлять список - PullRequest
3 голосов
/ 29 июля 2011

У меня есть форма с выпадающим списком, двумя кнопками и двумя списками внутри UpdatePanel. Выпадающий список и списки привязаны к SqlDatasources.

В раскрывающемся списке вы можете выбрать свой отдел.

В первом списке отображается список заданий, связанных с тем, что вы выбрали из отдела.

Второй список показывает обратный список этих элементов. (Задания в базе данных, не связанные с вашим отделом)

Когда элемент удаляется из первого списка, он должен отображаться во втором списке ...
Когда элемент удален из второго списка, он должен появиться в первом списке ...

Эта функция позволяет добавлять и удалять задания из вашего отдела

Две кнопки на странице функционируют как кнопки «Добавить» и «Удалить». Все работает, кроме списков не будет надежно обновлять. Данные обновляются в базе данных, и если я обновлю (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.

Обновление: уродливое исправление, которое я предложил, - это использование метода listbox.items.clear (), а затем повторное связывание данных для каждого списка.

Ответы [ 2 ]

1 голос
/ 01 августа 2011

По сути, вы обновляете свою базу данных, но никогда не привязываете свои элементы управления.Я не уверен, что именно вам нужно будет добавить в обработчики кликов, чтобы эта работа (потому что я никогда раньше не использовал элементы управления источниками данных 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

Это примерно то, как это будет выглядеть.Мне было бы интересно узнать, что именно вы делаете для решения вашей проблемы.

1 голос
/ 29 июля 2011

Просто установите в раскрывающемся списке autopostback значение true, удалите все триггеры и установите ChildrenAsTriggers = "true" на панели обновления.

...