如何使用从wpf中的数据库中获取的值更改datagrid行背景颜色

Posted

技术标签:

【中文标题】如何使用从wpf中的数据库中获取的值更改datagrid行背景颜色【英文标题】:how to change datagrid row background color with value taken from database in wpf 【发布时间】:2015-04-25 17:30:00 【问题描述】:

我想通过从数据库中获取值来更改数据网格行背景颜色。 我有 2 个值“错误”和“确定”。如果列字符串值为错误,则行颜色将为红色,如果确定,则必须为绿色。该值通过执行查询从数据库中获取。我在数据集中有这些值。我不清楚如何实现这一点?

我试过下面的代码:

<Window x:Class="stackDatagridColor.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:viewModels="clr-namespace:stackDatagridColor"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <viewModels:viewmodel x:Key="viewmodel"/>
    <viewModels:BrushConverter x:Key="BrushConverter"/>
</Window.Resources>
<Grid>
    <StackPanel>
        <DataGrid ItemsSource="Binding Collection, Mode=TwoWay, Source=StaticResource viewmodel, UpdateSourceTrigger=PropertyChanged">
            <DataGrid.RowStyle>
                <Style TargetType="DataGridRow">
                    <Style.Triggers>
                        <DataTrigger Binding="Binding Status" Value="ERROR">
                            <Setter Property="Background" Value="Red"></Setter>
                        </DataTrigger>
                        <DataTrigger Binding="Binding Status" Value="OK">
                            <Setter Property="Background" Value="Green"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.RowStyle>
        </DataGrid>
    </StackPanel>
</Grid>

视图模型:

public class viewmodel : INotifyPropertyChanged


    private ObservableCollection<myItem> collection;
    public ObservableCollection<myItem> Collection
    
        get  return collection; 
        set  collection = value; OnPropertyChanged("Collection"); 
    


    public viewmodel()
    
        Collection = new ObservableCollection<myItem>();
        myItem item1 = new myItem  Name = "name1", Status = "OK" ;
        myItem item2 = new myItem  Name = "name2", Status = "ERROR" ;
        DispatchService.Invoke(() =>
            
                Collection.Add(item1);
            Collection.Add(item2);
            );
    


    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged = delegate  ;

    protected void OnPropertyChanged(string propertyName)
    
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        
            handler(this, new PropertyChangedEventArgs(propertyName));
        
    

    #endregion

简单类

public class myItem

    public string Status  get; set; 
    public string Name  get; set; 

调度程序类

public static class DispatchService

    public static void Invoke(Action action)
    
        Dispatcher dispatchObject = Application.Current.Dispatcher;
        if (dispatchObject == null || dispatchObject.CheckAccess())
        
            action();
        
        else
        
            dispatchObject.Invoke(action);
        
    

转换器:

public class BrushConverter : IValueConverter

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        string input = value as string;
        switch (input)
        
            case "ERROR":
                return Brushes.Red;
            case "OK":
                return Brushes.Green;
            default:
                return DependencyProperty.UnsetValue;
        
    

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

我只想绑定数据集列来触发。如果触发器获取 ERROR 字符串,则背景行颜色变为红色,反之亦然。

【问题讨论】:

您的代码似乎有效。我不确定我是否了解您的问题所在。 我不知道如何将数据集绑定到视图模型 数据集是 System.Data.DataSet 类的实例吗? 【参考方案1】:

我得到了我的答案...没有新的此类东西..只是使用了 loadingrow 事件。这非常有用。 见下文

DataGridRow row = e.Row;
DataRowView rView = row.Item as DataRowView
if(rView != null && rView.Row.ItemArray[4].ToString().Contains("ERROR")) 

  e.row.Background= new SolidColorBrush(Color.Red);

else

 e.row.Background= new SolidColorBrush(Color.Green);

【讨论】:

这里的“e”是什么? @ajivani 'LoadingRow' 是 DataGrid 的事件。如果我没记错的话,Dipika 正在编写上面的代码。【参考方案2】:

首先Collection属性应该这样声明:

public DataSet Collection  ... 

XAML 中的ItemSource 绑定也应该更改:

ItemsSource="Binding Path=Collection.Tables[Table1], Mode=OneWay,...

在上面的代码中,Table1 是您要绑定到的数据集中的表的名称。要测试此代码,请以这种方式创建一个简单的数据集:

 public viewmodel()
 
        var tb = new DataTable("Table1");
        tb.Columns.Add("Status");
        tb.Columns.Add("Name");

        tb.Rows.Add("OK", "name1");
        tb.Rows.Add("ERROR", "name2");
        tb.Rows.Add("ERROR", "name3");

        Collection2 = new DataSet();
        Collection2.Tables.Add(tb);
 

【讨论】:

以上是关于如何使用从wpf中的数据库中获取的值更改datagrid行背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何从 WPF 中的 app.config 获取 List<string> 值集合?

如何从自定义用户控件 WPF、C# 中的枚举自定义属性中获取值?

如何获取 WPF DataGrid 以将更改保存回数据库?

如何从 Qtable 中获取值

WPF中,ComboBox值显示问题

我如何更改.properties文件中的值并在jenkins中使用此命令运行构建