none
Bestimmte Controls finden (ohne ID!) RRS feed

  • 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

    Dienstag, 20. Januar 2015 22:03

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


    Mittwoch, 21. Januar 2015 15:42
    Moderator
  • 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 ;-)

    Ergebnis der Suche nach bestimmten Typen von Controls

    Gruß
    Andy

    Samstag, 24. Januar 2015 18:20

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

    Dienstag, 20. Januar 2015 23:04
  • Hallo Andy,

    schau dir mal HttpContext.RewritePath Methode an.

    MFG

    Björn

    Mittwoch, 21. Januar 2015 15:30
  • 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


    Mittwoch, 21. Januar 2015 15:42
    Moderator
  • 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

    Donnerstag, 22. Januar 2015 14:36
  • 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

    Freitag, 23. Januar 2015 08:57
  • 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 ;-)

    Ergebnis der Suche nach bestimmten Typen von Controls

    Gruß
    Andy

    Samstag, 24. Januar 2015 18:20