要实现:DataGrid中满足给定条件的单元格的字体颜色为红色,
在窗体show之前就完成datagrid数据初始化 :datagrid.itemssource = datatable.defaltview
我在生成datatable的时候就记录了所有需要标红的单元格的索引
在窗体show之后执行了一个函数,实现DataGrid中上述索引的单元格Foreground为红
问题:
完事后表格中的这些单元格字体确实变红了,但是!!!我上下滚动了以后(表格没设左右滚动)这些单元格的样式居然变了,某些该红的不红了,不该红的变红了,每次滚动都会变,而且看不出变的规律。有大神遇到过或看得明白这个问题么??求赐教
注:看过网上的一些方法说这个问题可通过设置datagrid的单元格数据触发器(DataTriger什么的)实现,但我的单元格内容不是简单数字,而是类似“7.0XXXX\R\NXXX”之类的,要在前面的数字大于某个值的时候标红,所以觉得触发器也很难实现。上代码:
.xmal:(DataGrid没有重写任何WPF预定义的事件)
<DataGrid Name="data" FontSize="14" HeadersVisibility="Column" IsReadOnly="True" Foreground="Black" VerticalScrollBarVisibility="Hidden" CanUserSortColumns="False" CanUserReorderColumns="False">
</DataGrid>.xmal.cs:
window.show()之前就是根据规则生成数据表DataTable,然后标记需要标红的单元格索引,然后初始化datagrid
show()之后实现单元格变红的代码:
-------------------------------------------割------------------------------------
public void setDataCellStyle()
{
//这个循环是根据之前记录的单元格索引找到需要标红的单元格,改变他们的样式
for (int i = 0; i < strongWindCellIndex_X.Count; i++)
{
DataGridRow rowContainer = (DataGridRow)data.ItemContainerGenerator.ContainerFromIndex(strongWindCellIndex_X[i]);
if (rowContainer == null)
{
data.UpdateLayout();
data.ScrollIntoView(data.Items[strongWindCellIndex_X[i]]);
data.UpdateLayout();
rowContainer = (DataGridRow)data.ItemContainerGenerator.ContainerFromIndex(strongWindCellIndex_X[i]);
if (rowContainer == null)
continue;
}
DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(strongWindCellIndex_Y[i]);
if (cell == null)
{
data.UpdateLayout();
data.ScrollIntoView(rowContainer, data.Columns[strongWindCellIndex_Y[i]]);
data.UpdateLayout();
cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(strongWindCellIndex_Y[i]);
}
cell.Foreground = Brushes.Red;
}
}WPF wpfdatagrid
在窗体show之前就完成datagrid数据初始化 :datagrid.itemssource = datatable.defaltview
我在生成datatable的时候就记录了所有需要标红的单元格的索引
在窗体show之后执行了一个函数,实现DataGrid中上述索引的单元格Foreground为红
问题:
完事后表格中的这些单元格字体确实变红了,但是!!!我上下滚动了以后(表格没设左右滚动)这些单元格的样式居然变了,某些该红的不红了,不该红的变红了,每次滚动都会变,而且看不出变的规律。有大神遇到过或看得明白这个问题么??求赐教
注:看过网上的一些方法说这个问题可通过设置datagrid的单元格数据触发器(DataTriger什么的)实现,但我的单元格内容不是简单数字,而是类似“7.0XXXX\R\NXXX”之类的,要在前面的数字大于某个值的时候标红,所以觉得触发器也很难实现。上代码:
.xmal:(DataGrid没有重写任何WPF预定义的事件)
<DataGrid Name="data" FontSize="14" HeadersVisibility="Column" IsReadOnly="True" Foreground="Black" VerticalScrollBarVisibility="Hidden" CanUserSortColumns="False" CanUserReorderColumns="False">
</DataGrid>.xmal.cs:
window.show()之前就是根据规则生成数据表DataTable,然后标记需要标红的单元格索引,然后初始化datagrid
show()之后实现单元格变红的代码:
-------------------------------------------割------------------------------------
public void setDataCellStyle()
{
//这个循环是根据之前记录的单元格索引找到需要标红的单元格,改变他们的样式
for (int i = 0; i < strongWindCellIndex_X.Count; i++)
{
DataGridRow rowContainer = (DataGridRow)data.ItemContainerGenerator.ContainerFromIndex(strongWindCellIndex_X[i]);
if (rowContainer == null)
{
data.UpdateLayout();
data.ScrollIntoView(data.Items[strongWindCellIndex_X[i]]);
data.UpdateLayout();
rowContainer = (DataGridRow)data.ItemContainerGenerator.ContainerFromIndex(strongWindCellIndex_X[i]);
if (rowContainer == null)
continue;
}
DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(strongWindCellIndex_Y[i]);
if (cell == null)
{
data.UpdateLayout();
data.ScrollIntoView(rowContainer, data.Columns[strongWindCellIndex_Y[i]]);
data.UpdateLayout();
cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(strongWindCellIndex_Y[i]);
}
cell.Foreground = Brushes.Red;
}
}WPF wpfdatagrid
把你的datagrid.itemssource = datatable.defaltview换下
直接加一个数据展示层vm 然后用你的datatable去初始化vm的list或者observablecollection
然后去绑定datagrid复杂的判断和逻辑都放在vm里面去做
界面上直接用datatemplate绑定datatrigger判断就行
多简单直接 不要觉得直接绑定datatable你就减少了工作 实际上绕的更加远
受2楼提示,我baidu了下datagrid的滚动条属性,发现一片文章http://blog.csdn.net/jickie/article/details/7088644 哎,之前没想到往这方向搜
帖子里的代码应该就是4楼的方法,方法是好方法,但是对我这种菜鸟来说有些复杂了
项目紧,暂时偷偷懒设置下属性EnableRowVirtualization=false算了
以后有时间再研究强大的template和trigger
结贴~~