根据C#中的条件列出控件的所有属性名称

时间:2016-04-25 18:21:55

标签: c# user-controls controls propertyinfo

我试图从某个页面(this.Page.Controls)解析所有控件(例如ascx文件)的所有属性,以获取具有我指定的属性值的属性的名称,例如 - 具有值“this is my header”的属性的名称是什么? (它可能是包含此值的文本框)。

以下内容会返回此错误:

  

无法获取内容,因为内容不是文字。     System.Web.UI.HtmlControls.HtmlContainerControl.get_InnerHtml()

不确定它的意义或如何纠正它。

public function Empenhos(Request $request)
{
    $query = DB::table('empenho as emp')
            ->select('emp.nrEmpenho as a',DB::raw("DATE_FORMAT(emp.date, '%d/%m/%Y') as b"))
            ->orderby('emp.nrEmpenho');

    if ($request->dateini) $query->where('emp.date', '>=', $request->dateini);
    if ($request->datefim) $query->where('emp.date', '>=', $request->dateini)
            ->where('emp.date', '<=', $request->datefim);

    $table = $query->paginate($request->perPage ? $request->perPage : 20);

    $header = ['Numero', 'Data', 'Tipo', 'Credor', 'Ficha', 'Fonte', 'Valor'];

    return view('results.planejamento.empenhos',
            ['perPage' => $request->perPage, 'title' => $this->title,
                'title2' => $this->title2[6], 'header' => $header, 'table' => $table, 'return' => 'Empenhos']);
}

我认为它停留在一个与要求不匹配的属性上,为什么它不会简单地移动到下一个,直到找到一个合适的? 显然,被卡住的财产是 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; }

PS。我已经测试了送到方法的listOfControls并且它正在正确生成

稍后更新: 我正在尝试的另一种方法是:

System.String Inner.Html

但是我得到的Object引用没有设置为对象的实例。在线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; }

2 个答案:

答案 0 :(得分:1)

这是HtmlContainerControl.InnerHtml的记录行为 - 在“例外”部分中,记录了它会抛出HttpException如果:

  

有多个HTML服务器控件    - 或 -
  HTML服务器控件不是System.Web.UI.LiteralControl或System.Web.UI.DataBoundLiteralControl。

听起来后一种情况正在你的情况下发生。该代码不会“继续”,因为抛出异常但未被捕获。

老实说,我建议您对所检查的控件类型有点挑剔,我可能会使用特定属性而不是只调用ToString()

答案 1 :(得分:0)

如果控件内部有控件,您将收到该错误。您是否需要搜索可能位于列表中控件内部的控件?如果是这样,您需要使用递归并继续向下钻取控件(以及其中的任何控件),并仅检查不包含其他控件的控件上的InnerHtml

您还可以通过仅在property.PropertyType == typeof(string)时检查值来简化此操作。您也可以将搜索范围限制为仅有两个属性 - TextInnerHtml(如果适用)。