后台代码设置Div字体加粗报错:对象引用未设置到实例
问题分析与解决方案
报错原因
你的dvLock控件大概率位于数据绑定控件(如GridView、FormView、Repeater等)的模板(ItemTemplate/EditItemTemplate)内部。这类模板中的服务器控件只会在数据绑定控件执行DataBind()后,逐行/逐项实例化。在Page_Load事件阶段,模板还未渲染,控件实例尚未创建,直接访问就会抛出“对象引用未设置到实例”的错误。
如果控件不在模板内,也可能是母版页/ContentPlaceHolder的命名容器问题,导致直接访问不到控件实例。
解决方案
情况1:dvLock在数据绑定控件模板内
以GridView为例,需在数据绑定控件的ItemDataBound事件中处理控件:
后台C#代码
// GridView的RowDataBound事件处理方法 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { // 仅处理数据行(排除表头、表尾) if (e.Row.RowType == DataControlRowType.DataRow) { HtmlGenericControl dvLock = (HtmlGenericControl)e.Row.FindControl("dvLock"); if (dvLock != null && User.Id == "B") { dvLock.Style["font-weight"] = "bold"; } } }
前端代码(绑定事件)
确保数据绑定控件注册对应事件:
<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound"> <ItemTemplate> <!-- 你的dvLock代码 --> <div id="dvLock" runat="server" class="col-md-8" style="border-bottom:inherit;"> <span ID="DisplyHelpTextLocked" runat="server" visible='<%# (Eval("Parent.BlockReclass").ToString() == "ZL") %>'> Click this option to remove. Future authorizations will be allowed effective immediately. <br /> <br /> </span> </div> </ItemTemplate> </asp:GridView>
情况2:dvLock是页面直接控件(不在模板内)
如果控件是页面级直接控件,需通过命名容器查找(比如母版页的ContentPlaceHolder):
protected void Page_Load(object sender, EventArgs e) { if (User.Id == "B") { // 替换为你的ContentPlaceHolderID ContentPlaceHolder content = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1"); HtmlGenericControl dvLock = (HtmlGenericControl)content.FindControl("dvLock"); if (dvLock != null) { dvLock.Style["font-weight"] = "bold"; } } }
额外提示
- 模板内的控件绝对不能在
Page_Load、Page_Init等早期页面生命周期事件中直接访问,必须等待数据绑定控件完成项实例化后,在对应的ItemDataBound类事件中处理。 - 使用
FindControl时,必须定位到正确的命名容器(如数据行、数据项),否则会找不到控件。
内容的提问来源于stack exchange,提问作者VimalSingh
相关产品推荐
相关产品推荐

