silverlight中DataGrid单元格变色问题
2011-04-02 18:10
344 查看
学silverlight快半个月了,在公司中学习与在学校的学习就是不一样,在学校如果要学习silverlight那当然是先图书馆借一本或自己买一本书然后夸啦啦得看完,接着练习几个题目就差不多了。在公司不一样,公司主要还是任务驱动型的。
在这我说说在公司修改bug过程中走的弯路及一步一步的解决过程。
现在带我的人需要我改一个bug。这个bug是这样子的:在一个DataGrid中遇到特殊数据需要显示特殊的颜色,但是现有系统中出现的问题是刚加载完时颜色能正确地显示,但是当拖动滚动条时颜色就搞乱了。使用过DataGrid的应该都知道,如果直接根据数据值的范围来判断实现以下IvlueConverter接口就肯定能实现指定单元格变色。比如我测试用的代码是:
前台代码:
后台代码:
1、继承IValueConverter接口的类
数据是从数据库里面取出来的,在此也就不在写了。由这些代码即可实现成绩小于60的显示为红色。
但是现在的情况是有两个数据源,一个数据源用于给DataGrid的ItemSource赋值以显示这些数据,另一个数据源是控制信息,该控制信息是一个二维矩阵即是坐标的集合,每一个元素代表一个单元格,现在只要能取到这个单元格那就万事大吉。此时自然想到这样写:
这样指定单元格的颜色就变为红色了,但是当我滑动滚动条时发现颜色乱了。花了很长时间去找原因可就是没找出来,最后还去找替代方案现在新建一个隐藏列,该隐藏列存储的是控制数据源转换后的值,然后根据该值在IVlueConverter接口中实现数据的控制。要这样做的话势必在给DataGrid赋值时得把两个数据源合并为一个,这可不是我愿意的,最后检查了很久终于发现问题所在。真正出错的是我自己的变成习惯,一直以为用了if如果else中不用执行就可以不写了。事实上这次我错了,DataGrid在每次滚动滚动条时都保留了上次单元格的颜色,当你在此滚动时出现颜色的单元格就会发生变化了。后来加上一句
else
{
txt2.Background = new SolidColorBrush(Colors.Transparent);
}
就不会出现这样的错了。我真正写的代码是:
这样就有四个单元格变色而且滑动滚动条颜色不会紊乱。
花了很长时间来改这个bug,故而写下此博文!
在这我说说在公司修改bug过程中走的弯路及一步一步的解决过程。
现在带我的人需要我改一个bug。这个bug是这样子的:在一个DataGrid中遇到特殊数据需要显示特殊的颜色,但是现有系统中出现的问题是刚加载完时颜色能正确地显示,但是当拖动滚动条时颜色就搞乱了。使用过DataGrid的应该都知道,如果直接根据数据值的范围来判断实现以下IvlueConverter接口就肯定能实现指定单元格变色。比如我测试用的代码是:
前台代码:
<UserControl xmlns:my="clr-namespace:TestDataGrid" xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class="TestDataGrid.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <UserControl.Resources> <DataTemplate x:Key="rowDT"> <StackPanel Orientation="Horizontal" Background="Transparent" Loaded="StackPanel_Loaded"></StackPanel> </DataTemplate> <my:ScoreConverter x:Key="converter"></my:ScoreConverter> <Style x:Key="txtBack" TargetType="TextBlock"> </Style> </UserControl.Resources> <Grid x:Name="LayoutRoot" Background="White"> <Canvas> <Canvas Canvas.Left="0" Canvas.Top="0"> <sdk:DataGrid x:Name="dgTest" Height="200" Width="400" LoadingRow="dgTest_LoadingRow" > <sdk:DataGrid.Columns> <sdk:DataGridTemplateColumn Header="序号"> <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Name="tblSort"></TextBlock> </DataTemplate> </sdk:DataGridTemplateColumn.CellTemplate> </sdk:DataGridTemplateColumn> <sdk:DataGridTemplateColumn Header="学号"> <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate> <sdk:Label Name="txt1" Content="{Binding sno}"/> </DataTemplate> </sdk:DataGridTemplateColumn.CellTemplate> </sdk:DataGridTemplateColumn> <sdk:DataGridTemplateColumn Header="分数"> <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate> <sdk:Label Name="txt2" Content="{Binding sscore}" Background="{Binding sscore,Converter={StaticResource converter}}"/> </DataTemplate> </sdk:DataGridTemplateColumn.CellTemplate> </sdk:DataGridTemplateColumn> </sdk:DataGrid.Columns> </sdk:DataGrid> </Canvas> </Canvas> </Grid> </UserControl>
后台代码:
1、继承IValueConverter接口的类
using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Windows.Data; using System.Globalization; namespace TestDataGrid { public class ScoreConverter:IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo cultrue) { double score = (double)value; Color color = score < 60 ? Colors.Red : Colors.Transparent; return new SolidColorBrush(color); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotFiniteNumberException(); } } }
数据是从数据库里面取出来的,在此也就不在写了。由这些代码即可实现成绩小于60的显示为红色。
但是现在的情况是有两个数据源,一个数据源用于给DataGrid的ItemSource赋值以显示这些数据,另一个数据源是控制信息,该控制信息是一个二维矩阵即是坐标的集合,每一个元素代表一个单元格,现在只要能取到这个单元格那就万事大吉。此时自然想到这样写:
TextBlock txt = dgTest.Columns[2].GetCellContent(e.Row).FindName("txtScore") as TextBlock ; int Row=e.Row.GetIndex(); if(Row==3)//此时代表是第四行第三列单元格 { txt2.Background = new SolidColorBrush(Colors.Red); }
这样指定单元格的颜色就变为红色了,但是当我滑动滚动条时发现颜色乱了。花了很长时间去找原因可就是没找出来,最后还去找替代方案现在新建一个隐藏列,该隐藏列存储的是控制数据源转换后的值,然后根据该值在IVlueConverter接口中实现数据的控制。要这样做的话势必在给DataGrid赋值时得把两个数据源合并为一个,这可不是我愿意的,最后检查了很久终于发现问题所在。真正出错的是我自己的变成习惯,一直以为用了if如果else中不用执行就可以不写了。事实上这次我错了,DataGrid在每次滚动滚动条时都保留了上次单元格的颜色,当你在此滚动时出现颜色的单元格就会发生变化了。后来加上一句
else
{
txt2.Background = new SolidColorBrush(Colors.Transparent);
}
就不会出现这样的错了。我真正写的代码是:
foreach (DataGridColumn dc in dgTest.Columns) { int col = dc.DisplayIndex; if (col == 1 || col == 2) { string strName = "txt"; strName += col; Label txt = dc.GetCellContent(e.Row).FindName(strName) as Label; if (e.Row.GetIndex() == 3 || e.Row.GetIndex() == 5) { txt.Background = new SolidColorBrush(Colors.Red); } else { txt.Background = new SolidColorBrush(Colors.Transparent); } } }
这样就有四个单元格变色而且滑动滚动条颜色不会紊乱。
花了很长时间来改这个bug,故而写下此博文!
相关文章推荐
- Silverlight DataGrid DataGridTemplateColumn 单元格 列 对齐问题
- Silverlight 解决 更新数据后 datagrid同步问题
- Silverlight Toolkit DataGrid - 单元格内容对齐样式
- silverlight 4中datagrid列标题和列内容居中问题
- DataGrid单元格移动变色,点击变色,双击取消颜色,排序.
- EasyUI datagrid : 启用行号、固定列及多级表头后,头部行号位置单元格错位的问题
- EasyUI datagrid : 启用行号、固定列及多级表头后,头部行号位置单元格错位的问题
- silverlight 中datagrid不能选中行的问题
- 关于WEB标准中使用表格存放数据的问题和单元格背景的变色
- DataGrid单元格移动变色,点击变色,双击取消颜色,排序.
- 关于使用Silverlight Toolkit 3 中的主题后DataGrid无法呈现数据的问题
- GridView/DataGrid单元格不换行的问题
- silverlight datagrid 模拟单元格双击事件
- silverlight 中datagrid列标题和列内容居中问题
- 【原创】Silverlight DataGrid对核心控件DataGrid的任意单元格进行获取和设置分析。
- silverlight 4中datagrid列标题和列内容居中问题,增加自增长列
- DataGrid单元格移动变色,点击变色,双击取消颜色,排序.
- 【原创】有关Silverlight中“DataGrid中单元格动态绑定ComboBox单击时数据项莫名被清除 ”的解决方案及思路。
- 【原创】有关Silverlight控件DataGrid的绑定数据后单元格单独复制的功能实现分析
- Silverlight的DataGrid实现列标题和单元格换行