【发布时间】:2016-11-15 16:12:01
【问题描述】:
我必须完成看似微不足道的任务,但事实证明它比我预期的更令人困惑。这是场景:
我有一个GridView,它从我的SQL Server 数据库中获取数据并将其显示在网页上(非常正常的场景)。但是,我有一些过滤器可以确定在数据库上运行哪个查询,这显然决定了最终显示在GridView 中的数据。我在有效地合并这些过滤器时遇到了一些麻烦。目前,我有这三个子程序:LoadPendingRequests()、LoadApprovedRequests() 和LoadDeniedRequests()。如您所料,我有一个CheckboxList,它允许用户选择“待定”、“已批准”或“已拒绝”,并且根据所选择的,调用相应的子例程,从而填充GridView与相应的数据。这部分有效。
但是,用户可以选择同时加载挂起、拒绝和批准请求的任意组合。这就是我遇到麻烦的地方。这是CheckboxList 的SelectedIndexChanged 事件处理程序:
Protected Sub CheckboxList1_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles CheckboxList1.SelectedIndexChanged
If CheckboxList1.SelectedIndex < 0 Then
CheckboxList1.SelectedIndex = 0
End If
If CheckboxList1.Items(0).Selected = True Then 'pending checkbox
LoadPendingRequests()
End If
If CheckboxList1.Items(1).Selected = True Then 'approved checkbox
LoadApprovedRequests()
End If
If CheckboxList1.Items(2).Selected = True Then 'denied checkbox
LoadDeniedRequests()
End If
End Sub
这里是加载请求的子程序示例(它们都是一样的,只是替换“where”子句中的过滤词):
Protected Sub LoadPendingRequests()
Try
Dim DbConnection As New DevConnection()
Dim Da As New SqlDataAdapter()
Using DbConnection.Conn
DbConnection.Conn.Open()
Using SqlCmd As New SqlCommand()
With SqlCmd
.Connection = DbConnection.Conn
.CommandType = CommandType.Text
.CommandText = "SELECT * FROM dbo.reqTable where Status = 'Pending'"
End With
Using Da
Da.SelectCommand = SqlCmd
Using Dt As New DataTable()
Da.Fill(Dt) 'populates the dataset
Gv.DataSource = Dt
'Gv.DataBind()
CheckSuggestionApprovalStatus()
End Using
End Using
End Using
End Using
Catch ex As Exception
End Try
End Sub
在这种设置下,当用户单击CheckboxList 中的框时,我将如何加载待处理、已批准和已拒绝的请求?如有必要,我愿意完全改变这个过程。
【问题讨论】:
-
解决这个问题的最简单方法(尽管可能被纯粹主义者不赞成)是只使用一个查询,其中 WHERE 子句根据选中的框动态构建。
-
@peterG 感谢您的回复。我也想过这样做。我想看看是否有人对替代方法有任何想法,但我最终可能会这样做。
-
更好的选择是创建一个将状态作为参数接收的存储过程。
标签: asp.net sql-server vb.net gridview webforms