赞
踩
datagrid显示的方式是绑定指定数据集合来实现显示的,理论上也可以具体去一行一行、一格一格的去指定datagrid中该显示什么,但是这样巨难用,而且后面想修改指定行、指定格的内容特别难,我百度了N久,网上的方法都不对,所以建议使用绑定数据集合的方式来设置显示的数据,如果你的数据是临时构建的,那你可以定义一个临时集合去装临时数据,然后把临时集合绑定在datagrid上,dataGrid绑定一个400-500行的数据并显示速度极快,根本感觉不到延迟卡顿。
<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>
这样就可以显示一个两列的表
声明一个类
class Test{
public String startTime {set; get; }
public String changeTime { set; get; }
}
定义装这个类的集合
List<Test> testList=new List<Test> ();
将这个集合填充完数据后,绑定数据
gridTotal.ItemsSource = testList;
这个时候在表格中就显示绑定的数据啦
假设你需要修改某行某列的数据,先修改testList
中的具体数据,然后
gridTotal.ItemsSource = null;
gridTotal.ItemsSource = testList;
这样即可
(有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); }
在xaml中在<DataGrid>
标签中加入
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center">
</Setter>
</Style>
</DataGrid.ColumnHeaderStyle>
引入样式文件
<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>
关键: Width=”*”
*在这里表示一个标准量
前面加上数字以表示当前列宽度在整个宽度中的权重。
如上设置
2*,2*,,
则总权为2+2+1+1=6
则2/6即列的百分比宽度了。
如果不加 * 则表明这是指定像素值
<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>
关键在于 <DataGrid>
标签中添加属性AlternationCount="2"
然后在
<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>
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>
在<DataGrid>
设置
<DataGrid x:Name="gridChange" RowHeight="60" HorizontalGridLinesBrush="#dddddd" GridLinesVisibility="Horizontal" Margin="0,0,0,0" FontSize="12" AlternationCount="2" CanUserSortColumns="False">
其中GridLinesVisibility
属性 就是设置单元格线的显示方式,当前设置的是只显示横线
在前面将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>
其中 arg
是被表格显示的类中的一个属性,当这个属性的值为 true
时,这一行的背景颜色是就是红色
单元格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>
此时StackPanel
的样式由名为 normalColumn
的style控制
<Style x:Key="normalColumn" TargetType="{x:Type StackPanel}">
<Setter Property="Background" Value="#FFFFFF"/>
</Style>
这时,单元格的背景颜色就变成了白色,如果想指定单元格变成指定颜色,请参照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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。