【问题标题】:Why won't my UpdatePanel update my Listbox as I expect on button click?为什么我的 UpdatePanel 不会像我期望的那样在单击按钮时更新我的​​列表框?
【发布时间】:2011-07-29 16:29:28
【问题描述】:

我在 UpdatePanel 中有一个带有下拉列表、两个按钮和两个列表框的表单。 Dropdownlist 和列表框都绑定到 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() 方法,然后为每个列表框重新绑定数据。

【问题讨论】:

  • 可以为异步回发添加服务器端代码吗?
  • 如果您没有与 UpdatePanel 结婚,我建议您只使用 javascript / jQuery 和 web 方法。我一直对 ASP 更新面板感到头疼。
  • @Becuzz 根据我的理解,异步回发的服务器端处理程序是 ScriptManager。
  • @Lucretius 我的意思是在服务器上调用的函数。例如,当我单击 btnAddJob 时会执行什么函数/代码? btnAddJob_Click? (这是我假设您对数据库进行更改的地方。)这样做会很有帮助。
  • @Becuzz 我明白了,我现在将添加它。一种是插入语句,一种是删除语句。注意:我还没有编写任何异常处理代码,比如如果有人尝试两次添加相同的记录(只需双击)就会破坏它。

标签: asp.net ajax listbox updatepanel sqldatasource


【解决方案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

这大概就是它的样子。我很想看看你到底做了什么来解决你的问题。

【讨论】:

  • 这就是我最终要做的,(编辑了我的第一篇文章)。我不知道是否有必要,但我在.DataBind() 之前对这两个列表框都做了.clear(),它们现在可以正常工作。如果您将“修改数据绑定项”属性设置为 true,则列表框可能只需要 .clear()
【解决方案2】:

只需将下拉列表自动回发设置为 true,删除所有触发器并在更新面板上设置 ChildrenAsTriggers="true"。

【讨论】:

  • 在屏幕截图中,我从部门下拉列表中选择了“维护”。我试图将“混音器”作业从右侧的列表框中移动到左侧的列表框中。它显示在左侧,但不会从右侧的列表框中删除。 i53.tinypic.com/35i4srb.png 如果我随后手动刷新页面 (F5),它将从右侧列表中删除。
  • 你能把你的DataSource控件放到同一个UpdatePanel中吗?
  • 试过了,没用。数据库中的数据本身正在发生变化,因此更新这些数据不会帮助列表框更新。
猜你喜欢
  • 2010-10-13
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2021-11-19
相关资源
最近更新 更多