locked
Hintergrundfarbe von den Reihen in einem DataGrid festlegen??? RRS feed

  • Frage

  • Hallo,

    ich habe einen DataGrid, dessen ItemsSource über einer Liste befühle:

    <sdk:DataGrid HorizontalAlignment="Left" x:Name="dataGrid" VerticalAlignment="Top" Width="880" Height="621" Margin="10,10,0,0" GridLinesVisibility="Vertical" HeadersVisibility="All" IsReadOnly="True" CanUserSortColumns = "False" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" BorderBrush="Gray" BorderThickness="2" />


    IList<Mitarbeiter> dataGridAusgabe = new List<Mitarbeiter>();
    
    dataGridAusgabe.Add(new Mitarbeiter()
    { titel = "Herr", vorname = "Michael", nachname = "Hoffmann" });
    
    dataGridAusgabe.Add(new Mitarbeiter()
    { titel = "Herr", vorname = "Sascha", nachname = "Nierbach" });
    
    dataGridAusgabe.Add(new Mitarbeiter()
    { titel = "Frau", vorname = "Nicole", nachname = "Russmann" });
    
    dataGrid.ItemsSource = dataGridAusgabe;
    
    public class Mitarbeiter
    {
         public string titel { get; set; }
         public string vorname { get; set; }
         public string nachname { get; set; }
    }

    jetzt würde ich gerne wissen, wie die Hintergrundfarbe von jeder Reihe festlegen kann?


    Gruesse, NUNUI

    Donnerstag, 14. August 2014 21:27

Antworten

  • Hi,
    zur Gestaltung der Hintergrundfarbe von Zeilen im DataGrid kann man das LoadingRow-Ereignis nutzen. Nachfolgend ein Beispiel in VB.NET. 

      Private Sub News_LoadingRow(ByVal sender As System.Object, ByVal e As System.Windows.Controls.DataGridRowEventArgs)
        Dim r = TryCast(e.Row.DataContext, meinRowTyo)
        If r.Freigegeben Then
          e.Row.Background = New SolidColorBrush(Color.FromArgb(63, 0, 255, 0))
        Else
          e.Row.Background = New SolidColorBrush(Color.FromArgb(31, 255, 0, 0))
        End If
      End Sub

    --
    Peter

    • Als Antwort markiert Nunui Montag, 18. August 2014 20:05
    Sonntag, 17. August 2014 05:53
  • Hallo,
    dein Code müsste so aussehen:
    private void dataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
    {
        var r = e.Row.DataContext as Mitarbeiter;//Das Item, das die Zeile mit Daten füllt
        if (r.titel == "Herr")//Farbe anhand von Eigenschaft(en) auswählen
        {
            e.Row.Background = new SolidColorBrush(Color.FromArgb(63, 0, 255, 0));
        }
        else
        {
            e.Row.Background = new SolidColorBrush(Color.FromArgb(31, 255, 0, 0));
        }
    }
    Oder alternativ:
    var rowNumber = (dataGrid.ItemsSource as IList<Mitarbeiter>).IndexOf(e.Row.DataContext as Mitarbeiter);//Zeilenindex bestimmen, beispielsweise für alternierende Farben
    switch (rowNumber % 3)
    {
        case 0: e.Row.Background = new SolidColorBrush(Color.FromArgb(63, 255, 255, 0)); break;//Farbe für 1. Zeile
        case 1: e.Row.Background = new SolidColorBrush(Color.FromArgb(255, 63, 255, 0)); break;//Farbe für 2. Zeile
        case 2: e.Row.Background = new SolidColorBrush(Color.FromArgb(255, 255, 63, 0)); break;//Farbe für 3. Zeile
    }
    PS: Für alternierende Farben mit nur 2 verschiedenen Hitergründen, kannst du auch meine andere Antwort mit dem XAML Code verwenden.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets


    Montag, 18. August 2014 14:39

Alle Antworten

  • Hi,
    zur Gestaltung der Hintergrundfarbe von Zeilen im DataGrid kann man das LoadingRow-Ereignis nutzen. Nachfolgend ein Beispiel in VB.NET. 

      Private Sub News_LoadingRow(ByVal sender As System.Object, ByVal e As System.Windows.Controls.DataGridRowEventArgs)
        Dim r = TryCast(e.Row.DataContext, meinRowTyo)
        If r.Freigegeben Then
          e.Row.Background = New SolidColorBrush(Color.FromArgb(63, 0, 255, 0))
        Else
          e.Row.Background = New SolidColorBrush(Color.FromArgb(31, 255, 0, 0))
        End If
      End Sub

    --
    Peter

    • Als Antwort markiert Nunui Montag, 18. August 2014 20:05
    Sonntag, 17. August 2014 05:53
  • Hallo,
    wie genau wilst du denn die Hintergrundfarbe festlegen? Für komplexe Dinge kannst du, wie von Peter vorgeschlagen, das LoadingRow-Ereignis nutzen.

    Wenn du allerdings einfach abwechselnde Farben haben willst, reichen auch 2 Eigenschaft im XAML aus:

    <sdk:DataGrid AlternatingRowBackground="Red" RowBackground="Green"
    Das Ergebnis:


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets


    Sonntag, 17. August 2014 13:54
  • Danke für eure Antworten und entschuldige auch meine späte Antwort.

    Ich habe den Code in C# koventieren lassen und habe folgende Code erhalten:

    private void News_LoadingRow(System.Object sender, System.Windows.Controls.DataGridRowEventArgs e)
    {
    	dynamic r = e.Row.DataContext as meinRowTyo;
    	if (r.Freigegeben) {
    		e.Row.Background = new SolidColorBrush(Color.FromArgb(63, 0, 255, 0));
    	} else {
    		e.Row.Background = new SolidColorBrush(Color.FromArgb(31, 255, 0, 0));
    	}
    }

    Bekomme aber leider die Fehlermeldung:

    Fehler	5	Der Typ- oder Namespacename "meinRowTyo" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)
    
    
    Fehler	1	Der vordefinierte Typ "Microsoft.CSharp.RuntimeBinder.Binder" ist nicht definiert oder importiert.
    


    Gruesse, NUNUI

    Montag, 18. August 2014 11:22
  • Hallo,
    dein Code müsste so aussehen:
    private void dataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
    {
        var r = e.Row.DataContext as Mitarbeiter;//Das Item, das die Zeile mit Daten füllt
        if (r.titel == "Herr")//Farbe anhand von Eigenschaft(en) auswählen
        {
            e.Row.Background = new SolidColorBrush(Color.FromArgb(63, 0, 255, 0));
        }
        else
        {
            e.Row.Background = new SolidColorBrush(Color.FromArgb(31, 255, 0, 0));
        }
    }
    Oder alternativ:
    var rowNumber = (dataGrid.ItemsSource as IList<Mitarbeiter>).IndexOf(e.Row.DataContext as Mitarbeiter);//Zeilenindex bestimmen, beispielsweise für alternierende Farben
    switch (rowNumber % 3)
    {
        case 0: e.Row.Background = new SolidColorBrush(Color.FromArgb(63, 255, 255, 0)); break;//Farbe für 1. Zeile
        case 1: e.Row.Background = new SolidColorBrush(Color.FromArgb(255, 63, 255, 0)); break;//Farbe für 2. Zeile
        case 2: e.Row.Background = new SolidColorBrush(Color.FromArgb(255, 255, 63, 0)); break;//Farbe für 3. Zeile
    }
    PS: Für alternierende Farben mit nur 2 verschiedenen Hitergründen, kannst du auch meine andere Antwort mit dem XAML Code verwenden.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets


    Montag, 18. August 2014 14:39
  • Es funktioniert wunderbar, VIELEN DANK!!!

    Gruesse, NUNUI

    Montag, 18. August 2014 20:04