я пытаюсь изменить цвет ячейки сетки данных, но только на С#, а не на 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());
}
@Frenchy Добавлена строка сетки данных
Что происходит, когда вы пытаетесь использовать свой код? У вас есть ошибка?
ошибок нет, но это не то, что я хотел, потому что он окрашивает всю сетку. все, что я хочу, это когда моя переменная couleur = red или green окрашивает ячейку Reader[0].toString(); а я не знаю как это сделать
так что, если я понимаю, вы хотите изменить цвет только для одной ячейки?
да хочу изменить цвет для 1 ячейки @Frenchy
хорошо, лучше с тем, как вы загружаете сетку данных .. !!
да ^^ мой плохой я не сказал это раньше
@Frenchy ты нашел какое-нибудь решение?
да, но это сложно с использованием конвертера ... на самом деле, следуя содержимому ячейки, вы адаптируете цвет фона?
см. мое решение, все в порядке.
Я создал новый образец с некоторыми данными: вам нужно использовать конвертер с мультипривязкой, чтобы делать то, что вы хотите.
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 не содержит определений для строк
не могли бы вы показать, как вы загружаете сетку данных?
я отредактировал свой первоначальный пост со всей частью кода с получением данных из базы данных и загрузкой в сетку данных, потому что это не позволило мне ответить на мой вопрос @Frenchy
не могли бы вы показать свой файл xaml?