【问题标题】:Finding and looping through labels查找和循环遍历标签
【发布时间】:2015-09-09 22:49:19
【问题描述】:

运行 VS 2013 VB.net。

我的 aspx 页面上有 3 个标签,分别标记为 label1、label2 和 label3。

我想遍历后面代码中的每一个并为它们赋值。

这是我的代码

Dim X As Integer = 1

For Each obj In values

    Dim myLabel As Label
    myLabel = TryCast(Me.FindControl("Label" + X), Label)
    myLabel.Text = Math.Round(obj, 2)

    X = X + 1

Next

我知道只有 3 个 obj,所以 x 将始终介于 1 和 3 之间。当我得到以下内容时,我做错了什么。

从字符串“Label”到类型“Double”的转换无效

如果我将 ("label" + x) 更改为 ("label1") 我得到

对象引用未设置为对象的实例。

在下面一行。

【问题讨论】:

  • 你在连接吗?这不应该是“标签”和 X)

标签: asp.net vb.net


【解决方案1】:

您想连接字符串而不进行计算,在 VB.NET 中您使用 & 而不是 +(与 C# 相反)。所以这应该有效:

myLabel = TryCast(Me.FindControl("Label" & X), Label)

您还应该将Option Strict 设置为On,无一例外。然后你首先必须修复很多编译器错误,但这将有助于编写更健壮的代码。这也不会编译:

myLabel.Text = Math.Round(obj, 2)

因为Math.Round 返回DoubleLabel.TextString。你只需要使用Math.Round(obj, 2).ToString() 来修复它。

这是使用Linq 获取标签的另一种方法:

Dim myLabels = From lbl In Me.Form.Controls.OfType(Of Label)()
               Where lbl.ID.StartsWith("Label")
For Each lbl As Label In myLabels
    ' ... '
Next

【讨论】:

  • 我仍然在“mylabel.text=”行中得到“对象引用未设置为对象的实例”。 mylabel 也显示为空
  • @user2050577:可能这些标签不在页面顶部,而是在另一个容器控件中,例如GridViewUserControl,或者您正在使用母版页。
  • 标签在表格内。
  • @user2050577: 什么样的表,html-table 或 ASP.NET Table-class 或 GridView(也呈现为表)?
  • 它们在一个 html 表格中
【解决方案2】:

此外,由于您使用 TryCast 在使用它之前检查您的变量 - 如果它不进行强制转换,它将是 Nothing。

myLabel = TryCast(Me.FindControl("Label" & X.ToString), Label)
If myLabel IsNot Nothing Then
  'safe to use variable here
End If

【讨论】:

    猜你喜欢
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多