[ASP.NET] HtmlTableCell = String ?

NudelMC

Well-known member
ID: 46722
L
16 Juni 2006
178
5
Hoi
ich hab ne kleine funktion gebaut die den namen der aktuellen Seite ausliest.
Nun möchte ich den entsprechenden td in der navigation in der sich der link zu dieser seite befindet ändern (als aktiv anzeigen)

Die Navigation sieht etwa so aus
<tr>
<td id="seite1" runat="server">Seite1</td>
</tr>
<tr>
<td id="seite2 runat="server">Seite2</td>
</tr>

ich kann nun auf seite2 zu greifen und Css ändern, klar. Das soll nun aber dynmaisch von statten gehen

So ermittel ich den namen der aktuellen seite
PHP:
Dim raw As String = Request.RawUrl
        raw = Replace(raw, "/", "")
        raw = Replace(raw, ".aspx", "")
        Response.Write(raw)

jetzt ist in raw der aktuelle Seitenname gespeichert.
raw.attributes.add("class", "naviaktiv")
funktioniert leider nicht.
Ich denke ich muss raw irgendwie in eine htmltablecell Konvertieren aber ich hab kein Plan wie :(

Jemand ne idee?

Danke
Nudel
 
Huhu,

wie immer gibt es viele unterschiedliche Arten, deine Problemstellung zu lösen =). Erst einmal kann ich dir nur empfehlen, statt der HtmlControls die WebControls zu verwenden. Wahrscheinlich wäre es dir dann leichter gefallen.

Ich denke du tust dir noch ein wenig schwer mit der Objektorientierung. Warum funktioniert raw.attributes.add("class", "naviaktiv") nicht? Ganz einfach: raw ist vom Typ String, und String bietet die Property attributes nicht.

Um nun eine der Zellen als Aktiv markieren zu können musst du wissen, welche den Link enthält, der deiner aktuellen Url entspricht. Du kannst dafür entweder über die Controls iterieren (ist nicht ganz so einfach), oder aber direkt deine Links abfragen. Leider kann ich dir nur für den zweiten Vorschlag Code zur Verfügung stellen, da die Navigation in deinem Beispiel nicht komplett ist.
PHP:
        Select Case raw
            Case "page1"
                seite1.Attributes.Add("class", "naviaktiv")
                seite2.Attributes.Add("class", "")
            Case "page2"
                seite2.Attributes.Add("class", "naviaktiv")
                seite1.Attributes.Add("class", "")
        End Select
Vergiss nicht, der alten aktiven HtmlTableCell die naviaktiv-Klasse zu entziehen, da sie sich über den ViewState ihre Klasse merkt. Zumindest ist es bei den WebControls so ;) sollte bei HtmlControls auch so sein.

Ich kann dir allerdings den Code nicht empfehlen, da es weitaus sinnvoller ist, eine Navigation aufgrund Datenbankeinträge oder einem XmlFile (oder weiß ich welcher Datenquelle) aufzubauen. Dann musst du nämlich gar nicht mehr irgendwelche Page-Urls statisch abfragen, sondern kannst die ganze Navigation dynamisch aufbauen.

Ich hoffe das hilft dir wenigstens ein Stück weit =).

Viele Grüße

Cryptkeeper

Edit: Ich les gerade, dass deine Anforderung ja direkt war, dass es dynamisch, also durch das Iterieren über die Elemente, funktioniert. Poste mal bitte den Code deiner kompletten Navigation, dann können wir das da einbauen. Am schönsten wäre es dennoch, die Navigation aus einer Xml aufzubauen. Dann musst du nämlich nicht einmal den HtmlCode für die Navigation fest verdrahten ;o). Ein UseDefined WebControl wäre meiner Meinung nach das Maß aller Dinge.
 
Zuletzt bearbeitet:
Hi erstmal danke für die Antwort.
Die naviagation ist ein Table und in jedem
<tr>
<td></td>
</tr>

Block steht ein Link.
jedes <td> hat als id den Namen der Seite auf das der darinstehen link verweist.

Deshalb wäre es ja super einfach gewesen einfach den aktuellen Seitennamen auszulesen und eben das entsprechende Feld zu markieren :)

gibts da nicht irgendwie ne möglichkeit "so hintenrum" um einfach zu sagen raw.attributes.add etc ?
Durch ne Konvertierung oder so?


EDIT:
Die navigation besteht aus statischen elementen und links, keine Datenbak anbindung, keine xml, keine array schleifen um sie zu erzeugen, nur reines html

Edit2:
PHP:
Dim raw As String = Request.RawUrl
        raw = Replace(raw, "/", "")
        raw = Replace(raw, ".aspx", "")
        Response.Write(raw)

        Dim test As HtmlTableCell = Page.FindControl(raw)
        test.Attributes.Add("test", "test")

mhh das wäre super gwesen, klappt aber net :(
 
Zuletzt bearbeitet:
Genau das was da drin steht wollte ich wissen ;o).
Nein, es gibt keine Möglichkeit String auf HtmlTableCell zu casten - warum auch? Die beiden Sachen haben wirklich nichts miteinander zu tun. Warum möchtest du einem String nen Style hinzufügen? Du möchtest doch, dass die bereits vorhandene HtmlTableCell anders formatiert wird.
Bitte poste mal einen Ausschnitt deiner Navigation mit "Innereien".

Es wäre außerdem einfacher, eine Navigation dynamisch zusammen zubauen, weil du dann genau weißt, was drin steht. So musst du die vorhandene Webseite über den CodeBehind deiner Webseite parsen. Das ist mehr als umständlich für eine solch einfache Navigation.

Edit:
Doch, deine Edit2-Variante funktioniert. Allerdings musst du darauf achten, dass die ID deines HtmlTableCell Controls exakt mit dem ermittelten Dateinamen im Feld raw übereinstimmt.
 
mh bei mir tuts nicht

Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

Line 10:
Line 11: Dim test As HtmlTableCell = Page.FindControl(raw)
Line 12: test.Attributes.Add("class", "naviaktiv")
Line 13:
Line 14:

Navigation sieht so aus ( auszug)

PHP:
<table cellpadding="0" cellspacing="0" border="0">
                            <tr>
                                <td id="default" runat="server"><a href="default.aspx" class="navi">Home</a></td>
                            </tr>
                            <tr>
                                <td><img src="images/pixel_transparent.gif" height="2px" /></td>
                            </tr>
                            <tr>
                                <td id="dekorationen" runat="server"> ><a href="" class="navi" >Dekoration</a></td>
                            </tr>
</table>
 
Okay, ich hab bisher noch nicht kontrolliert, ob deine Funktion wirklich den richtigen Seitennamen ermittelt ;o). Mit einem Replace auf / entfernst du den Slash ja nur - das VirtualDir ist aber noch da. Dein Wert ändert sich von
/WebSite1/Seite1.aspx
in
WebSite1Seite1

Verwende besser diese Funktion:
PHP:
        Dim raw As String = Request.RawUrl
        If raw.IndexOf("/") > -1 Then
            raw = raw.Substring(raw.LastIndexOf("/") + 1)
        End If
        If raw.IndexOf(".") > -1 Then
            raw = raw.Substring(0, raw.IndexOf("."))
        End If

Gute Nacht,

Cryptkeeper
 
Irgendwie glaub ich dir das nicht. Wenn raw der ID exakt entsprechen würde, dann würde es funktionieren! Die NullReferenceException sagt ja nichts anderes aus, als dass FindControl nichts gefunden. Hast du die Funktion von oben mal verwendet?

Ich verwende folgenden Code, und der funktioniert - definitiv.
HTML:
<table cellpadding="0" cellspacing="0" border="0"> 
	<tr> 
		<td id="default" runat="server">
			<a href="default.aspx" class="navi">Home</a>
		</td> 
	</tr> 
	<tr> 
		<td>
			<img src="images/pixel_transparent.gif" height="2px" />
		</td> 
	</tr> 
	<tr> 
		<td id="dekorationen" runat="server">
			><a href="" class="navi" >Dekoration</a>
		</td> 
	</tr> 
</table>

PHP:
        Dim raw As String = Request.RawUrl
        If raw.IndexOf("/") > -1 Then
            raw = raw.Substring(raw.LastIndexOf("/") + 1)
        End If
        If raw.IndexOf(".") > -1 Then
            raw = raw.Substring(0, raw.IndexOf("."))
        End If

        Dim test As HtmlTableCell = Page.FindControl(raw)
        test.Attributes.Add("class", "naviaktiv")
 
WUHU ES GEHT :p

PHP:
        Dim raw As String = Request.RawUrl
        raw = Replace(raw, "/", "")
        raw = Replace(raw, ".aspx", "")
        raw = Trim(raw)

        Dim cell As HtmlTableCell = FindControl(raw)
        If cell Is Nothing Then
            Response.Write("FEHLER")
        Else
            cell.Attributes.Add("class", "naviaktiv")
        End If


ich hab ne masterpage ... fällt mir eben ein, nu gehts, vielen dank