要实现: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

解决方案 »

  1.   

    WPF 是双向通知的,你的指定的单元格红色是否和滚动条属性有关,如有关,肯定是滚动时 滚动条的值发生变化,单元格也就跟着发生变化
      

  2.   

    如果是wpf的话可以考虑mvvm
    把你的datagrid.itemssource = datatable.defaltview换下
    直接加一个数据展示层vm 然后用你的datatable去初始化vm的list或者observablecollection
    然后去绑定datagrid复杂的判断和逻辑都放在vm里面去做
    界面上直接用datatemplate绑定datatrigger判断就行
    多简单直接 不要觉得直接绑定datatable你就减少了工作 实际上绕的更加远
      

  3.   

    问题解决了   谢谢各位
    受2楼提示,我baidu了下datagrid的滚动条属性,发现一片文章http://blog.csdn.net/jickie/article/details/7088644   哎,之前没想到往这方向搜
    帖子里的代码应该就是4楼的方法,方法是好方法,但是对我这种菜鸟来说有些复杂了
    项目紧,暂时偷偷懒设置下属性EnableRowVirtualization=false算了 
    以后有时间再研究强大的template和trigger
    结贴~~