• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

WPF jak warunkowo zmienić kolor każdej komórki w DataGrid?

0 głosów
65 wizyt
pytanie zadane 27 stycznia 2020 w C# przez wo2324 Nowicjusz (200 p.)
Potrzebuję żeby każda komórka w DataGrid przybrała wyznaczony kolor w zależności od posiadanej wartości.
Dla przykładu: Mój DataGrid posiada kilka komórek o wartości "work". Komórki te nie są ze sobą niczym związane (nie muszą występować we wspólnej kolumnie czy wierszu).
Robię projekt terminarza i chciałbym żeby był kolorowy (do każdej czynności przypisać kolor). Może jest na to lepsza kontrolka niż DataGrid?

1 odpowiedź

+1 głos
odpowiedź 27 stycznia 2020 przez areklipno Dyskutant (9,990 p.)
Właściwość background twojej komórki musisz zbindować z wartością "work" z klasy i przepuścić przez konwerter, który zwróci kolor. Początkowo wydaje się skomplikowane, ale nie taki diabeł straszny :)
komentarz 5 lutego 2020 przez wo2324 Nowicjusz (200 p.)

Dzięki za odpowiedź.
Nie mam takiej biegłości w WPF żeby zrozumieć tę koncepcję.

Na innym forum znalazłem sposób na pozyskanie każdej komórki DataGrid (https://social.msdn.microsoft.com/Forums/en-US/290d3c67-440e-4037-86b6-cf668990b5da/how-to-loop-through-all-the-the-cells-in-datagrid?forum=wpf).Trochę je dostosowałem i na aktualne potrzeby jest wystarczające.

public void GetDataGridRows(string task, string color)
        {
            for (int i = 0; i < PlannerDataGrid.Items.Count; i++)
            {
                for (int j = 0; j < PlannerDataGrid.Columns.Count; j++)
                {
                    //loop throught cell
                    DataGridCell cell = GetCell(i, j);
                    TextBlock tb = cell.Content as TextBlock;
                    if (tb.Text == task)
                    {
                        var converter = new System.Windows.Media.BrushConverter();
                        var brush = (Brush)converter.ConvertFromString(color);
                        cell.Background = brush;
                    }
                }
            }
        }

        public DataGridCell GetCell(int row, int column)
        {
            DataGridRow rowContainer = GetRow(row);

            if (rowContainer != null)
            {
                DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

                DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                if (cell == null)
                {
                    PlannerDataGrid.ScrollIntoView(rowContainer, PlannerDataGrid.Columns[column]);
                    cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                }
                return cell;
            }
            return null;
        }

        public DataGridRow GetRow(int index)
        {
            DataGridRow row = (DataGridRow)PlannerDataGrid.ItemContainerGenerator.ContainerFromIndex(index);
            if (row == null)
            {
                PlannerDataGrid.UpdateLayout();
                PlannerDataGrid.ScrollIntoView(PlannerDataGrid.Items[index]);
                row = (DataGridRow)PlannerDataGrid.ItemContainerGenerator.ContainerFromIndex(index);
            }
            return row;
        }

        public static T GetVisualChild<T>(Visual parent) where T : Visual
        {
            T child = default(T);
            int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < numVisuals; i++)
            {
                Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                child = v as T;
                if (child == null)
                {
                    child = GetVisualChild<T>(v);
                }
                if (child != null)
                {
                    break;
                }
            }
            return child;
        }

 

Podobne pytania

0 głosów
1 odpowiedź 267 wizyt
pytanie zadane 1 grudnia 2018 w C# przez marcinconn Obywatel (1,550 p.)
0 głosów
1 odpowiedź 363 wizyt
0 głosów
1 odpowiedź 746 wizyt
pytanie zadane 11 marca 2017 w C# przez PejtaM Użytkownik (550 p.)

86,526 zapytań

135,279 odpowiedzi

300,596 komentarzy

57,276 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...