我对VB.NET还不熟悉,并试图找到简化某些代码的正确方法(同时理解它会增加运行时的复杂性)。
我定义了一个带有许多字段的Windows窗体。用户在这些文本框、复选框等中输入数据,然后点击表单的“搜索”按钮。我的现有(工作)代码查看第一个输入字段,并将4个(或可选的5个)参数传递给我的BuildSearch函数,该函数根据第一个输入字段返回一个SQL子句段。然后,在将请求提交给服务器之前,它会重复其余输入字段的过程,将所有SQL段与“AND”连接起来。
我现有的代码如下所示:
If TxtSort_Key.Text <> "" Or LblSort_KeyOp.Text <> "" Then g$ = g$ & BuildSearch("Sort_Key", "", LblSort_KeyOp.Text, TxtSort_Key) ' Sort_Key
If TxtFullName.Text <> "" Or LblFullNameOp.Text <> "" Then g$ = g$ & BuildSearch("LastName", "", LblFullNameOp.Text, TxtFullName) ' LastName这些IF语句有19个,每个表单上的输入字段都有一个。传递给BuildSearch的前两个字段为SQL语句提供文本。其余的2个参数从要在SQL语句中使用的各种控件中获取文本。
类似的代码将使用其他形式,使用不同的字段名。因此,与其为每个表单(以及作为学习练习)编写更多的这些IF语句,我希望在每个表单中构建一个Collection,其中包含每个输入字段的4(或5)段数据,然后动态地生成IF语句。下面是我在第一个模块中所做的工作:
Public Class FormFld
Public Property ScrField As Control
Public Property ScrLabel As Control
Public Property DbField As String
Public Property DbNumeric As Boolean
End Class
Public Class FrmSearch
Private ReadOnly FormFlds As New List(Of FormFld) From
{
New FormFld With {.ScrField = TxtSort_Key, .ScrLabel = LblSort_KeyOp, .DbField = "Sort_Key", .DbNumeric = False}} ',
New FormFld With {.ScrField = TxtFullName, .ScrLabel = LblFullNameOp.Text, .DbField = "LastName", .DbNumeric = False},
...我原以为能做到:
For Each formfld In FormFlds
With formfld
' Examine .ScrField to determine the type of control, then extract the proper field and determine the
' proper condition to generate, e.g., TxtSort_Key.Text <> "", or ChkVolunteer.Checked…, etc.
End With
Next但是,当在那里设置断点并查看局部变量中的ScrLabel时,我没有看到任何东西可以告诉我控件的名称或控件的类型:本地窗口
我想做的事有可能吗?如果是这样的话,有人能给我一个提示来找出控制的类型吗?我很感激你能提供的任何帮助。
发布于 2022-05-06 02:09:52
我建议您只创建一个包含所有可能的过滤器并传递空值的查询,从而有效地忽略某些参数。这可能会减缓查询的速度,但是,除非有大量的数据,否则不会有什么意义。下面是一个有两个过滤器字段的简单示例:
SELECT *
FROM SomeTable
WHERE (@Column1 IS NULL OR Column1 = @Column1)
AND (@Column2 IS NULL OR Column2 = @Column2)然后,您可以为两个参数传递DBNull.Value以获得所有记录,将其中一个参数的DBNull.Value传递给另一个参数,或者将两个参数的值同时传递给另一个参数。
With myCommand.Parameters
.Add("@Column1", SqlDbType.VarChar, 50).Value = If(TextBox1.TextLength = 0, CObj(DBNull.Value), TextBox1.Text)
.Add("@Column2", SqlDbType.VarChar, 50).Value = If(TextBox2.TextLength = 0, CObj(DBNull.Value), TextBox2.Text)
End With请注意,此处使用的If运算符要求两个潜在的返回值都是相同类型或可分配给相同类型。DBNull和String的情况并非如此,因此必须将其中一个转换为Object类型。
https://stackoverflow.com/questions/72135320
复制相似问题