在 C# 中根据条件列出所有 属性 个控件名称
list all property names of controls based on condition in C#
我正在尝试从某个页面 (this.Page.Controls) 解析我所有控件(例如 ascx 文件)的所有属性,以便获得 属性 的名称例如,我指定的 属性 值 - 值为 "this is my header" 的 属性 的名称是什么? (它很可能是包含此值的文本框)。
下面returns这个错误:
Cannot get inner content of because the contents are not literal.
System.Web.UI.HtmlControls.HtmlContainerControl.get_InnerHtml()
不确定它的含义或如何更正它。
public String searchMethod(List<Control> listOfControls, String searchedValue)
{
String result = "";
foreach (var control in listOfControls)
{
PropertyInfo[] properties = control.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
if (property.PropertyType == typeof (string)) //added condition on this line *******************************
{
if (property.GetValue(control, null) != null)
if (property.GetValue(control, null).ToString().Contains("searched String"))
{
result = result + property.Name + "/" + property.GetValue(control, null) + "/";
}
}
}
}
return result;
}
我想它卡在了一个不符合要求的 属性 上,那么为什么它不直接移动到下一个直到找到一个合适的?
显然,卡住的 属性 是 System.String Inner.Html
PS。我已经测试了提供给该方法的 listOfControls,它正在正确生成
稍后更新:
我正在尝试的另一种方法是:
public string Method1(List<Control> controlList, string propName)
{
string result = "";
foreach (var control in controlList)
{
foreach(var prop in control.GetType().GetProperties())
{
if(prop.PropertyType == typeof(string))
{
if((prop.GetValue(control,null).GetType()) == typeof(string))
if (prop.GetValue(control, null).ToString().Contains(propName))
result += prop.Name + "######";
}
}
}
return result;
}
但是有了这个我得到了未设置到对象实例的对象引用。在线 if((prop.GetValue(control,null).GetType()) == typeof(string))
这是 HtmlContainerControl.InnerHtml
的记录行为 - 在 "exceptions" 部分,记录在案如果:
它将抛出 HttpException
There is more than one HTML server control.
- or -
The HTML server control is not a System.Web.UI.LiteralControl or a System.Web.UI.DataBoundLiteralControl.
您的情况听起来像是后一种情况。代码没有 "move on" 因为异常被抛出但没有被捕获。
老实说,我建议您对检查的控件类型更加挑剔,我可能会使用特定的属性而不是仅仅调用 ToString()
.
如果控件中有控件,您将收到该错误。您是否需要搜索可能在列表中的控件内部的控件?如果是这样,您需要使用递归并继续向下钻取控件(以及其中的任何控件)并且只检查 InnerHtml
不包含其他控件的控件。
您还可以稍微简化一下,只检查 property.PropertyType == typeof(string)
时的值。您还可以将搜索限制为仅两个属性 - Text
和 InnerHtml
(如果适用)。
我正在尝试从某个页面 (this.Page.Controls) 解析我所有控件(例如 ascx 文件)的所有属性,以便获得 属性 的名称例如,我指定的 属性 值 - 值为 "this is my header" 的 属性 的名称是什么? (它很可能是包含此值的文本框)。
下面returns这个错误:
Cannot get inner content of because the contents are not literal. System.Web.UI.HtmlControls.HtmlContainerControl.get_InnerHtml()
不确定它的含义或如何更正它。
public String searchMethod(List<Control> listOfControls, String searchedValue)
{
String result = "";
foreach (var control in listOfControls)
{
PropertyInfo[] properties = control.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
if (property.PropertyType == typeof (string)) //added condition on this line *******************************
{
if (property.GetValue(control, null) != null)
if (property.GetValue(control, null).ToString().Contains("searched String"))
{
result = result + property.Name + "/" + property.GetValue(control, null) + "/";
}
}
}
}
return result;
}
我想它卡在了一个不符合要求的 属性 上,那么为什么它不直接移动到下一个直到找到一个合适的?
显然,卡住的 属性 是 System.String Inner.Html
PS。我已经测试了提供给该方法的 listOfControls,它正在正确生成
稍后更新: 我正在尝试的另一种方法是:
public string Method1(List<Control> controlList, string propName)
{
string result = "";
foreach (var control in controlList)
{
foreach(var prop in control.GetType().GetProperties())
{
if(prop.PropertyType == typeof(string))
{
if((prop.GetValue(control,null).GetType()) == typeof(string))
if (prop.GetValue(control, null).ToString().Contains(propName))
result += prop.Name + "######";
}
}
}
return result;
}
但是有了这个我得到了未设置到对象实例的对象引用。在线 if((prop.GetValue(control,null).GetType()) == typeof(string))
这是 HtmlContainerControl.InnerHtml
的记录行为 - 在 "exceptions" 部分,记录在案如果:
HttpException
There is more than one HTML server control.
- or -
The HTML server control is not a System.Web.UI.LiteralControl or a System.Web.UI.DataBoundLiteralControl.
您的情况听起来像是后一种情况。代码没有 "move on" 因为异常被抛出但没有被捕获。
老实说,我建议您对检查的控件类型更加挑剔,我可能会使用特定的属性而不是仅仅调用 ToString()
.
如果控件中有控件,您将收到该错误。您是否需要搜索可能在列表中的控件内部的控件?如果是这样,您需要使用递归并继续向下钻取控件(以及其中的任何控件)并且只检查 InnerHtml
不包含其他控件的控件。
您还可以稍微简化一下,只检查 property.PropertyType == typeof(string)
时的值。您还可以将搜索限制为仅两个属性 - Text
和 InnerHtml
(如果适用)。