【问题标题】:Iteratively Reference Controls by Name Pattern (VB.NET)按名称模式迭代引用控件 (VB.NET)
【发布时间】:2011-11-25 11:47:12
【问题描述】:

有没有一种方法可以根据其名称模式迭代引用 ASP.NET 控件?也许通过“指针”或其他什么?

我拥有的是一大组组合框(每个组合框都有一个关联的 DropDownList 和 TextBox 控件)。 DropDownList 始终默认选择一个项目,但用户可能希望提交一个 NULL 值。我想出了以下代码来处理三种情况:NULL、Existing Item、New Item。

'TextBoxControl & DropDownListControl should iteratively reference their
'  respective TextBox & DropDownList controls by the actual control name
If StrComp(TextBoxControl.Text, DropDownListControl.SelectedItem.ToString) = 0 Then
    'When an Existing Item is selected, Do Something
ElseIf Not TextBoxControl.Text = "" Then
    'When a New Item is entered, Validate & Do Something
Else
    'When NULL, Do Something
End If

问题是,有这么多组合框,我很容易得到数百行代码。我希望以更动态的方式处理这个问题,但我不知道是否可以以这种方式引用控件。假设我想分别引用所有的 TextBox 控件和 DropDownList 控件。

我可以使用给定的命名模式进行字符串格式化,以便为任何控件生成名称 ID,因为它们都以相同的模式命名。例如,通过附加特定的后缀,对 TextBox 控件说“_tb”,对 DropDownList 控件说“_ddl”:

Left(item.SelectedItem.ToString, item.SelectedItem.ToString.Length - 3) + "_tb"

这种事情可以在VB中完成吗? 最终,我的目标是获取用户输入/选择的值(如果有),并将其发送到 SQL Server 上的存储过程以插入数据库。

【问题讨论】:

    标签: asp.net vb.net dynamic controls iteration


    【解决方案1】:

    是的。在具有文本框和下拉菜单参数的函数内编写代码,然后根据这两个参数编写函数。然后,您只需为每个集合调用该函数,而不是到处复制/粘贴代码。

    不要尝试按名称选择事物。这很脆弱,并且对专为人类消费而设计的领域提出了机器要求。

    【讨论】:

    • 是的,我明白了大部分情况,但我正在努力解决的是如何将名称模式字符串转换为引用控件对象本身的 ClientID。换句话说,我如何传递字符串,但引用它,就好像它是一个控件 ID?假设你的意思是“For Each”,这是我接近它的角度。
    • @Chiramisu:根本不要按名称引用控件。传入包含控件的变量。
    • 好的,差不多了。现在我为每个 DropDownList:TextBox 对都有一个声明,但它仍然不是迭代的。可以这样做,还是我必须分别调用每一对?如果可能的话,恐怕我需要一些代码。我似乎无法弄清楚。谢谢:)
    • 对不起,你能回答我最后的评论吗?然后我会标记它已回答,谢谢。 :)
    【解决方案2】:

    我不确定适用 VBA 的相同内容是否适用于您的情况,但我遇到了同样的问题并且能够使用:

    Me.MultiPage1.Pages(1).Controls("ref" & i + 1).Value

    其中控件包含用户窗体(“我”)上的所有控件。因此,如果您的程序中的控件符合连续命名结构,则如果上述适用于 vb.net,则很容易处理

    【讨论】:

      猜你喜欢
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 2012-06-24
      相关资源
      最近更新 更多