在WPF中访问dataGrid中的特定行/列

时间:2014-09-03 14:28:49

标签: c# wpf excel datagrid datatable

最近我刚开始学习WPF。虽然我的大部分开发经验来自Win Forms,但我已经成功地顺利过渡到WPF。

                                OVERVIEW

我正在编写一个程序,用于比较两个单独的dataTable中的信息,并反映在dataGrid中所做的更改。

dataTables表示旧信息列表"和"新信息"。在比较dataTables之后,我希望根据是否在"新信息表中进行了更改来突出显示特定单元格。

一个例子是,如果dataGrid([0] [0])中的第一个单元格包含' 3'来自"旧信息" dataTable和"新信息"中的相同单元格([0] [0]) dataTable包含' 5'。我希望将背景颜色改为黄色,以反映这种变化。

                                 PROBLEM

我目前正在处理两个正在填充的dataGrid对象,并且表示两个dataTables("旧信息"和#34;新信息")。我遇到的问题是,我似乎无法很好地访问特定的行或列。我希望能够访问特定的行/单元格,以便通过代码更改背景颜色。

                                 Comments

我记得当我使用Win Forms时,您可以按照dataGrid1.Rows [rowNumber] .Columns [ColumnNumber]的方式执行某些操作来访问特定的行/列。

从我到目前为止所读到的关于WPF dataGrids的内容来看,它们更基于对象或类似的东西,使得访问特定行/列的过程有点不同/繁琐。如果你碰巧知道如何访问WPF中dataGrid中的行/单元格内容,请告诉我。任何简单的例子将不胜感激。

1 个答案:

答案 0 :(得分:2)

DataGrids非常适合数据绑定,这是正确的,并且很难以编程方式访问和操作其中的行,列和单元格。使用WPF时,首选的方法是使用MVVM路由。在您的情况下,您可以使用基础数据驱动单元格颜色,而不是尝试编写代码隐藏代码来实现此目的。

MVVM是一个很大的主题,但作为可能涉及的内容的一部分,您通常会创建一个“模型”类,表示要在网格行中显示的实体。您的视图模型将公开这些对象的集合,这些对象绑定到网格并呈现为单独的行(通常您将手动定义XAML中的列,将它们绑定到模型类的各个属性)。

如果不知道您的特定网格显示的是什么,很难提供示例。但是,假设您列出了客户详细信息 - 第一列可能是名称,下一列可能是地址,等等。一种解决方案可以是在模型类上包括额外的布尔属性,以指示特定属性值是否与其“旧”对应物不同。数据触发器可以使用这些属性来更改单元格背景颜色,数据触发器位于应用于数据网格列的CellStyles中。

快速而脏的代码从我的头顶取样,因此可能不是100%正确:

public class Customer
{
    public string CustomerName {get; set;}
    public string CustomerAddress {get; set;}
    public bool CustomerNameDiffers {get; set;}
    public bool CustomerAddressDiffers {get; set;}
}

public class MyViewModel
{
    public ObservableCollection<Customer> Customers {get; set;}

    //etc..
}

XAML:

<Window.Resources>
   <Style x:Key="CustomerNameCellStyle"
          TargetType="DataGridTextColumn">
       <Style.Triggers>
           <DataTrigger Binding="{Binding CustomerNameDiffers}"
                        Value="True">
               <Setter Property="Background" 
                       Value="Yellow" />
           </DataTrigger>
       </Style.Triggers>
   </Style>
</Window.Resources>

<DataGridTextColumn Binding="{Binding CustomerName}" 
                    CellStyle="{StaticResource CustomerNameCellStyle}"
                    ... />

我意识到这是一个普遍的答案,但MVVM是一个很大的话题,但如果你要充分利用WPF并放弃Winforms中的代码隐藏习惯,那么值得深入了解。