使用FindControl()来查找控件

我有一个Literal控件,我试图找到它,所以我可以插入文本。 我有一个包含多个内容占位符的母版页面。

  

Project Navigation

我不断得到“对象引用未设置为对象的实例”。 如何找到此对象以便我可以找到并更新它?

我试过了:

 ((Literal)Page.FindControl("litNavLinks")).Text = sb.ToString(); ((Literal)Page.Page.FindControl("litNavLinks")).Text = sb.ToString(); ((Literal)Page.FindControl("Content7").FindControl("litNavLinks")).Text = sb.ToString(); 

无济于事。 我如何确定位置?

从主页内:

 var literal = (Literal)FindControl("MainLinks").FindControl("litNavLinks"); literal.Text = sb.ToString(); 

从视图内:

 litNavLinks.Text = sb.ToString(); 

我会尝试不同的方法。

如何使用用户控件并公开相关属性来获取或设置文本值。

该属性将访问文字控件。 但是,调用该属性的页面不会更明智。

请记住,我们生活在OO世界。

我认为你必须这样做,但我现在没有我的代码进行仔细检查:

 Page.Master.FindControl("MainLinks").FindControl("litNavLinks"); 

ASP ContentPlaceHolder控件是一个“命名容器”(它实现了INamingContainer接口)。 Control.FindControls方法仅在当前命名容器中搜索具有您指定的ID的控件。

我偶尔会包含一个实用程序函数,它接受一个“/”分隔字符串来随意浏览页面上的命名容器。 类似于以下实现。 (注意:我没有尝试编译或测试此代码)

  public static Control FindControlByPath(this Control start, string controlPath) { if(controlPath == null) throw new ArgumentNullException("controlPath"); string[] controlIds = controlPath.split('/'); Control current = start; if(controlIds[0] == "") // in case the control path starts with "/" current = start.Page; // in that case, start at the top for(int i=0; i//", if desired break; case ".": // do nothing, stay on the current control break; case "..": // navigate up to the next naming container current = current.Parent; if(current == null) throw new ArgumentOutOfRangeException("No parent naming container exists.", "controlPath"); while(!(current is INamingContainer)) { current = current.Parent; if(current == null) throw new ArgumentOutOfRangeException("No parent naming container exists.", "controlPath"); } break; default: current = current.FindControl(controlIds[i]); break; } } return current; } 

因此,在您的情况下,您应该能够执行以下操作:

 .FindControlByPath("/MainLinks/litNavLinks").Text = sb.ToString(); 

要么

 Page.FindControlByPath("MainLinks/litNavLinks").Text = sb.ToString(); 
 Literal tbx = this.Controls.Find("Literal1", true).FirstOrDefault() as Literal;