none
怎样给DataGrid的其中一行上色? RRS feed

  • 问题

  • DataGrid有10行左右数据,我只要给第二行改变前景或者背景色,其它不变,应该怎样改?

    另外,还有就是给其中一个单元格修改背景或前景色应该怎样设定?

    我试过以下几种方法,但无一例外都是“灾难性故障”的异常错误,希望得到指点

                            try
                            {

                                Userslist.Columns[1].CellStyle.SetValue(DataGridCell.BackgroundProperty, new SolidColorBrush(Colors.Red));
                                
                            }
                            catch
                            {
                                //Userslist.RowBackground = new SolidColorBrush(Colors.Red);
                                //Userslist.Columns[1].SetValue(ForegroundProperty, new SolidColorBrush(Colors.Red));
                                //Userslist.Columns[1].SetValue(ForegroundProperty, Colors.Red);
                                try
                                {

                                    Userslist.Columns[1].SetValue(ForegroundProperty, new SolidColorBrush(Colors.Red));
                                }
                                catch
                                {
                                    try
                                    {

                                        Userslist.Columns[1].SetValue(ForegroundProperty, Colors.Red);
                                    }
                                    catch
                                    {

                                        
                                    }
                                }
    2009年12月25日 1:31

答案

  • 你好,
       
          这里有个SL3的例子
     

        public partial class MainPage : UserControl
        {
    
            ObservableCollection<Person> people;
            public MainPage(){
                InitializeComponent();
                people = new ObservableCollection<Person>() {
                    new Person(){Name="Micheal",Age=11},
                    new Person(){Name="Jason",Age=11},
                    new Person(){Name="Roger",Age=11},
                    new Person(){Name="Diana",Age=11},
                    new Person(){Name="Beckham",Age=11},
                    new Person(){Name="Ronaldo",Age=11},
                };
                dg.ItemsSource = people;
            }
    
            private void tb_GotFocus(object sender, RoutedEventArgs e)
            {
                var tb = sender as TextBox;
                tb.Background = new SolidColorBrush(Colors.Blue);
            }
    
            private void tb_LostFocus(object sender, RoutedEventArgs e)
            {
                var tb = sender as TextBox;
                tb.Background = null;
            }
         
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                GetChildrenWithParentRec(dg, typeof(DataGridRow));
                ((DataGridFrozenGrid)children[1]).Background = new SolidColorBrush(Colors.Red);
            }
            private  static List<UIElement> children = new List<UIElement>();
            private static void GetChildrenWithParentRec(UIElement parent, Type targetType)
            {
                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)
                        {
                            children.Add(child);
                        }
                        GetChildrenWithParentRec(child, targetType);
                    }
                }
            }
    
            private void sp_Loaded(object sender, RoutedEventArgs e)
            {
                var sp = sender as StackPanel;
                sp.Background = new SolidColorBrush(Colors.Yellow);
            }
    
        }
       <data:DataGrid x:Name="dg"  AutoGenerateColumns="False" >
                <data:DataGrid.Columns >
                    <data:DataGridTemplateColumn>  
                        <data:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                        <StackPanel>
                             <TextBlock Text="{Binding Name}" x:Name="tb" ></TextBlock>
                        </StackPanel>
                        </DataTemplate>
                        </data:DataGridTemplateColumn.CellTemplate>
                        <data:DataGridTemplateColumn.CellEditingTemplate>
                            <DataTemplate>
                            <StackPanel Loaded="sp_Loaded" x:Name="sp"  Width="150">
                                <TextBox  Width="100" Text="{Binding Name}" x:Name="tb" GotFocus="tb_GotFocus" LostFocus="tb_LostFocus"></TextBox>
                            </StackPanel>
                            </DataTemplate>    
                        </data:DataGridTemplateColumn.CellEditingTemplate>
                    </data:DataGridTemplateColumn>
                    <data:DataGridTextColumn Binding="{Binding Age}"></data:DataGridTextColumn>
                </data:DataGrid.Columns>
            </data:DataGrid>
            <Button Click="Button_Click" Width="100" Height="30"></Button>
    • 已标记为答案 狱火星 2009年12月29日 3:18
    2009年12月28日 9:21

全部回复

  • 你好,
       
          这里有个SL3的例子
     

        public partial class MainPage : UserControl
        {
    
            ObservableCollection<Person> people;
            public MainPage(){
                InitializeComponent();
                people = new ObservableCollection<Person>() {
                    new Person(){Name="Micheal",Age=11},
                    new Person(){Name="Jason",Age=11},
                    new Person(){Name="Roger",Age=11},
                    new Person(){Name="Diana",Age=11},
                    new Person(){Name="Beckham",Age=11},
                    new Person(){Name="Ronaldo",Age=11},
                };
                dg.ItemsSource = people;
            }
    
            private void tb_GotFocus(object sender, RoutedEventArgs e)
            {
                var tb = sender as TextBox;
                tb.Background = new SolidColorBrush(Colors.Blue);
            }
    
            private void tb_LostFocus(object sender, RoutedEventArgs e)
            {
                var tb = sender as TextBox;
                tb.Background = null;
            }
         
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                GetChildrenWithParentRec(dg, typeof(DataGridRow));
                ((DataGridFrozenGrid)children[1]).Background = new SolidColorBrush(Colors.Red);
            }
            private  static List<UIElement> children = new List<UIElement>();
            private static void GetChildrenWithParentRec(UIElement parent, Type targetType)
            {
                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)
                        {
                            children.Add(child);
                        }
                        GetChildrenWithParentRec(child, targetType);
                    }
                }
            }
    
            private void sp_Loaded(object sender, RoutedEventArgs e)
            {
                var sp = sender as StackPanel;
                sp.Background = new SolidColorBrush(Colors.Yellow);
            }
    
        }
       <data:DataGrid x:Name="dg"  AutoGenerateColumns="False" >
                <data:DataGrid.Columns >
                    <data:DataGridTemplateColumn>  
                        <data:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                        <StackPanel>
                             <TextBlock Text="{Binding Name}" x:Name="tb" ></TextBlock>
                        </StackPanel>
                        </DataTemplate>
                        </data:DataGridTemplateColumn.CellTemplate>
                        <data:DataGridTemplateColumn.CellEditingTemplate>
                            <DataTemplate>
                            <StackPanel Loaded="sp_Loaded" x:Name="sp"  Width="150">
                                <TextBox  Width="100" Text="{Binding Name}" x:Name="tb" GotFocus="tb_GotFocus" LostFocus="tb_LostFocus"></TextBox>
                            </StackPanel>
                            </DataTemplate>    
                        </data:DataGridTemplateColumn.CellEditingTemplate>
                    </data:DataGridTemplateColumn>
                    <data:DataGridTextColumn Binding="{Binding Age}"></data:DataGridTextColumn>
                </data:DataGrid.Columns>
            </data:DataGrid>
            <Button Click="Button_Click" Width="100" Height="30"></Button>
    • 已标记为答案 狱火星 2009年12月29日 3:18
    2009年12月28日 9:21
  • 你這是不行的,在 dg.LoadingRow或dg.UnloadingRow後就沒效了
    2009年12月28日 12:20
  • 你好, 
        
          在Unload以后重新再load的row就是完全另外一个对象了.

    2009年12月29日 1:59
  • 非常感谢Min-Hong Tang - MSFT版主!这正是我想要的答案

    2009年12月29日 3:20
  • 所以說,用滾動條滾動一下,這個顏色就不知道跑哪去了。不止第二行不是紅色,更可能是別的行變成紅色。
    2009年12月29日 8:51
  • 你好,
      
          在SL3中,dg变色与滚动条的问题一般的解决办法是将datagrid wrap到一个scrollviewer中.
          
          或者也可以使用分页,这样的话可以充分利用datagrid的性能优化

    2009年12月29日 10:04