none
当执行scroll up/down 的时候如何在datagrid中让被更改行的背景色不被刷新。 RRS feed

  • 问题

  • 我遇到的问题是这样的,我动态更改了datagrid中某一行的颜色为蓝色(默认背景是白色的),但我在执行完scroll up/down的操作时,被改变颜色的行的背景色又恢复到了默认的颜色(白色)。请专家帮忙答复。谢谢先!我的datagrid的数据源是Database。

    下面是更改背景色的代码.

     private static List<UIElement> children = new List<UIElement>();

            private static void GetChildrenWithParentRec(UIElement parent, Type targetType, int testPassID)
            {
                int count = VisualTreeHelper.GetChildrenCount(parent);

                if (count > 0)
                {
                    for (int i = 0; i < count; i++)
                    {
                        UIElement child = (UIElement)VisualTreeHelper.GetChild(parent, i);

                        if (VisualTreeHelper.GetParent(child).GetType() == targetType
                            && (child as FrameworkElement) != null
                            && ((child as FrameworkElement).DataContext as TestpassModel).ID == testPassID)
                        {
                            children.Add(child);
                        }

                        GetChildrenWithParentRec(child, targetType, testPassID);
                    }
                }
            }

            // button 触发此事件来更改选定行的背景色
            private void Change_Color(object sender, RoutedEventArgs e)
            {
                children = new List<UIElement>();

                GetChildrenWithParentRec(dgTestPass, typeof(DataGridRow), testPassID);

                Grid grid;

                for (int i = 0; i < children.Count; i++)
                {

                    grid = (children[i] as Grid);

                    TestpassModel testPassItem = grid.DataContext as TestpassModel;

                     grid.Background = new SolidColorBrush(Colors.Blue);
                }

            }

    2010年3月10日 2:57

答案

  • 1)我没说很麻烦,恰恰相反我说很简单.

    2)以后你看回复,要仔细点.

    3)你要了解的是思路,而不是具体怎么写程序.
    要抓住关键的东西,就是一定要把SL元素与数据源绑定,才不会跑.
    临时设定的,翻页以后会跑.只有和数据源绑定才不会跑.任何其他企图都是无效的.

    4)那个按钮你随便放那里,里面都可以放,Grid外面就更不用说.

    5)基本原理就是:用TemplateGridColumn,不要企图用Silverlight现存的GridTextColumn.
    TemplateGridColumn你想怎么搞,就怎么搞.而GridTextColumn限制多.一般说来,我都用TemplateGridColumn. 在给TemplateGridColumn绑定一个数据源,就实现了你要的东西.,

    6)你就是成批修改一下数据源里面的颜色就可以了.

    类似这样修改:

    __Button_Click(..,..){
      

    var Ds = DgrStudentList.ItemsSource as CStudentList;  

    for(var I=0; I<=Ds.Count -1; I++){
        var Itm = Ds[I] as CStudentItem;
        //这里你可以判断你是什么样的数据,就给什么颜色,我就不写了
        Itm.RowBgColor = new SolidColorBrush(..你的颜色.)
    }


    //如果你只是要改变当前选中的行的颜色
    那么程序类似如下:

    for(var I=0; I<=DgrStudentList.SelectedItems.Count -1; I++){
        var Itm = DgrStudentList.SelectedItems[I] as CStudentItem;
        //这里你可以判断你是什么样的数据,就给什么颜色,我就不写了
        Itm.RowBgColor = new SolidColorBrush(..你的颜色.)
    }




    }
    • 已标记为答案 ascap 2010年3月11日 6:02
    2010年3月11日 5:15

全部回复

  • 你要保持背景颜色,必须将颜色设置到你的数据源中,然后SL控件绑定到该数据源,否则滚动后,无法保持原来的颜色。
    TFSoft按照你的要求,已经写了100%符合你要求的一个完整的,可直接运行的示例(见以前的帖子回复)。
    只不过思路与你的不一样。
    2010年3月10日 3:38
  • 你要保持背景颜色,必须将颜色设置到你的数据源中,然后SL控件绑定到该数据源,否则滚动后,无法保持原来的颜色。
    TFSoft按照你的要求,已经写了100%符合你要求的一个完整的,可直接运行的示例(见以前的帖子回复)。
    只不过思路与你的不一样。

    谢谢。

    用你前面给的列子实现不了。你写的是在scroll up/down的时候处理事件是在LoadingRow里面,在这个事件里面可以得到e.row,但根本不能除非此事件的,只有每次刷新页面的情况才会触发,这不是我要处理的情况。

    在那个thread里面,不明的回答符合我的情况,但我不能处理scroll up/down的情况。

    2010年3月10日 9:44
  • 你看错例子了,我的例子一定可以.如果论坛可以贴图,我可以把效果图给你贴出来.
    你根本不需要区处理scroll事件.
    我的解决方案思路大致如下:
    1)不用Silverlight本身的TextColumn,改用TemplateColumn.
    2)在TemplateColumn的DataTemplate中绑定背景颜色,这样只要这个绑定颜色的数据源发生改变,其背景颜色一定会改变.
    3)其实有1列是转么用来设置颜色的选择框.当然你可以弄一个命令按钮来让用户学者颜色,不过那样操作起来比较麻烦.如果是弹出一个对话框来选择颜色的话,也是可以的.
    2010年3月10日 13:58
  • 谢谢TFSoft。
    你的实例设置颜色是通过选择datagrid里面内嵌的combox颜色选项来完成的,我现在要通过datagrid控件外的button来实现这样的功能,而且需要实现可以同时更改多行背景色的功能。正如你所说,实现起来是很麻烦。我也不知道怎么来实现,没思路,所以请教专家来给与帮助。
    2010年3月11日 2:48
  • 1)我没说很麻烦,恰恰相反我说很简单.

    2)以后你看回复,要仔细点.

    3)你要了解的是思路,而不是具体怎么写程序.
    要抓住关键的东西,就是一定要把SL元素与数据源绑定,才不会跑.
    临时设定的,翻页以后会跑.只有和数据源绑定才不会跑.任何其他企图都是无效的.

    4)那个按钮你随便放那里,里面都可以放,Grid外面就更不用说.

    5)基本原理就是:用TemplateGridColumn,不要企图用Silverlight现存的GridTextColumn.
    TemplateGridColumn你想怎么搞,就怎么搞.而GridTextColumn限制多.一般说来,我都用TemplateGridColumn. 在给TemplateGridColumn绑定一个数据源,就实现了你要的东西.,

    6)你就是成批修改一下数据源里面的颜色就可以了.

    类似这样修改:

    __Button_Click(..,..){
      

    var Ds = DgrStudentList.ItemsSource as CStudentList;  

    for(var I=0; I<=Ds.Count -1; I++){
        var Itm = Ds[I] as CStudentItem;
        //这里你可以判断你是什么样的数据,就给什么颜色,我就不写了
        Itm.RowBgColor = new SolidColorBrush(..你的颜色.)
    }


    //如果你只是要改变当前选中的行的颜色
    那么程序类似如下:

    for(var I=0; I<=DgrStudentList.SelectedItems.Count -1; I++){
        var Itm = DgrStudentList.SelectedItems[I] as CStudentItem;
        //这里你可以判断你是什么样的数据,就给什么颜色,我就不写了
        Itm.RowBgColor = new SolidColorBrush(..你的颜色.)
    }




    }
    • 已标记为答案 ascap 2010年3月11日 6:02
    2010年3月11日 5:15