none
GridView - TemplateField abhängig vom Inhalt formatieren RRS feed

  • Frage

  • Hallo,
    könnte mir evtl. jemand einen Tipp geben, wie ich obiges bewerkstelligen kann?

    <asp:TemplateField HeaderText="Status" HeaderStyle-CssClass="text-center table-header" SortExpression="MA_STATUS" ItemStyle-Width="80px">
    	<ItemTemplate>
    		<asp:Label runat="server" Text='<%# Eval("MA_STATUS")%>' />
    	</ItemTemplate>
    	<EditItemTemplate>
    		<asp:DropDownList ID="MASTATUS_ID" runat="server" DataSourceID="sqlMASTATUS" SelectedValue='<%# Bind("MASTATUS_ID") %>' DataTextField="MASTATUS_TXT" DataValueField="MASTATUS_ID" CssClass=" form-control label-warning dropdown" />
    	</EditItemTemplate>
    </asp:TemplateField>
    
    Das Label-Element soll je nach Inhalt formatiert werden.
    Ich denke, dass ich es über das RowCreated-Ereignis machen muss, weiß aber ehrlich gesagt nicht, wie ich auf den Inhalt des LabelControls zugreifen kann.


    Viele Grüße, Volker

    Mittwoch, 19. Oktober 2016 09:58

Antworten

  • Hallo Volker,

    vorab ein Tipp: In den allermeisten Fällen sollte man für das Auslesen von Inhalten nicht auf die Controls der Row zugreifen, sondern sich des DataItem bedienen. Das stellt die eigentliche Datenquelle für die Zeile dar. Wenn Du lediglich Zugriff auf die Daten brauchst, reicht das völlig.

    Protected Sub GridView_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) 'Handles <DeinGridView>.RowDataBound
    
        If e.Row.RowType <> DataControlRowType.DataRow Then
            Exit Sub
        End If
    
    Dim CurrentData As DataRowView
        CurrentData = CType( e.Row.DataItem, DataRowView )
    
    Dim Value As String = CurrentData( "<DeinFeldname>" )
            
        If Value = "1" Then
            e.Row.CssClass &= " Marker"
        End If
    
    End Sub

    Damit würdest Du bspw. dem <tr> Tag, das zum <td> Tag mit deinem Label gehört, eine CSS Klasse zuweisen.

    In meinem Beispiel ist e.Row.DataItem eine Instanz von DataRowView, da ich eine DataTable als Datenquelle für das GridView verwende. Das kann aber auch alles andere sein, das müsstest Du bei dir natürlich anpassen.

    Eine andere Option wäre, die CSS Klasse für das Label direkt zuzuordnen.

    <asp:Label runat="server" ...  CssClass='<%# Me.GetCssClass( Container.DataItem( "<DeinFeldname>" ) ) %>' 
    
    ...
    
    Private Function GetCssClass( ByVal Value As String ) As String
    
    Dim Result As String = "Completed"
    
        If Value = "1" Then
            Result = " Marker"
        End If
    
        Return Result
            
    End Function


    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

    • Als Antwort markiert Volker S Donnerstag, 20. Oktober 2016 11:55
    Mittwoch, 19. Oktober 2016 10:45
    Moderator

Alle Antworten

  • Hallo Volker,

    was genau willst Du denn nach welchen Kriterien formatieren? Es gibt Möglichkeiten, das direkt im Markup zu machen, anderes muss/sollte man im CodeBehind Teil erledigen. Wenn es nur um die Ausgabe bzw. ggfs. die Zuordnung von Css Klassen geht, muss man nicht zwingend ins RowCreated (bzw. eigentlich eher ins RowDataBound) Ereignis.

    Poste daher bitte etwas genauer, was Du unter welchen Umständen machen willst.


    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, 19. Oktober 2016 10:26
    Moderator
  • Hallo Stefan,
    danke für dein Interesse.

    Hast Recht, das hätte ich genauer beschreiben sollen. Sorry.

    Dem Label-Element soll je nach Inhalt ein CSS-Style zugewiesen werden. Dann wird es wohl bei RowDataBound() sein.
    Ich kann mich halt nicht richtig in die Hirarchie reindenken. :|

    Irgendwas mit e.row(i).controls(j)... -Auflistung ist da schon, aber bekomm es nicht hin. Hab es über die Überwachungsfunktion versucht mich da durchzuhangeln, aber letztendlich bin ich hier gelandet.


    Viele Grüße, Volker


    • Bearbeitet Volker S Mittwoch, 19. Oktober 2016 10:33
    Mittwoch, 19. Oktober 2016 10:32
  • Hallo Volker,

    vorab ein Tipp: In den allermeisten Fällen sollte man für das Auslesen von Inhalten nicht auf die Controls der Row zugreifen, sondern sich des DataItem bedienen. Das stellt die eigentliche Datenquelle für die Zeile dar. Wenn Du lediglich Zugriff auf die Daten brauchst, reicht das völlig.

    Protected Sub GridView_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) 'Handles <DeinGridView>.RowDataBound
    
        If e.Row.RowType <> DataControlRowType.DataRow Then
            Exit Sub
        End If
    
    Dim CurrentData As DataRowView
        CurrentData = CType( e.Row.DataItem, DataRowView )
    
    Dim Value As String = CurrentData( "<DeinFeldname>" )
            
        If Value = "1" Then
            e.Row.CssClass &= " Marker"
        End If
    
    End Sub

    Damit würdest Du bspw. dem <tr> Tag, das zum <td> Tag mit deinem Label gehört, eine CSS Klasse zuweisen.

    In meinem Beispiel ist e.Row.DataItem eine Instanz von DataRowView, da ich eine DataTable als Datenquelle für das GridView verwende. Das kann aber auch alles andere sein, das müsstest Du bei dir natürlich anpassen.

    Eine andere Option wäre, die CSS Klasse für das Label direkt zuzuordnen.

    <asp:Label runat="server" ...  CssClass='<%# Me.GetCssClass( Container.DataItem( "<DeinFeldname>" ) ) %>' 
    
    ...
    
    Private Function GetCssClass( ByVal Value As String ) As String
    
    Dim Result As String = "Completed"
    
        If Value = "1" Then
            Result = " Marker"
        End If
    
        Return Result
            
    End Function


    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

    • Als Antwort markiert Volker S Donnerstag, 20. Oktober 2016 11:55
    Mittwoch, 19. Oktober 2016 10:45
    Moderator
  • Besten Dank, Stefan.

    Hab mich für Option 1 entschieden, das passt perfekt, um die ganze Zelle zu formatieren:

        Private Sub gvMA_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles gvMA.RowDataBound
    
            If Not e.Row.RowType = DataControlRowType.DataRow Then
                Exit Sub
            End If
    
            Dim CurrentData As Data.DataRowView
            CurrentData = CType(e.Row.DataItem, Data.DataRowView)
    
            Dim value As String = CurrentData("MA_STATUS")
    
            e.Row.Cells(4).CssClass = value
        End Sub


    Viele Grüße, Volker


    • Bearbeitet Volker S Mittwoch, 19. Oktober 2016 12:17
    • Als Antwort markiert Volker S Donnerstag, 20. Oktober 2016 07:58
    • Tag als Antwort aufgehoben Stefan FalzModerator Donnerstag, 20. Oktober 2016 11:40
    Mittwoch, 19. Oktober 2016 12:17
  • Hallo Volker,

    der Sinn und Zweck der "Als Antwort markieren" Funktion ist eigentlich der, dass das oder die Posting(s) von Antwortenden, die dem Fragesteller die Lösung oder zumindest die entscheienden Hinweise darauf aufgezeigt haben, entsprechend markiert werden.

    Natürlich kann das auch mal eine eigene Antwort sein, wenn man selbst auf die Lösung gekommen ist. Im aktuellen Thread ist deine Lösung aber letzendlich nur eine minimale Abwandlung meines Lösungsvorschlags (soll nur als Beispiel dienen, ich stelle jetzt nicht explizit generell auf meine Postings ab)


    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

    Donnerstag, 20. Oktober 2016 11:44
    Moderator
  • Eigentlich sollte auch deine Antwort markiert sein. Kann ja mal passieren. Habs geändert.

    Viele Grüße, Volker

    Donnerstag, 20. Oktober 2016 12:01
  • Hallo Volker,

    war auch nicht böse gemeint, sondern lediglich als Erklärung. Hätte ja auch sein können, dass Du das nicht wusstest.


    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

    Donnerstag, 20. Oktober 2016 13:47
    Moderator