当前位置:   article > 正文

c# WPF DataGrid的使用

c# wpf datagrid

1.设置显示内容

datagrid显示的方式是绑定指定数据集合来实现显示的,理论上也可以具体去一行一行、一格一格的去指定datagrid中该显示什么,但是这样巨难用,而且后面想修改指定行、指定格的内容特别难,我百度了N久,网上的方法都不对,所以建议使用绑定数据集合的方式来设置显示的数据,如果你的数据是临时构建的,那你可以定义一个临时集合去装临时数据,然后把临时集合绑定在datagrid上,dataGrid绑定一个400-500行的数据并显示速度极快,根本感觉不到延迟卡顿。

1.数据显示

1.定义xaml文件
    <DataGrid Name="gridTotal">                        
        <DataGrid.Columns >                            
            <DataGridTextColumn Binding="{Binding changeTime}" Header="改变时间" Width="*" ElementStyle="{StaticResource contentCenterStyle}"/>
            <DataGridTextColumn Binding="{Binding startTime}" Header="开始时间" Width="*" ElementStyle="{StaticResource contentCenterStyle}"/>
        </DataGrid.Columns>
    </DataGrid>

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这样就可以显示一个两列的表

2.绑定数据

声明一个类

class Test{
    public String startTime {set; get; }
    public String changeTime { set; get; }
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

定义装这个类的集合

List<Test> testList=new List<Test> ();

   
   
  • 1
  • 1

将这个集合填充完数据后,绑定数据

gridTotal.ItemsSource = testList;

   
   
  • 1
  • 1

这个时候在表格中就显示绑定的数据啦

3.修改数据

假设你需要修改某行某列的数据,先修改testList中的具体数据,然后

gridTotal.ItemsSource = null;
gridTotal.ItemsSource = testList;

   
   
  • 1
  • 2
  • 1
  • 2

这样即可

4.修改某行某列的值和颜色(有BUG)

(有bug,请参照2-8的解决方案)
这是从网上找的方法,在数据量一多之后,就会出现多找乱找行的现象,求大神解惑
///
/// 改变一个dataGrid单元个的值
///
///
///
private void changeGridTableCellValue(DataGrid dg,int rowNum,int columnNum,String value)
{

    if (!Window.GetWindow(dg).IsVisible)
    {
        Window.GetWindow(dg).Show();
    }
    dg.UpdateLayout();
    TextBlock changeCell = dg.Columns[columnNum].GetCellContent(dg.Items[rowNum]) as TextBlock;
    if (changeCell == null)
    {
        Console.WriteLine("bug");
        return;
    }
    changeCell.Text = value;
}
private void changeGridTableCellColor(DataGrid dg, int rowNum, int columnNum, Color color)
{
    if (!Window.GetWindow(dg).IsVisible)
    {
        Window.GetWindow(dg).Show();
    }
    dg.UpdateLayout();
    DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(rowNum);
    if (row == null)
    {
        Console.WriteLine("bug");
        return;
    }
    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);
        DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnNum);
        cell.Background = new SolidColorBrush(color);
}   

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

2.外观显示

1.让DataGrid中的列标题居中

在xaml中在<DataGrid>标签中加入

<DataGrid.ColumnHeaderStyle>
    <Style TargetType="DataGridColumnHeader">
        <Setter Property="HorizontalContentAlignment" Value="Center">
        </Setter>
    </Style>
</DataGrid.ColumnHeaderStyle>

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.让内容单元格居中显示

引入样式文件

3.按百分比显示设置列的宽度

<DataGrid.Columns>
    <DataGridTextColumn Binding="{[0]}" Header="参数类型" Width="2*" />
    <DataGridTextColumn Binding="{[1]}" Header="时间" Width="2*" />
    <DataGridTextColumn Binding="{[2]}" Header="数据" Width="*" />
    <DataGridTextColumn Binding="{[3]}" Header="危险情况" Width="*"/>
</DataGrid.Columns>

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

关键: Width=”*”
*在这里表示一个标准量
前面加上数字以表示当前列宽度在整个宽度中的权重。
如上设置
2*,2*,
则总权为2+2+1+1=6
则2/6即列的百分比宽度了。
如果不加 * 则表明这是指定像素值

4.隔行变色

<DataGrid x:Name="gridChange" RowHeight="60" AlternationCount="2" >                       
    <DataGrid.RowStyle>
        <Style TargetType="{x:Type DataGridRow}">
            <Setter Property="FontSize" Value="12"/>
            <Style.Triggers>
                <Trigger Property="ItemsControl.AlternationIndex"
     Value="0">
                    <Setter Property="Background" Value="#cbedfa" />
                </Trigger>
                <Trigger Property="ItemsControl.AlternationIndex"
     Value="1">
                    <Setter Property="Background" Value="#FFFFFFFF" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>       
</DataGrid>

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

关键在于 <DataGrid>标签中添加属性AlternationCount="2"
然后在

5.鼠标滑过行变色

<DataGrid x:Name="gridChange" RowHeight="60"  >                       
    <DataGrid.RowStyle>
        <Style TargetType="{x:Type DataGridRow}">
            <Setter Property="FontSize" Value="12"/>
            <Style.Triggers>                    
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="#76d7fb"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>       
</DataGrid>

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

6.选中行变色

dataGrid自带有选中行变成蓝底白字的功能,所以要实现选中行变成其他色,覆盖原来的显示样式,原来的显示样式是基于cellStyle的所以应当在<DataGrid>添加

<DataGrid.CellStyle>  
    <Style TargetType="DataGridCell">  
        <Setter Property="BorderThickness" Value="0"/>  
        <Setter Property="MinWidth" Value="85"/>     
        <Style.Triggers>  
            <Trigger Property="IsSelected" Value="True">  
                <Setter Property="Background" Value="LightBlue"/>  
                <Setter Property="Foreground" Value="White"/>  
             </Trigger>  
         </Style.Triggers>  
     </Style>  
</DataGrid.CellStyle>  

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

7.取消单元格的边框

<DataGrid>设置

<DataGrid x:Name="gridChange" RowHeight="60" HorizontalGridLinesBrush="#dddddd"  GridLinesVisibility="Horizontal"   Margin="0,0,0,0"  FontSize="12"  AlternationCount="2" CanUserSortColumns="False">

   
   
  • 1
  • 1

其中GridLinesVisibility属性 就是设置单元格线的显示方式,当前设置的是只显示横线

8.修改满足指定条件的行背景颜色

在前面将DataGrid的理念是表只是将数据的呈现,应当改根据数据的内容来决定显示的样式,而不是直接修改某行的颜色。

所以要想修改行颜色,是要让表格去判断XX行是否满足XX条件,满足就变色,不满足就不变色。

这里说明修改满足指定条件的行背景颜色的方法
定义一个style

<Style x:Key="bigSmallColumn" TargetType="{x:Type StackPanel}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding arg}" Value="true">
            <Setter Property="Background" Value="RED"/>
        </DataTrigger>
        </Trigger>
    </Style.Triggers>
</Style>

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

其中 arg是被表格显示的类中的一个属性,当这个属性的值为 true时,这一行的背景颜色是就是红色

9,修改单元格的颜色

单元格RowCell本身没有Background属性,无法设置颜色,需要在单元格里面嵌套一层有背景颜色属性控件来显示颜色,这里我用StackPanel

表头应当这样配置

<DataGridTemplateColumn  Header="表头" Width="5*" >
    <DataGridTemplateColumn.CellTemplate >
        <DataTemplate >
            <StackPanel Margin="0" Style="{StaticResource normalColumn}">
                <TextBox  Text="{Binding argStr}"  Style="{StaticResource normalCell}"/>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

此时StackPanel的样式由名为 normalColumn的style控制

<Style x:Key="normalColumn" TargetType="{x:Type StackPanel}">
    <Setter Property="Background" Value="#FFFFFF"/>           
</Style>

   
   
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

这时,单元格的背景颜色就变成了白色,如果想指定单元格变成指定颜色,请参照2.8 修改满足指定条件的行背景颜色 的设置方法

参考:
https://blog.csdn.net/zhengxiaotaozz/article/details/72674370
https://blog.csdn.net/u012094627/article/details/30046725
https://blog.csdn.net/www89574622/article/details/76187254
https://www.jb51.net/article/55084.htm
https://www.cnblogs.com/start-from-scratch/p/5716524.html
https://blog.csdn.net/liuyundemhsg/article/details/79637606

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/582857
推荐阅读