Программно присваивая цвет строке в DataGrid

В то время как Визуальный SVN стоит приблизительно $50, я сильно предпочитаю его по AnkhSVN (который я в последний раз попробовал приблизительно год назад - это, возможно, улучшилось с тех пор).

Это - один из самых легких, чтобы продать Вашему боссу, если финансирование является проблемой. (К счастью мы не должны царапать и хватать для получения хороших инструментов, где я работаю.)

20
задан Kay Lee 12 December 2016 в 13:55
поделиться

2 ответа

Вы можете обработать событие LoadingRow DataGrid, чтобы определить, когда добавляется строка. В обработчике событий вы можете получить ссылку на DataRow, который был добавлен в DataTable, который действует как ваш ItemsSource. Затем вы можете обновить цвет DataGridRow, как вам нравится.

void dataGrid_LoadingRow(object sender, Microsoft.Windows.Controls.DataGridRowEventArgs e)
{
    // Get the DataRow corresponding to the DataGridRow that is loading.
    DataRowView item = e.Row.Item as DataRowView;
    if (item != null)
    {
        DataRow row = item.Row;

            // Access cell values values if needed...
            // var colValue = row["ColumnName1]";
            // var colValue2 = row["ColumName2]";

        // Set the background color of the DataGrid row based on whatever data you like from 
        // the row.
        e.Row.Background = new SolidColorBrush(Colors.BlanchedAlmond);
    }           
}

Чтобы подписаться на мероприятие в XAML:

<toolkit:DataGrid x:Name="dataGrid"
    ...
    LoadingRow="dataGrid_LoadingRow">

Или в C #:

this.dataGrid.LoadingRow += new EventHandler<Microsoft.Windows.Controls.DataGridRowEventArgs>(dataGrid_LoadingRow);
36
ответ дан 29 November 2019 в 23:27
поделиться

У меня был тот же самый вопрос, и я понял его, сделав минимальный тест и некоторые дедуктивные рассуждения!

В основном решением является ALWAYS убедитесь, что задан цвет фона (или любой стиль на самом деле). Не принимайте значения по умолчанию для стиля строк . Я предполагал, что значение по умолчанию для белого, которое является разумное предположение, но на самом деле это не так.

Подробнее:

Похоже, среда выполнения повторно использует экземпляры класса Row при визуализации нескольких строк. Я вообще не проверял это, но судя по симптомам, это кажется, что это происходит.

У меня была только одна или две строки, которые должны быть окрашены по-разному. Я видел случайно окрашенные строки при прокрутке вверх и вниз.

Вот мой тест класса i сделано. Каждая пятая строка должна быть красной и курсивной.

Вы увидите пару строк с комментариями (которые задают значение по умолчанию, отличное от курсива и белого фона). С этими комментариями - если прокрутить вверх и вниз, вы увидите много красного!! Это происходит потому, что объекты строк используются повторно. Если сделать окно меньше, а затем максимизировать его часть белого вернется. Возможно, сборщик мусора, собирающий строки, не думает, что вам понадобится больше после того, как окно уменьшится.

Как я сказал выше, решение состоит в том, чтобы всегда указывать стили для значений по умолчанию и не принимать какие-либо значения по умолчанию.

public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();

        dataGrid1.ItemsSource = Enumerable.Range(0, 50).Select(x => new Person()
        {
            FirstName = "John",
            LastName = "Smith",
            ID = x,
            Delinquent = (x % 5 == 0)     // every fifth person is 'delinquent'
        });
    }

    private void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
    {
        var person = (Person)e.Row.DataContext;

        if (person.Delinquent)
        {
            e.Row.Background = new SolidColorBrush(Colors.Red);
            e.Row.Foreground = new SolidColorBrush(Colors.White);
            e.Row.FontStyle = FontStyles.Italic;
        }

        else
        {
           // defaults - without these you'll get randomly colored rows
           // e.Row.Background = new SolidColorBrush(Colors.Green);
           // e.Row.Foreground = new SolidColorBrush(Colors.Black);
           // e.Row.FontStyle = FontStyles.Normal;
        }

    }

    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int ID { get; set; }
        public bool Delinquent { get; set; }
    }
}
-121--3895006-

Если вы используете PHP 5.3 +, это поможет вам, поместите его в самую верхнюю часть страницы:

if (get_magic_quotes_gpc() === 1)
{
    $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true);
    $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true);
    $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true);
    $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true);
}

Обрабатывает клавиши, значения и многомерные массивы.

-121--1170067-

ВАЖНО : всегда назначьте значения по умолчанию для строк, не окрашенных условием, или любого другого стиля.

Смотрите мой ответ на C # Silverlight Datagrid - Row Color Change .

PS. Я в Silverlight и не подтвердил это поведение в WPF

1
ответ дан 29 November 2019 в 23:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: