Um ein Steuerelement auf Ihrer Seite zu finden, hat es eine Server-Kontrolle, wie folgt aus:
<asp:Table runat="server">
...
</asp:Table>
Regular HTML auf der Seite sind nicht „Kontrollen“, sind sie nur Text das wird an den Browser gesendet. Serversteuerelemente sind dagegen tatsächliche .NET-Klassen, die mit dem Codebehind interagieren können.
Sie können immer noch ein Handle für dieses Steuerelement ohne ID erhalten, indem Sie die Controls-Auflistung des Containers durchsuchen oder die Seite rekursiv durchsuchen. Beginnen wir mit der rekursiven Suche in der Controls-Auflistung:
Die Controls-Auflistung bezieht sich nur auf sofortige untergeordnete Steuerelemente eines bestimmten Steuerelements. Oder direkte untergeordnete Steuerelemente einer Seite. Jene Kontrollen der Reihe nach haben Kindkontrollen von ihren Selbst. Es repräsentiert einen Baum im Speicher.
ist hier ein Verfahren, den Baum von einem bestimmten Steuerelement rekursiv und die Kontrolle von ID zu finden:
private Control FindControlRecursive(Control control, string id)
{
Control returnControl = control.FindControl(id);
if (returnControl == null)
{
foreach (Control child in control.Controls)
{
returnControl = child.FindControlRecursive(id);
if (returnControl != null && returnControl.ID == id)
{
return returnControl;
}
}
}
return returnControl;
}
(über den Rahmen dieser Antwort, wird dies als extension method-besser gemacht).
Um eine Kontrolle durch etwas anderes als seine ID zu finden, können Sie nach Typ:
if(someControl is System.Web.UI.WebControls.Table)
Beachten Sie, dass dies in der Regel nicht eine sehr gute Idee. Es ist kein großartiges Muster, wenn Sie auf diese Weise nach Steuerelementen suchen müssen - Sie sollten eine ID für Ihr Steuerelement haben, oder Sie sollten bereits einen Verweis darauf haben, weil es im Code erstellt wurde.
Allerdings ist es einfach, die Methode zu ändern rekursiv für einen Typ suchen:
private Control FindControl<T>(Control startFrom)
{
foreach(Control child in startFrom.Controls)
{
if(child.GetType().IsAssignableFrom(typeof(T)))
{
return child;
}
else
{
return FindControl<T>(child);
}
}
return null;
}
Sie nicht auf jeden Fall tun:
private Control FindTable(Control startFrom)
{
foreach(Control child in startFrom.Controls)
{
if(child is System.Web.UI.WebControls.Table)
{
return child;
}
else
{
return FindTable(child);
}
}
return null;
}
Sie auch eine generische Form dieses Verfahrens haben könnte Ich möchte System.Windows.Forms einbeziehen, da dies einfach den gesamten Code für eine WinForms-Anwendung enthält. Aus diesem Grund hat Visual Studio es in einem Webprojekt nicht für Sie bereitgestellt - Sie werden es nie brauchen. System.Web.UI hat alles für Web-Steuerelemente.
Ich glaube, ich verstehe nicht wirklich - auf welchen Teil der Seite Lebenszyklus werden Sie eine Anfrage Server-Seite für DOM, die Client-Seite geladen wird machen? –
Der Datensatz wird in einem Baum angezeigt, der viel zu groß ist, um auf einmal geladen zu werden. Daher lade ich jeden Knoten im laufenden Betrieb, wenn der Benutzer ihn erweitert. – Praesagus