我有一个包含许多控件的页面。
当页面呈现时,我想遍历页面上的所有控件并找到具有某个属性的属性的任何控件。我试图用c#做这个 - 有什么想法我可以实现这个吗?
答案 0 :(得分:1)
您需要使用Reflection http://msdn.microsoft.com/en-us/library/system.reflection.aspx
使用反射可以获得对象的所有属性
答案 1 :(得分:1)
我不知道你的控制树有多大。这就是我要做的。我没有表现出最好的表现。
案例1。寻找.NET属性
IEnumerable<Control> GetMarkedControls(ControlCollection controls)
{
foreach(Control c in controls)
{
var props = c.GetType().Properties();
if(props.Count(x => x.GetCustomAttributes(false).OfType<YourAttribute>().Count() > 0) > 0)
yield return c;
foreach (Control ic in GetMarkedControls(c.Controls))
yield return ic;
}
}
案例2。寻找HTML属性
IEnumerable<WebControl> GetMarkedControls(ControlCollection controls)
{
foreach(Control c in controls)
{
if(c is WebControl)
{
var wc = c as WebControl;
if (wc.Attributes.FirstOrDeafult(x => x.Name == "yourAttribute") != null)
yield return c;
}
foreach (Control ic in GetMarkedControls(c.Controls))
yield return ic;
}
}
现在您可以通过以下方式调用它:var controlsWAttribute = GetMarkedControls(this.Controls);
来自您的页面或任何控件。这样您就不必在页面级别调用它。
使用此方法,您可以浏览页面中的整个控制树或递归控制。
答案 2 :(得分:0)
页面上的每个控件都有一个“controls”属性,其中包含所有子控件。我已经编写了递归函数来循环遍历这些函数,但是手头没有。让我试着快速写一个:
public Collection<Control> findControlsWithAttributes(Control startingControl)
{
Collection<Control> toReturn = new Collection<Control>();
foreach (Control curControl in startingControl.controls)
{
if (DO COMPARISON HERE WITH CURCONTROL) toReturn.add(curControl);
if (curControl.Count() > 0) findControlsWithAttributes(curControl, toReturn);
}
return toReturn;
}
private void findControlsWithAttributes(Control startingControl, Collection<Control> inputCollection)
{
foreach (Control curControl in startingControl.controls)
{
if (DO COMPARISON HERE WITH CURCONTROL) inputCollection.add(curControl);
if (curControl.Count() > 0) findControlsWithAttributes(Control startingControl, Collection<Control> inputCollection);
}
}
我已经这么做了一段时间,如果Collection.Count是一个方法或属性,我不记得我的头顶,所以请确保先检查,但如果你通过页面然后,这将检查页面上每个服务器可见的控件,并返回包含与您的比较匹配的控件的集合。
最后,Control.Attributes将返回一个您应该能够随后进行比较的AttributeCollection。
答案 3 :(得分:0)
不确定你追求的是什么属性,但是如果看到@ user751975之后你的类属性是你的,那么你可以做类似......
page.Controls.Cast<System.Web.UI.WebControls.WebControl>().First().Attributes["class"]