C# изменить цвет ячейки сетки данных

я пытаюсь изменить цвет ячейки сетки данных, но только на С#, а не на xaml.

<DataGrid x:Name = "arcad_Grid"  HorizontalAlignment = "Left" Height = "252" Margin = "822,138,0,0" VerticalAlignment = "Top" Width = "178" Loaded = "getArcadVersion" AutoGenerateColumns = "true" SelectionChanged = "Choicecontrol" SelectionMode = "Extended" CanUserAddRows = "False" CanUserResizeColumns = "False" CanUserResizeRows = "False" SelectionUnit = "Cell"  />

есть ли другой способ сделать это через С#? любая помощь будет оценена

Добавлена ​​вся часть «Получение данных из базы данных и заполнение их с помощью DataGrid».

   try
        {
            conn.Open();


            string cmd = "DSPOBJD OBJ(QSYS/DIID*) OBJTYPE(*LIB) OUTPUT(*OUTFILE) OUTFILE(Arcad_V)";
            OdbcConnection odbc = new OdbcConnection("DRIVER = {Client Access ODBC Driver (32-bit)};SYSTEM=XXXX;TRANSLATE=1;XDYNAMIC=0;CONNTYPE=0;DBQ=XXXX;UID=XXXX;password=XXXX");

            string as400cmd = "CALL  QCMDEXC('" + cmd + "')";
            OdbcCommand odbcCommand = new OdbcCommand(as400cmd,odbc);
            odbc.Open();
            odbcCommand.ExecuteNonQuery();

            string SQLquery = "select ODOBNM,ODOBTP from Arcad_V ";
            iDB2Command comm = conn.CreateCommand();
            comm.CommandText = SQLquery;
            iDB2DataReader reader = comm.ExecuteReader();
            while (reader.Read())
            {
                arcad.createspoolfile(reader[0].ToString());
             if (arcad.couleur == "rouge")
                {
                    DataGridCell cell = GetCell(0,0,arcad_Grid);
                    cell.Background = new SolidColorBrush(Colors.Red);
                }
                if (arcad.couleur == "vert")
                {
                    DataGridCell cell = GetCell(0, 0, arcad_Grid);
                    cell.Background = new SolidColorBrush(Colors.Red);
                }

            }

            iDB2DataAdapter adp = new iDB2DataAdapter(SQLquery, conn);
            DataTable dt = new DataTable("DIIAB.Arcad_V");


            adp.Fill(dt);
            arcad_Grid.ItemsSource = dt.DefaultView;
            conn.Close();
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());

        }

не могли бы вы показать свой файл xaml?

Frenchy 10.04.2019 14:38

@Frenchy Добавлена ​​строка сетки данных

aymannblal 10.04.2019 14:42

Что происходит, когда вы пытаетесь использовать свой код? У вас есть ошибка?

Zoma 10.04.2019 14:47

ошибок нет, но это не то, что я хотел, потому что он окрашивает всю сетку. все, что я хочу, это когда моя переменная couleur = red или green окрашивает ячейку Reader[0].toString(); а я не знаю как это сделать

aymannblal 10.04.2019 14:52

так что, если я понимаю, вы хотите изменить цвет только для одной ячейки?

Frenchy 10.04.2019 15:05

да хочу изменить цвет для 1 ячейки @Frenchy

aymannblal 10.04.2019 15:08

хорошо, лучше с тем, как вы загружаете сетку данных .. !!

Frenchy 10.04.2019 15:50

да ^^ мой плохой я не сказал это раньше

aymannblal 10.04.2019 16:02

@Frenchy ты нашел какое-нибудь решение?

aymannblal 10.04.2019 16:53

да, но это сложно с использованием конвертера ... на самом деле, следуя содержимому ячейки, вы адаптируете цвет фона?

Frenchy 10.04.2019 17:52

см. мое решение, все в порядке.

Frenchy 10.04.2019 18:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
562
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

mainwindows.xaml:

<Window x:Class = "WpfApplication1.MainWindow"
        xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
        xmlns:WpfApplication1 = "clr-namespace:WpfApplication1"
        xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local = "clr-namespace:WpfApplication1"
        mc:Ignorable = "d"

        Title = "MainWindow" Height = "350" Width = "525">
    <Window.Resources>
        <WpfApplication1:HighlighterConverter x:Key = "myHighlighterConverter" />
    </Window.Resources>
    <Grid>
        <DataGrid x:Name = "arcad_Grid" Loaded = "arcad_Grid_Loaded" SelectionChanged = "arcad_Grid_SelectionChanged" 
                  AutoGenerateColumns = "True" SelectionUnit = "Cell" >
            <DataGrid.CellStyle>
                <Style TargetType = "{x:Type DataGridCell}">
                    <Setter Property = "Background">
                        <Setter.Value>
                            <MultiBinding Converter = "{StaticResource myHighlighterConverter}" >
                                <MultiBinding.Bindings>
                                    <Binding RelativeSource = "{RelativeSource Self}"></Binding>
                                    <Binding Path = "Row"></Binding>
                                </MultiBinding.Bindings>
                            </MultiBinding>
                        </Setter.Value>
                    </Setter>
                </Style>
            </DataGrid.CellStyle>
        </DataGrid>
    </Grid>
</Window>

во время загруженного события в mainwindow.xaml.cs:

    private void arcad_Grid_Loaded(object sender, RoutedEventArgs e)
    {
        DataTable table = new DataTable();
        table.Columns.Add("Dosage", typeof(int));
        table.Columns.Add("Drug", typeof(string));
        table.Columns.Add("Patient", typeof(string));
        table.Columns.Add("Color", typeof(string));

        // Here we add five DataRows.
        table.Rows.Add(25, "Indocin", "David", "rouge");
        table.Rows.Add(50, "Enebrel", "Sam", "vert");
        table.Rows.Add(10, "Hydralazine", "Christoff", "rouge");
        table.Rows.Add(21, "Combivent", "Janet", "vert");
        table.Rows.Add(100, "Dilantin", "Melanie", "vert");         

        arcad_Grid.ItemsSource = table.DefaultView;
    }

конвертер.cs:

using System;
using System.Data;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Controls;

namespace WpfApplication1
{
    public class HighlighterConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values[1] is DataRow)
            {
                var cell = (DataGridCell)values[0];
                var row = (DataRow)values[1];
                var columnName = cell.Column.SortMemberPath;

                if (row[columnName].ToString() == "rouge" )
                    return Brushes.Red;
                if (row[columnName].ToString() == "vert")
                    return Brushes.Green;

            }
            return SystemColors.AppWorkspaceColor;
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new System.NotImplementedException();
        }
    }

}

Другое решение с простым конвертером: вы добавляете это в convert.cs

public class ValueToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string input;
        try
        {
            DataGridCell dgc = (DataGridCell)value;
            System.Data.DataRowView rowView = (System.Data.DataRowView)dgc.DataContext;
            input = (string)rowView.Row.ItemArray[dgc.Column.DisplayIndex];
        }
        catch (InvalidCastException e)
        {
            return DependencyProperty.UnsetValue;
        }
        switch (input)
        {
            case "rouge": return Brushes.Red;
            case "vert": return Brushes.Green;
            default: return DependencyProperty.UnsetValue;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

модификация в mainwindow.xaml:

<Window.Resources>
    <WpfApplication1:ValueToBrushConverter x:Key = "ValueToBrushConverter"/>
    <Style x:Key = "CellStyle" TargetType = "DataGridCell">
        <Setter Property = "Background" Value = "{Binding RelativeSource = {RelativeSource Self}, Converter = {StaticResource ValueToBrushConverter}}" />
    </Style>
</Window.Resources>
<Grid>
    <DataGrid x:Name = "arcad_Grid" Loaded = "arcad_Grid_Loaded" SelectionChanged = "arcad_Grid_SelectionChanged" 
              AutoGenerateColumns = "True" SelectionUnit = "Cell" CellStyle = "{StaticResource CellStyle}" >           
    </DataGrid>
</Grid>

тот же результат с меньшим кодированием

он говорит, что мой DataGrid не содержит определений для строк

aymannblal 10.04.2019 15:30

не могли бы вы показать, как вы загружаете сетку данных?

Frenchy 10.04.2019 15:32

я отредактировал свой первоначальный пост со всей частью кода с получением данных из базы данных и загрузкой в ​​сетку данных, потому что это не позволило мне ответить на мой вопрос @Frenchy

aymannblal 10.04.2019 15:47

Другие вопросы по теме