2012-03-29 54 views
2

如何以编程方式从cs文件访问aspx页面上的控件?例如,如果我有一套asp:Panel控件,每个控件都有一个由城市命名的ID(id =“atlanta”,id =“chicago”,id =“pittsburgh”等),然后在cs我从数据库中获取一个值以匹配控件名称我将使用什么?如何以编程方式从cs文件访问aspx页面上的控件

我试图使用FindControl(),如图所示,它返回null。

aspx页面:

<asp:Panel ID="atlanta" runat="server" Visible="false"></asp:Panel> 

CS文件:

controlName = storeLocation.City.ToLower(); 
Panel cityPanel = (Panel)FindControl(controlName); 
cityPanel.Visible = true; 

我想的FindControl()是真的在等,其中您在ItemTemaplate通过中继器或网格的情况下使用。在我的情况下,它只是一个简单的内容页面,里面有一堆内容标签。

感谢先进! :)

+0

你检查了我的答案吗?我在我的机器上试过了,它似乎工作。我很好奇... – daniloquio 2012-03-29 23:03:33

回答

3

FindControl()不递归,这可能是你的问题。但是,递归版本有许多实现,例如this one

如果要动态创建面板,并且您希望稍后在页面生命周期中访问它们,则可以将它们全部添加到以ID为关键字的Dictionary<string, Panel>

+0

谢谢,这绝对有效。正如其他人所指出的那样,递归可能会导致税收,但目前状态下的aspx页面的结构应该不成问题。如果它发生变化并变得更加复杂,这可能是一个问题,但我不认为这个页面的变化不是复制/文本。 – Dmase05 2012-03-30 15:14:59

+0

很高兴它的作品。如果你知道所有项目的直接父项,你可以避免递归,但否则我不会担心它。通过几个级别的控制递归是非常便宜的。 – 2012-03-30 17:31:10

2

您可以使用该扩展方法递归地找到控制:

public static class ControlExtension 
{ 

    public static IEnumerable<Control> GetAllControls(this Control parent) 
    { 
     foreach (Control control in parent.Controls) 
     { 
      yield return control; 
      foreach (Control child in control.GetAllControls()) 
      { 
       yield return child; 
      } 
     } 
    } 
} 

然后在你的代码页的背后,如果你前缀的标签,你可以做这样的事情:

IEnumerable<Control> city_controls = this.GetAllControls().Where(x => x.Id.Contains("city_")) 

或单控:

var city = this.GetAllControls().Single(x => x.Id = "atlanta"); 

this是你的ASPX代码背后页面。

它也适用于如面板控制,所以如果你想找到一个面板中的所有控件等

1

如果您知道包含控制您可以使用该控件的FindControl()功能查找它。这种方法比使用递归方法更快更安全。

由于某种原因,Microsoft不包括递归的FindControl()函数,随着更多控件添加到页面,它会随着时间的推移而减慢页面的速度。如果这不起作用,请使用像其他建议一样的递归函数。

+0

我也有这个问题。试图在包含内容占位符上执行FindControl()也返回null。 – Dmase05 2012-03-30 15:11:43

1

这应该适合你,因为面板嵌套在asp:Content控件中。

Panel cityPanel = 
(Panel)Master.FindControl("ContentPlaceHolderId").FindControl(controlName); 

当然,ContentPlaceHolderId是您正在实施的母版页中相应ContentPlaceHolder的Id。

+0

我无法得到这个工作。 所以,如果我有这在ASPX: '的' 我应该在CS具有这样的: '面板concentrationPanel =(面板)Master.FindControl(“cphInteriorBody”)。FindControl(controlName);' – Dmase05 2012-03-30 15:04:27

+0

@ DMase05是的,这是我用它的方式,它为我工作,我很抱歉它不适合你。正如你在其他答案中所说的那样,递归肯定会起作用。 – daniloquio 2012-03-30 15:33:40

+0

是的,我真的很困惑,因为我期望它也能工作。不管怎么说,还是要谢谢你! – Dmase05 2012-03-30 17:37:05

相关问题