首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VB.Net:无法从控件集合中找到控件类型

VB.Net:无法从控件集合中找到控件类型
EN

Stack Overflow用户
提问于 2022-05-06 01:49:13
回答 1查看 82关注 0票数 0

我对VB.NET还不熟悉,并试图找到简化某些代码的正确方法(同时理解它会增加运行时的复杂性)。

我定义了一个带有许多字段的Windows窗体。用户在这些文本框、复选框等中输入数据,然后点击表单的“搜索”按钮。我的现有(工作)代码查看第一个输入字段,并将4个(或可选的5个)参数传递给我的BuildSearch函数,该函数根据第一个输入字段返回一个SQL子句段。然后,在将请求提交给服务器之前,它会重复其余输入字段的过程,将所有SQL段与“AND”连接起来。

我现有的代码如下所示:

代码语言:javascript
运行
复制
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语句。下面是我在第一个模块中所做的工作:

代码语言:javascript
运行
复制
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},
    ...

我原以为能做到:

代码语言:javascript
运行
复制
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时,我没有看到任何东西可以告诉我控件的名称或控件的类型:本地窗口

我想做的事有可能吗?如果是这样的话,有人能给我一个提示来找出控制的类型吗?我很感激你能提供的任何帮助。

EN

回答 1

Stack Overflow用户

发布于 2022-05-06 02:09:52

我建议您只创建一个包含所有可能的过滤器并传递空值的查询,从而有效地忽略某些参数。这可能会减缓查询的速度,但是,除非有大量的数据,否则不会有什么意义。下面是一个有两个过滤器字段的简单示例:

代码语言:javascript
运行
复制
SELECT *
FROM SomeTable
WHERE (@Column1 IS NULL OR Column1 = @Column1)
AND (@Column2 IS NULL OR Column2 = @Column2)

然后,您可以为两个参数传递DBNull.Value以获得所有记录,将其中一个参数的DBNull.Value传递给另一个参数,或者将两个参数的值同时传递给另一个参数。

代码语言:javascript
运行
复制
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运算符要求两个潜在的返回值都是相同类型或可分配给相同类型。DBNullString的情况并非如此,因此必须将其中一个转换为Object类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72135320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档