ASP.NET

Mit ParseControl Steuerelemente dynamisch zur Laufzeit erzeugen

Erstellung eines Seitennavigators mit dem StringBuilder

Aufgrund des aktuell recht miesen Ladeverhaltens der auf zerbit.de bislang verwendeten live-Searchbox für die Suche in diesem Web, habe ich mich entschlossen BOSS (Build your own Search Engine) von Yahoo einmal auszuprobieren. Schön an dieser Lösung ist, daß man die Suchergebnisse über eine API im XML-Format abrufen und sie dann nahtlos in das Layout der eigenen Seite integrieren kann.

Notwendig war in diesem Zusammenhang natürlich auch ein Seiten-Navigator, wie man ihn auf Suchergebnisseiten gewohnt ist. Je nachdem wieviele Gesamttreffer eine Suche ergibt und wieviele Treffer auf einer Seite dargestellt werden, sollten unterschiedlich viele Seiten-Links (dargestellt als kleine Buttons) im Navigator enthalten sein, jedoch maximal 15 um einzeilig zu bleiben. Bei der Anzeige einer Seite größer als 15, sollte der Navigator "nach rechts rollen", d.h. der erste darzustellende Seiten-Link sollte sich um eins verschieben, bis die maximale Anzahl an Seiten erreicht ist.

Möglichkeiten

Eine mögliche Lösung für die Implementierung des Navigators wären statische Hyperlink-Controls gewesen, die in Abhängigkeit der anzuzeigenden Trefferseite ihren Text und ihren Link ändern, aber damit wäre die maximale Anzahl an Seitenlinks per Code auf 15 zementiert und wenig Raum für eine schnelle Anpassung, wenn es dann doch einmal mehr sein sollten. Die größte Flexibilität wäre erreicht, wenn man in der web-config definieren könnte, wie "breit" der Navigator sein soll und der Code dies dynamisch in HTML umsetzt.

Für dieses Problem bietet ASP.NET über die Methode Controls.Add die Möglichkeit zur Laufzeit Steuerelemente in einen beliebigen Container einzufügen, wie unter anderem Uwe Grone in seinem MSDN Solve Artikel beschreibt.

  Dim lnk As HyperLink = New HyperLink()
  lnk.Text = "..."
  lnk.NavigateUrl = "..."
  Me.Panel1.Controls.Add(lnk)

Dieser Ansatz hat allerdings den Haken, dass das Hyperlink-Control keinen Konstruktor bietet, mit dem man die notwendigen Attribute direkt übergeben kann. Bei einer nicht bekannten Anzahl an zu erzeugenden Controls kommt da recht viel Code zustande, vor allem, wenn man zwei Navigatoren braucht: einen oben auf der Seite und den anderen unten.

Das weit aus Beste wäre, schlicht puren HTML-Code als Text in einer Schleife zu erzeugen und diesen dann in den Container zu "injizieren". Man hätte die größtmögliche Kontrolle über die Ausgabe und könnte den HTML-Code mehrmals verwenden.

ParseControl

Auch dafür bietet ASP.NET eine Lösung. Eine recht unscheinbare, aber wenn man genauer darüber nachdenkt, wohl eine der mächtigsten Methoden bei der Erstellung von HTML-Code: ParseControl. Sie ist in der Lage zur Laufzeit aus übergebenem Markup Steuerelemente zu erstellen. Dies funktioniert nicht nur mit simplen HTML-Controls, sondern ebenfalls mit WebServer- und anderen Controls. Abgeleitet von TemplateControl steht ParseControl in allen UserControls und vor allem im Page-Objekt zur Verfügung und stellt eine Art Control-Evaluator dar.

Der Seitennavigator

Mit dieser Methode ist die Erstellung des dynamischen Seitennavigators ein Kinderspiel. Zur Erstellung des Navigator-Control-Strings, den ParseControl auswerten soll, sind zuvor allerdings ein paar Berechnungen notwendig.

Zunächst wird die Gesamtzahl der Treffer benötigt, die Yahoo BOSS im XML mitliefert: intTotalHits. Die maximale Anzahl an Suchtreffern pro Seite (intMaxHitsPerPage) und die maximale Anzahl der Seiten-Links im Navigator (intMaxPages) wird aus der web.config ausgelesen. Um die erste und die letzte anzuzeigende Seite im Navigator zu bestimmen, müssen die Rotationspunkte errechnet werden, sprich ab welcher Seite verschiebt sich die erste Seite um eins (intRotationLeft) und wann hört die Verschiebung auf (intRotationRight).

Mit Übergabe der anzuzeigenden Trefferseite (intPage) sieht die Berechnung dann wie folgt aus:

   Dim intTotalHits As Integer = (... aus Yahoo-BOSS-XML)
   Dim intMaxHitsPerPage As Integer = (...aus web-config)
   Dim intMaxPages As Integer = (...aus web-config)
   Dim intPage As Integer = (... aus Request.QueryString)

   'Gesamtseitenzahl ermitteln
   Dim intTotalPages As Integer = intTotalHits \ intMaxHitsPerPage
   If intTotalHits Mod intMaxHitsPerPage > 0 Then intTotalPages += 1

   'Erste und letzte Seite im Navigator errechnen
   Dim intFirstPage As Integer = 1
   Dim intLastPage As Integer = intMaxPages
   If intMaxPages > intTotalPages Then intLastPage = intTotalPages

   Dim intRotationLeft As Integer = intMaxPages \ 2
   If intMaxPages Mod 2 > 0 Then intRotationLeft += 1

   Dim intRotationRight As Integer = intTotalPages - intRotationLeft - 1

   If intTotalPages > intMaxPages And intPage > intRotationLeft Then
      If intPage <= intRotationRight Then
         intFirstPage = intPage - intRotationLeft + 1
      Else
         intFirstPage = intTotalPages - intMaxPages + 1
      End If

      If intPage <= intRotationRight Then
         intLastPage = intFirstPage + intMaxPages - 1
      Else
         intLastPage = intTotalPages
      End If

   End If

Der Rest ist ein simples Zusammenstellen eines Strings aus A-Elementen und einem STRONG-Element mittels des StringBuilders...

   Dim stbNav As New StringBuilder
   Dim strPage As String = ResolveClientUrl("~/search.aspx?s=" & strSearchString)

   'eine Seite zurück
   If intPage > 1 Then
      stbNav.Append("<a href=""" & strPage & "&page=" & intPage - 1 & """>zurück</a>")
   End If

   'Seiten bis aktuelle
   For i As Integer = intFirstPage To intPage - 1
      stbNav.Append("<a href=""" & strPage & "&page=" & i & """>" & i & "</a>")
   Next

   'aktuelle Seite
   stbNav.Append("<strong>" & intPage & "</strong>")

   'Seiten ab aktueller
   For i As Integer = intPage + 1 To intMaxPages
      stbNav.Append("<a href=""" & strPage & "&page=" & i & """>" & i & "</a>")
   Next

   'eine Seite vor
   If intPage < intLastPage Then
      stbNav.Append("<a href=""" & strPage & "&page=" & intPage + 1 & """>weiter</a>")
   End If

... und die Ausgabe des Strings über ParseControl in je einen Panel-Container am Anfang und am Ende der Seite.

   'Navigator in Container einfügen
   Me.panNavTop.Controls.Add(ParseControl(stbNav.ToString))
   Me.panNavBottom.Controls.Add(ParseControl(stbNav.ToString))

Fazit

Anhand dieses Beispiels kann man sich vorstellen, wie schnell und einfach man über ParseControl Seiten dynamisch generieren kann. Machbar wären so zum Beispiel auch komplett aus Datenbanken heraus erzeugte Web-Seiten.


kick it on dotnet-kicks.de
kick it on dotnet-kicks.de AddThis 0 wikio-Stimme(n) Trackback-Url...

152 Kommentare bislang...

  • air max 90 pas cher Cette fois, l'ancienne route des étoiles, dans lequel le territoire du clan tigre blanc, l'original de la famille Blanc hausse Tiger, la transformation d'une opportunité, mais le fait est à l'opposé.

    La famille White Tiger n'ont tout simplement pas été en mesure de rivaliser avec les forces mondiales du capital, même si seulement quelques contradictions internes Yaozu existent, il est presque blanc de la famille tigre commencer une certaine tendance aux abois.

    Dans tous les cas, la famille tigre blanc est Yaozu entre la force dominante de cinq d'entre eux, le clan du Dragon, la famille basaltique beaucoup, le méchant géant Yaozu White Tiger famille de agressif, mais pas osé provoquer le tigre blanc vraie famille la colère.

    En vertu de l'enchevêtrement des diverses contradictions entre la famille tigre blanc avec ces tyrannique Yaozu doit trouver un endroit pour être en mesure d'atteindre le tampon, tandis que le blanc petite existent naturellement devenu le meilleur choix pour résoudre ce problème.

    Peu importe quand et où tout mariage monde politique ne sera jamais en mesure d'éviter une présence, même si vous êtes un immortel.

    Beauté blanc d'un Yaozu petite qui est bien connu, et même les noms de la plus éblouissante que sa mère, qui a conduit à l'Yaozu parmi les jeunes entre les grandes puissances en concurrence avec l'autre, à l'ère de l'ancien et le nouveau transfert de ces les jeunes dans leurs forces respectives étaient de puissance de plus en plus, et de la famille White Tiger, le mariage, la beauté et de puissants alliés, ainsi que des avantages sans fin sera dans ses mains.

    Famille Dragon vert de l'arbre généalogique tour basaltique normalisée, le lion d'or de la famille Helian invincibilité de nombreux jeunes Yaozu forte folle recueillies sur le territoire du clan tigre blanc qui.

    Ces jeunes gens, représentant non seulement de leurs propres aspirations, ce sont ces gens derrière les discours puissantes forces, même si elle est commune pour les blancs tigre alliés du clan veulent remettre la famille White Tiger ensemble concurrencer pour les adversaires.

    Petit mariage blanc, a été placé dans une famille tigre blanc de table de procédure, petit père, bien que co?teux pour une famille de long, mais dans de telles circonstances, le mariage de la petite blanche ne peut pas faire des changements et des décisions parce que c'est la tendance générale.
    152
    air max 90 pas cher : Montag, 7. Mai 2012 03:10
  • We all know what arrives going to females who suit on the famed red-colored lacquered individual shoes. They are immediately filled using a wicked perception of alluring do it yourself and fall hopelessly in adore with its creator: the superb shoe custom made CHRISTIAN lOUBOUTIN SHOES.


    Where To Buy CHRISTIAN lOUBOUTIN shoes assisted accompany stilettos aback into appears within 1990s and 2000s, developing dozens of variations with heel heights of 120mm (4.72 inches) and higher.


    Christian Louboutin shoes are well-known using the red-colored sole,high quality,unique design and design as well as many female hollywood stars will choose them once they show up at some really important event and stroll within red-colored carpet.


    Christian Louboutin Balota are made in accordance with Somatology to comfortably suit everyone's feet. which means you won't be worried about suffering in the direction of beautiful.The designer's ethos can be to "make shoes which could be like jewels" and each and every special design and design demonstrates unparalleled best quality and an innate sultriness.
    151
    Where To Buy CHRISTIAN lOUBOUTIN : Sonntag, 29. April 2012 03:20

  • It is only 40 years Cheap Football boots that Nike become the biggest sport manufactor. From first pair of Nike Air shoes, Nike manufactures a lot of advanced products in different area. In 2010, a upsurge set off Nike Soccer Cleats in World Cup, after debut with pro players - Nike Mercurial Vapor 4, which sales exceed Adidas football shoes at same time. Even though Nike has not been involved in soccer for as long as other soccer shoes manufacturers like Adidas, and Puma, their technology has caught up fast. Nike's commitment to improving soccer shoes and their Nike Mercurial Vapor Superfly III FG technology, has placed them right up there with the other leading manufacturers. From first pair of world-class football shoe become popular in the world, Nike as a new star in Nike CTR360 II ELITE football area can not stopping running. From nike Mercurial Talaria to Nike Mercurial Vapors, tneir philosophy is to continue to improve what they offer. The image of best Adidas soccer shoes has always affect Adidas adiPower Predator consumer attitudes. With long history, Adidas always imporve their football shoes no matter from materials to lacing system. However, as the biggest competitor of Adidas soccer shoes, Nike has always improved their soccer Adidas F50 adizero miCoach shoes also. As soon as new Nike Mercurial Vapor 4 appeared in the market, people shocked by its styles and function. Nike always changes their styles in new products. The same as Nike Mercurial Vapor, at first glance, you Cheap Soccer Cleats will appreciate its wonderful colors.
    150
    Cheap Football boots : Freitag, 27. April 2012 01:31
  • Cheap louis vuitton uk wholesale offers a variety of options to satisfy your needs. Some new ones even has fashionable styles fold over flap to disguise the snap closure and a draw string is added for a convenient closure.Certainly, nobody would argue, simply because several long-time wallet customers can agree with the fact, louis vuitton bags for sale delivers some thing now we have consistently yearned with regard to,as well as which usually we tend to despite the fact.louis vuitton bags uk. If you need to be stylish but want to save your professional look you can use tote bags. Bag is something that many girls select because of its ability to add sophistication and style to any outfit. Louis Vuitton Purse Buy Online. Louis Vuitton Purses Patent Leather. For over 50 years Chanel purses have represented luxury and fashion and are timeless. A Chanel handbag can also be considered an asset and is something that can be handed over to future generations.<br/>
    149
    louis vuitton uk : Samstag, 14. April 2012 12:05
  • On the date when the louis vuitton uk on sale, all people will pour into the stores. At this time, it on the booths will be wiped out, and only one or two days the seller will declare that there is no stock anymore.The conventional louis vuitton handbags are produced for qualified females in add-on to university college students for there are so various styles and styles.The women and females is the louis vuitton handbags uk enthusiasts of gorgeous along with gleaming jewelry. Tiffany-Jewelry stands out as the representative of jewelry so it provides a very good fame as well as good reputation.<br/>
    148
    louis vuitton handbags : Samstag, 14. April 2012 11:47

Dein Kommentar hierzu...


Kommentar-Feed für diesen Beitrag
Gravatare werden unterstützt .:. eMail-Adressen werden nicht veröffentlicht
 

RSS-Feed

Die URL des Standard-Newsfeed von zerbit.de lautet:

http://www.zerbit.de/rssfeed.aspx

Login


 

 

Statistik



kürzlich kommentiert

Artikel 269

  • Datum: 15.09.2008
    Kategorie: ASP.NET
    Zugriffe: 5.150
    Kommentare: 152
    Trackbacks: 0

Letzte Beiträge

Kategorien

Buttons & More

Blog-Roll

Banner Piraten-Partei