Ich versuche, alle Eigenschaften aller meiner Steuerelemente (zum Beispiel ascx-Dateien) von einer bestimmten Seite (this.Page.Controls) zu analysieren, um den Namen von zu erhalten die Eigenschaft, die einen von mir angegebenen Eigenschaftswert hat - wie lautet der Name der Eigenschaft, die den Wert "this is my header" hat? (Es kann sehr gut eine Textbox sein, die diesen Wert enthält).Liste aller Eigenschaftsnamen von Steuerelementen basierend auf Bedingung in C#
Die unten gibt diesen Fehler zurück:
Cannot get inner content of because the contents are not literal. System.Web.UI.HtmlControls.HtmlContainerControl.get_InnerHtml()
nicht sicher, was es bedeutet, oder wie es zu korrigieren.
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;
}
Ich nehme an, es auf einem Grundstück festsitzt, die die Anforderungen nicht entsprechen, also warum es nicht einfach zum nächsten weiterziehen, bis es eine gute Passform findet? Anscheinend ist die Eigenschaft, die es stecken bleibt, ein System.String Inner.Html
PS. Ich habe die listOfControls dem Verfahren zugeführt getestet und es ist richtig
Später Aktualisieren erzeugt wird: Eine andere Methode, die ich versucht bin, ist:
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;
}
aber mit diesem i Objektverweis nicht auf eine Instanz von bekommen ein Objekt. on line if((prop.GetValue(control,null).GetType()) == typeof(string))
Danke Jon Skeet! Ich habe versucht, Ihren Ratschlag anzuwenden, und habe mir zwei Versionen ausgedacht, mit denen ich meine erste Frage beantwortet habe. Irgendwelche Gedanken? Die zweite Version scheint viel einfacher und sauberer zu sein, wirft aber einen Fehler auf ... schließlich. Ich bin nicht geschickt mit der Syntax. – Halle
@Halle: Nun, das wird fehlschlagen, wenn die Eigenschaft null zurückgibt. Aber es ist unnötig - wenn der Eigenschaftstyp "string" ist, kann er nichts anderes als "string" oder eine Nullreferenz zurückgeben. Noch wichtiger ist, dass Sie immer noch nach dem Wert der gleichen Eigenschaft fragen, die das ursprüngliche Problem verursacht hat. –
@Halle: Wenn die Eigenschaft null zurückgibt, rufen Sie 'GetType()' auf einer Nullreferenz auf - bang. Die Eigenschaft, die das Problem verursacht hat ('HtmlContainer.InnerHtml'), ist nicht" verschiedener Typen "- sie hat den Typ string. Im Grunde genommen vermeidet Ihre Änderung das ursprüngliche Problem nicht, soweit ich sehen kann. –