运行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”),我会
对象引用未设置为对象的实例。
在下面一行。
答案 0 :(得分:2)
你想连接不计算的字符串,在VB.NET中你使用&
而不是+
(而不是C#)。所以这应该有效:
myLabel = TryCast(Me.FindControl("Label" & X), Label)
您还应将Option Strict
设置为On
,无一例外。然后,您首先必须修复许多编译器错误,但它将有助于编写更强大的代码。这不会编译:
myLabel.Text = Math.Round(obj, 2)
因为Math.Round
返回Double
而Label.Text
是String
。您只需使用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
答案 1 :(得分:0)
此外,由于您在使用之前使用TryCast
检查了您的变量 - 如果它没有进行投射,它将是Nothing。
myLabel = TryCast(Me.FindControl("Label" & X.ToString), Label)
If myLabel IsNot Nothing Then
'safe to use variable here
End If