Benutzer mit den meisten Antworten
GridView - TemplateField abhängig vom Inhalt formatieren

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
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
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 -
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
-
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
-
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
-
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 -
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