您的位置:首页 > 其它

silverlight中DataGrid单元格变色问题

2011-04-02 18:10 344 查看
学silverlight快半个月了,在公司中学习与在学校的学习就是不一样,在学校如果要学习silverlight那当然是先图书馆借一本或自己买一本书然后夸啦啦得看完,接着练习几个题目就差不多了。在公司不一样,公司主要还是任务驱动型的。

在这我说说在公司修改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,故而写下此博文!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐