【发布时间】: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="<<" 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
感觉就像当我添加或删除一个作业时,我上次在其中选择一个项目的列表框是没有更新的。
如果不将下拉列表上的自动回发设置为 True,我也无法让下拉列表更新列表框。
我想出的丑陋创可贴修复方法是使用listbox.items.clear() 方法,然后为每个列表框重新绑定数据。
【问题讨论】:
-
可以为异步回发添加服务器端代码吗?
-
如果您没有与 UpdatePanel 结婚,我建议您只使用 javascript / jQuery 和 web 方法。我一直对 ASP 更新面板感到头疼。
-
@Becuzz 根据我的理解,异步回发的服务器端处理程序是 ScriptManager。
-
@Lucretius 我的意思是在服务器上调用的函数。例如,当我单击 btnAddJob 时会执行什么函数/代码? btnAddJob_Click? (这是我假设您对数据库进行更改的地方。)这样做会很有帮助。
-
@Becuzz 我明白了,我现在将添加它。一种是插入语句,一种是删除语句。注意:我还没有编写任何异常处理代码,比如如果有人尝试两次添加相同的记录(只需双击)就会破坏它。
标签: asp.net ajax listbox updatepanel sqldatasource