Benutzer mit den meisten Antworten
Bestimmte Controls finden (ohne ID!)

Frage
-
Hi,
ich benötige auf einer ASP.NET Seite, eine Möglichkeit, nach einer bestimmten Art von Controls zu suchen.
Zum Beispiel möchte ich eine Liste haben, von allen Controls des Typs Label, oder Image, bzw. Hyperlink, welche sich auf der ganzen Seite befinden.
Ich habe zwar einen Ansatz gefunden, bekomme aber nicht wirklich alles zurück, bzw. manchmal bleibt die Seite einfach "hängen" als würde sie in einer Endlosschleife laufen (http://stackoverflow.com/questions/4955769/better-way-to-find-control-in-asp-net)
Was habe ich vor?
Ich möchte das dynamisch (also unter bestimmten Bedinungen) an allen Hyperlinks (welche intern auf meine Website verweisen) ein Parameter (Eigenschaft NavigateUrl) angehangen wird. Zum Beispiel: "?Parameter1=Test". Aber dazu müsste ich alle Controls vom Typ Hyperlink in der Code-Behind finden.
Aber entweder bekomme ich nur einen Link zurück, oder ich bleibe in einer Endlosschleife hängen.
Kann mir da bitte einer helfen?
Gruß
Andy
Antworten
-
Hallo Andy,
schau mal hier:
http://stackoverflow.com/questions/4955769/better-way-to-find-control-in-asp-net
oder auch:
http://stackoverflow.com/questions/7555209/getting-a-lits-of-all-child-controls-of-a-control-by-type
Da findest Du jeweils ein Beispiel für eine rekursive Suche von Controls in ASP.NET.
Das sollte eigentlich genau das sein, was Du suchst.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Mittwoch, 21. Januar 2015 15:43
- Als Antwort vorgeschlagen Stefan FalzModerator Dienstag, 27. Januar 2015 16:35
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 12. Februar 2015 13:21
-
Guten Abend,
so, ich habe es hinbekommen :-)
Für die, die an einer VB.NET-Lösung interessiert sind:
Folgenden Code legt ihr z.B. in das PageLoad Ereignis:
Dim s As New Stopwatch s.Start() Dim l As List(Of Control) = FindControls(GetType(HyperLink)) s.Stop() Dim Msg As String = "Benötigte Zeit: " & s.ElapsedMilliseconds.ToString & "ms (" & s.ElapsedTicks.ToString & " Ticks)" & vbCrLf For Each rs As HyperLink In l Msg += rs.ID & vbCrLf rs.NavigateUrl += "?Test=TRUE" Next MsgBox(Msg, MsgBoxStyle.Information, "Ergebnis der Suche")
Dann braucht ihr noch die Funktion selbst:
Private Function FindControls(t As Type, Optional StartControl As Control = Nothing) As List(Of Control) Dim Result As New List(Of Control) ' Wenn kein StartControl übergeben wurde, beginnen wir ganz vorne. If IsNothing(StartControl) Then StartControl = Me For Each ChildControl As Control In StartControl.Controls If ChildControl.[GetType]() = t Then ' Treffer, dieses Control in die Liste mit aufnehmen. Result.Add(ChildControl) End If If ChildControl.HasControls Then ' Alle untergeordneten Controls durchgehen. For Each rs In FindControls(t, ChildControl) Result.Add(rs) Next End If Next Return Result End Function
Und das ist das Ergebnis ;-)
Gruß
Andy- Als Antwort vorgeschlagen Stefan FalzModerator Dienstag, 27. Januar 2015 16:35
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 12. Februar 2015 13:21
Alle Antworten
-
Hallo,
ich vermute mal, dass du mit den klassischen ASP.NET Forms arbeitest. Da du einen C# Lösungsansatz gepostet hast, gehe ich auch mal davon aus, dass du an einer Serverseitigen Lösung interessiert bist.Grundsätzlich würde ich dir empfehlen den Debugger an der Server anzuhängen und wenn die Seite mal nicht lädt, kannst du den Debugger anhalten und gucken warum es in einer Dauerschleife endet. Grundsätzlich hätte ich dir jetzt auch nichts anderes als eine rekursive Iterator-Methode vorgeschlagen.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
-
Hallo Andy,
schau mal hier:
http://stackoverflow.com/questions/4955769/better-way-to-find-control-in-asp-net
oder auch:
http://stackoverflow.com/questions/7555209/getting-a-lits-of-all-child-controls-of-a-control-by-type
Da findest Du jeweils ein Beispiel für eine rekursive Suche von Controls in ASP.NET.
Das sollte eigentlich genau das sein, was Du suchst.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Mittwoch, 21. Januar 2015 15:43
- Als Antwort vorgeschlagen Stefan FalzModerator Dienstag, 27. Januar 2015 16:35
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 12. Februar 2015 13:21
-
Hi,
dann muss ich das nochmal ausprobieren. Bin gerade leider mit anderen Sachen sehr beschäftigt. Ich werde versuchen das morgen hinzubekommen und gebe ich mal eine Rückmeldung.
Der Debugger ist übrigens immer an einen Punkt gewesen, wo es nichts zum anzeigen gab wenn ich die Anwendung angehalten habe.
Gruß
Andy -
Hi,
ich habe mich jetzt nochmal mit dem Thema befasst und so langsam glaube ich, dass es ein Problem ist mit VB.NET. Ich habe zwar den Code-Schnipsel von C# genommen, ihn aber nach VB.NET übersetzt. Naja, allerdings gab es immer wieder mal Probleme mit der Übersetzung.
Kann es sein das es so unter VB.NET nicht möglich ist und hier C# im Vorteil ist? Wenn ja dann bleibt mir wohl nichts weiter übrig als mir eine Mini-DLL unter C# zu erstellen.
Gruß
Andy -
Guten Abend,
so, ich habe es hinbekommen :-)
Für die, die an einer VB.NET-Lösung interessiert sind:
Folgenden Code legt ihr z.B. in das PageLoad Ereignis:
Dim s As New Stopwatch s.Start() Dim l As List(Of Control) = FindControls(GetType(HyperLink)) s.Stop() Dim Msg As String = "Benötigte Zeit: " & s.ElapsedMilliseconds.ToString & "ms (" & s.ElapsedTicks.ToString & " Ticks)" & vbCrLf For Each rs As HyperLink In l Msg += rs.ID & vbCrLf rs.NavigateUrl += "?Test=TRUE" Next MsgBox(Msg, MsgBoxStyle.Information, "Ergebnis der Suche")
Dann braucht ihr noch die Funktion selbst:
Private Function FindControls(t As Type, Optional StartControl As Control = Nothing) As List(Of Control) Dim Result As New List(Of Control) ' Wenn kein StartControl übergeben wurde, beginnen wir ganz vorne. If IsNothing(StartControl) Then StartControl = Me For Each ChildControl As Control In StartControl.Controls If ChildControl.[GetType]() = t Then ' Treffer, dieses Control in die Liste mit aufnehmen. Result.Add(ChildControl) End If If ChildControl.HasControls Then ' Alle untergeordneten Controls durchgehen. For Each rs In FindControls(t, ChildControl) Result.Add(rs) Next End If Next Return Result End Function
Und das ist das Ergebnis ;-)
Gruß
Andy- Als Antwort vorgeschlagen Stefan FalzModerator Dienstag, 27. Januar 2015 16:35
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 12. Februar 2015 13:21