我有 5 个下拉列表/组合框。是否有更有效的方法使用函数和参数绑定(bind)数据,在某些情况下参数可以为空。而不是为每个场景创建单独的数据绑定(bind)。
我希望用户能够根据一个或多个(组合)下拉列表选择来查看转发器中的数据。例如。用户在 DdlA 和 ComboboxA 中选择值,但希望将其他值留空。
下面是我编写的代码示例,一次仅适用于一项选择。我如何调整它以使用多个但不一定是所有选定的值。
Protected Sub BttnSave_Click(sender As Object, e As EventArgs) Handles BttnSave.Click
If DdlA.SelectedValue = "1" And DdlB.SelectedValue = "1" And DdlC.SelectedValue = "1" And ComboboxA.SelectedValue = "" And DdlD.Text = "" Then
Me.ReadAllData()
ElseIf DdlA.SelectedValue <> "1" And DdlB.SelectedValue = "1" And DdlC.SelectedValue = "1" And ComboboxA.SelectedValue = "" And DdlD.Text = "" Then
Me.ReadAData()
ElseIf DdlA.SelectedValue = "1" And DdlB.SelectedValue <> "1" And DdlC.SelectedValue = "1" And ComboboxA.SelectedValue = "" And DdlD.Text = "" Then
ReadBData()
ElseIf DdlA.SelectedValue = "1" And DdlB.SelectedValue = "1" And DdlC.SelectedValue <> "1" And ComboboxA.SelectedValue = "" And DdlD.Text = "" Then
ReadCData()
ElseIf DdlA.SelectedValue = "1" And DdlB.SelectedValue = "1" And DdlC.SelectedValue = "1" And ComboboxA.SelectedValue <> "" And DdlD.Text = "" Then
ReadComboboxData()
ElseIf DdlA.SelectedValue = "1" And DdlB.SelectedValue = "1" And DdlC.SelectedValue = "1" And ComboboxA.SelectedValue = "" And DdlD.Text <> "" Then
ReadDData()
End If
End Sub
Private Sub ReadAData()
Dim query As String = "SELECT * FROM Test WHERE A = @A ORDER BY ID DESC"
Dim cmd As SqlCommand = New SqlCommand(query)
cmd.Parameters.AddWithValue("@A", DdlA.SelectedItem.Text)
Using con As SqlConnection = New SqlConnection(GblSqlCon)
Using sda As SqlDataAdapter = New SqlDataAdapter()
cmd.Connection = con
sda.SelectCommand = cmd
Using dt As DataTable = New DataTable()
sda.Fill(dt)
Repeater1.DataSource = dt
Repeater1.DataBind()
End Using
End Using
End Using
End Sub
Private Sub ReadBData()
Dim query As String = "SELECT * FROM [dbo].[TestActivityLog] WHERE B = @B ORDER BY ID DESC"
Dim cmd As SqlCommand = New SqlCommand(query)
cmd.Parameters.AddWithValue("@B", DdlB.SelectedItem.Text)
Using con As SqlConnection = New SqlConnection(GblSqlCon)
Using sda As SqlDataAdapter = New SqlDataAdapter()
cmd.Connection = con
sda.SelectCommand = cmd
Using dt As DataTable = New DataTable()
sda.Fill(dt)
Repeater1.DataSource = dt
Repeater1.DataBind()
End Using
End Using
End Using
End Sub
最佳答案
已编辑
尝试使用存储过程。
如果我没记错的话,您想要创建类似的内容,如果选择了任何组合框值,那么您的转发器应该加载。
检查以下方法。
在 VB.NET 中
Private Sub ReadAllData() 'I Used oledbConnection, you can continue using sqlconnection. Using xcn As New OleDbConnection Using com As New OleDbCommand xcn.ConnectionString = "YOUR CONNECTION STRING" com.Connection = xcn com.CommandType = CommandType.StoredProcedure com.CommandText = "YOUR STORED PROCEDURE NAME" 'try to pass string.empty or "" if your combobox value is null com.Parameters.AddWithValue("@A", OleDb.OleDbType.VarChar).Value = IIf(DdlA.SelectedValue = Nothing, "", DdlA.SelectedValue) com.Parameters.AddWithValue("@B", OleDb.OleDbType.VarChar).Value = IIf(DdlB.SelectedValue = Nothing, "", DdlB.SelectedValue) com.Parameters.AddWithValue("@C", OleDb.OleDbType.VarChar).Value = IIf(DdlC.SelectedValue = Nothing, "", DdlC.SelectedValue) com.Parameters.AddWithValue("@D", OleDb.OleDbType.VarChar).Value = IIf(DdlD.SelectedValue = Nothing, "", DdlD.SelectedValue) com.Parameters.AddWithValue("@E", OleDb.OleDbType.VarChar).Value = IIf(DdlE.SelectedValue = Nothing, "", DdlE.SelectedValue) xcn.Open() Using dt As DataTable = New DataTable() sda.Fill(dt) Repeater1.DataSource = dt Repeater1.DataBind() End Using End Using End Using End Sub
创建 SQL Server 存储过程,
CREATE PROCEDURE [dbo].[YourProcedureName] @A varchar(MAX), @B varchar(MAX), @C varchar(MAX),
@D varchar(MAX), @E varchar(MAX)
as
DECLARE @sql as varchar (MAX)
set @sql = 'Select (All your column names except type1) from
(SELECT 1 as type1, * FROM [dbo].[TestActivityLog]) as A
where A.type1 = 1'
if @A <> ''
begin
set @sql = @sql + ' AND ColumnA IN ('+ @A +')'
end
if @B <> ''
begin
set @sql = @sql + ' AND ColumnB IN ('+ @B +')'
end
if @C <> ''
begin
set @sql = @sql + ' AND ColumnC IN ('+ @C +')'
end
if @D <> ''
begin
set @sql = @sql + ' AND ColumnD IN ('+ @D +')'
end
if @E <> ''
begin
set @sql = @sql + ' AND ColumnE IN ('+ @E +')'
end
set @sql = @sql + ' ORDER BY columnnames'
exec (@sql)
如果您的表 TestActivityLog
中有一个具有固定值的列,那么您可以避免使用 type1 并像这样使用它
set @sql = 'SELECT * FROM [dbo].[TestActivityLog] where FixedvalueColumn = thatfixedvalue' if... and continue code as above.
希望这对您有帮助。 :)
关于sql-server - 如何在repeater vb.net中基于下拉列表绑定(bind)数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76235784/