我正在尝试在页面加载时设置列表项的class属性。
Dim liItem As HtmlGenericControl = DirectCast(Page.FindControl("default"), HtmlGenericControl)
liItem.Attributes.Add("class", "active")
此代码不起作用,不太清楚为什么。 这是它产生的错误 “NullReferenceException:对象引用未设置为对象的实例”
答案 0 :(得分:0)
在这种情况下,异常不会更清楚。 NullReferenceException在此指示liItem
为空。这意味着在页面中没有控件称为“默认”(可能)或者DirectCast不起作用(不太可能,但也可能)。要记住的一件事是控件不可能嵌入到页面的控件集合中。
如果标记为“default”的控件包含在Panel或类似的容器控件中,则需要使用该特定控件的FindControl方法。获取控件的另一种方法是编写一个扩展方法来覆盖FindControl方法以进行递归(一种可能很重的方法)。
修改强>
以这种方式从母版页访问项目时,我更愿意从中进行猜测。我通常会在我的母版页中设置一个属性,该属性包含有问题的值或控件,例如:
Public Property LI_Default() As HtmlGenericControl
Get
Return Me.Default ' Assumes the name specified in the question
End Get
End Property
现在,使用母版页的页面无法立即访问,因此您必须在aspx页面内声明主类型:
<%@ MasterType VirtualPath="~/Path/To/My/Master.master" %>
通过此声明,您现在可以访问您创建的属性,并且不再需要打扰“查找”控件。
Protected Sub Page_Load(ByVal sender as Object, ByVal e as EventArgs) Handles Me.Load
If Me.Master IsNot Nothing Then
Me.Master.LI_Default.Attributes.Add("class", "active")
End If
End Sub
答案 1 :(得分:0)
另一个可能的问题是“默认”控件声明(在页面中)没有ID,并且没有runat =“server”指令。必须在控件中设置这两个项目,FindControl才能找到控件。
答案 2 :(得分:0)
如果您知道控件位于母版页中,您应该这样做:
Dim liItem As HtmlGenericControl = DirectCast(Me.Master.FindControl("default"))