none
ASP.Net Repeater Farben ändern alle x Zeilen RRS feed

  • Frage

  • Hi zusammen, ich habe eine Tabelle an einen ASP.NET Repeater gebunden. Ich zeige hier Wochentage und andere Daten an. Jetzt möchte ich gerne, wenn der Wochentag z.B. ein Sonntag ist, soll die ganze Zeile Farbig markiert werden. Außerdem soll jeweils nach dem Sonntag (oder vor dem Montag) eine grüne Trennlinie eingefügt werden. Könnt ihr mir weiterhelfen wie ich das Umsetze ?

    Dienstag, 27. Februar 2018 06:59

Antworten

  • Hallo Michael,

    da Du im Repeater datensatzorientiert arbeitest, musst Du dir den vorherigen Datensatz bzw. dessen Wochentag oder ein anderes Merkmal, welches dir sagt "Füg eine Linie ein" irgendwo merken und bei einem Wechsel auf einen anderen Wochentag dann die Linie einfügen.

    Dafür kann man bspw. das ItemDataBound Ereignis des Repeaters nutzen.

    Private LastWeekDay As DayOfWeek
    
    Protected Sub <Repeater>_ItemDataBound(ByVal sender As Object, ByVal e As RepeaterItemEventArgs) Handles <Repeater>.ItemDataBound
    
        If e.Item.ItemType <> ListItemType.Item AndAlso e.Item.ItemType <> ListItemType.AlternatingItem Then
            Exit Sub
        End If
    
    Dim CurrentDate As DateTime
        CurrentDate = CType( e.Item.DataItem, <Datentyp> ).Datumsfeld
    Dim CurrentWeekDay As DayOfWeek
        CurrentWeekDay = CurrentDate.DayOfWeek
    
        If Me.LastWeekDay = DayOfWeek.Sunday AndAlso CurrentWeekDay <> DayOfWeek.Sunday Then
            ' --- Linie einfügen
            ...
        End if
    
        Me.LastWeekDay = CurrentWeekDay
    
    End Sub

    Das ist jetzt nur schnell so dahingeschrieben und kann noch Fehler enthalten.

     


    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, 28. Februar 2018 11:02
    Moderator

Alle Antworten

  • Hallo Michael,

    ich nehme an, dein Projekttyp ist ASP.NET (kein Core) WebForms? Ich gehe jetzt zumindest mal davon aus.

    Du hast im Repeater ja Zugriff auf die Datenelemente, in C# bspw. per

    <%# ((Datentyp)Container.DataItem).Eigenschaft %>

    Siehe dazu:

      What's the deal with Databinder.Eval and Container.DataItem?

    D.h. Du solltest hier mit den Daten arbeiten und die Ausgabe mit diesen Datenbindungsausdrücken steuern.

    Du kannst auch eigene Methoden erstellen und diese dann aufrufen, um bspw. die CssClass einer TableRow zu steuern. Irgendwo brauchst Du hierfür dann eine Methode (bspw. in der WebForm selbst oder, hier sinnvoller, eine statische Methode) wie folgt:

    public static String WeekendCssClass( <Datentyp> value )
    {
        if( value == dies || value == jenes ) {
            return "red";
        } else {
            return String.Empty;
        }
    }

    In deiner WebForm kannst Du dann bspw. folgendes schreiben:

    <... CssClass="<%# Klasse.WeekendCssClass( ((Datentyp)Container.DataItem).Wochentag">
       ...
    </...>

    Genauso kannst Du eine Trennzeile einfügen. Die kommt dann in der WebForm immer rein. Um die Linie setzt Du ein PlaceHolder Control uind kontrollierst dessen Visible Eigenschaft über eine separate Methode, die einen Boolean Wert zurückgibt.

    Wenn Du einen Zähler verwenden kannst (also bspw. immer alle sieben Wochentage in der richtigen Reihenfolge in deiner Datenquelle enthalten sind), kannst Du auch:

    Container.DataItemIndex

    verwenden.Siehe dazu:

      Using Container.DataItemIndex property in ASP.Net GridView

     


    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


    Dienstag, 27. Februar 2018 08:40
    Moderator
  • Hallo Stefan, vielen Dank für deine Antwort. Wie kriege ich am besten raus wenn ich mehrere Einträge für Sonntag z.B. habe . Wann weiß ich denn, wenn ich mir mit einer Funktion den Wochentag hole und wenn es ein Sonntag ist ,die Trennlinie anzeigen möchte.  Wenn ich aber nun für Sonntag z.b. mehrere Einträge habe ,wann weiß ich das ich nach dem letzten Eintrag eine Linie anzeigen lassen möchte.
    Mittwoch, 28. Februar 2018 09:27
  • Hallo Michael,

    da Du im Repeater datensatzorientiert arbeitest, musst Du dir den vorherigen Datensatz bzw. dessen Wochentag oder ein anderes Merkmal, welches dir sagt "Füg eine Linie ein" irgendwo merken und bei einem Wechsel auf einen anderen Wochentag dann die Linie einfügen.

    Dafür kann man bspw. das ItemDataBound Ereignis des Repeaters nutzen.

    Private LastWeekDay As DayOfWeek
    
    Protected Sub <Repeater>_ItemDataBound(ByVal sender As Object, ByVal e As RepeaterItemEventArgs) Handles <Repeater>.ItemDataBound
    
        If e.Item.ItemType <> ListItemType.Item AndAlso e.Item.ItemType <> ListItemType.AlternatingItem Then
            Exit Sub
        End If
    
    Dim CurrentDate As DateTime
        CurrentDate = CType( e.Item.DataItem, <Datentyp> ).Datumsfeld
    Dim CurrentWeekDay As DayOfWeek
        CurrentWeekDay = CurrentDate.DayOfWeek
    
        If Me.LastWeekDay = DayOfWeek.Sunday AndAlso CurrentWeekDay <> DayOfWeek.Sunday Then
            ' --- Linie einfügen
            ...
        End if
    
        Me.LastWeekDay = CurrentWeekDay
    
    End Sub

    Das ist jetzt nur schnell so dahingeschrieben und kann noch Fehler enthalten.

     


    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, 28. Februar 2018 11:02
    Moderator
  • Danke schön klappt .
    Geht auch direkt mit einem Funktionsauruf von der HTML Seite
       <asp:Panel ID="Panel1" runat="server" Visible='<%#Show_Trennlinie(DataBinder.Eval(Container, "DataItem.Leistungsdatum"))%>'>
                   <tr><td colspan="8"><hr style="border:solid #ff0000 1px;height:1px;"></td></tr>
                    </asp:Panel>

      

       Select Case testWeekDay
                    Case DayOfWeek.Sunday  'Sonntag

                    Case DayOfWeek.Monday 'Montag
                        If LastWeekDay <> testWeekDay Then
                            sResult = True
                            Me.LastWeekDay = testWeekDay
                        Else
                            sResult = False
                        End If
                    Case 3


                

    Mittwoch, 28. Februar 2018 13:34