none
dataGrid セルを縦に列すべてを動的に背景色を変更したい RRS feed

  • 質問

  • お世話になります。

    dataGridでセルをクリックした時、その列の背景色を変更したいのですが、どうやった出来ますか?

    おしえてください。

            private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                DataGridRow dataGridRow = dataGrid.ItemContainerGenerator.ContainerFromItem(dataGrid.CurrentCell.Item) as DataGridRow;
                DataGridCell dataGridCell = dataGrid.ItemContainerGenerator.ContainerFromItem(dataGrid.CurrentItem) as DataGridCell;
    
               // if (dataGridRow != null)
               // {
               //     DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(dataGridRow);
               //     DataGridCell cel = presenter.ItemContainerGenerator.ContainerFromItem(dataGrid.CurrentCell.Column) as DataGridCell;
               // }
    
                int row = dataGrid.Items.IndexOf(dataGrid.CurrentItem);
                int column = dataGrid.CurrentCell.Column.DisplayIndex;
    
               // var abc = dataGrid.ItemContainerGenerator.ContainerFromIndex(row);
               // var abs = dataGrid.ItemContainerGenerator.ContainerFromIndex(column);
    
    
                dataGridRow.Background = new SolidColorBrush(Colors.Red);
    
    
                //dataGrid.Background = new SolidColorBrush(Colors.Red);
                //e.Cell.Presenter.Background = new SolidColorBrush(Colors.Red);
                //e.Cell.Presenter.Foreground = new SolidColorBrush(Colors.White);
            }
    とりあえず、上記のハンドラを作成して、いろいろ試したのですが、

    DataGridCell dataGridCell がnullになりデータが取れませんでした。

    dataGridRow.Background = new SolidColorBrush(Colors.Red);これだとクリックした横の行が指定色に変更できます。

    でも、私が変更したいのは縦です。

    何か良い方法教えてください。

    Windows8/8.1 WPF C# VS2015 comunity

    2015年10月26日 6:27

回答

  • こんな

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <DataGrid ItemsSource="{Binding}" DataContext="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                      CurrentCellChanged="DataGrid_CurrentCellChanged">
                <DataGrid.Resources>
                    <!-- 行の色を優先する場合 -->
                    <Style TargetType="DataGridCell" x:Key="selectedColumnCellStyle" >
                        <Style.Triggers>
                            <Trigger Property="IsSelected" Value="false">
                                <Setter Property="Background"  Value="#7fFF0000" />
                                <Setter Property="BorderBrush" Value="#7fFF0000" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
    
                    
                    <!-- 列の色を優先する場合 -->
                    <!--<Style TargetType="DataGridCell" x:Key="selectedColumnCellStyle">
                        <Setter Property="Background"  Value="#7fFF0000" />
                        <Setter Property="BorderBrush"  Value="#7fFF0000" />
                        <Style.Triggers>   
                            <DataTrigger Binding="{Binding Path=IsKeyboardFocusWithin,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=DataGridRow}}" Value="true">
                                <Setter Property="BorderBrush" Value="Black" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>-->
                </DataGrid.Resources>
                <DataGrid.Columns>
                    <DataGridTextColumn Header="0" Binding="{Binding Mode=OneWay}" IsReadOnly="true"/>
                    <DataGridTextColumn Header="1" IsReadOnly="true" Width="50"/>
                    <DataGridTextColumn Header="2" IsReadOnly="true" Width="50"/>
                    <DataGridTextColumn Header="3" IsReadOnly="True" Width="50"/>
                    <DataGridTextColumn Header="4" IsReadOnly="True" Width="50"/>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    using System;
    using System.Windows;
    using System.Windows.Controls;
    
    namespace WpfApplication1
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void DataGrid_CurrentCellChanged(object sender, EventArgs e)
            {
                var dg = (DataGrid)sender;
                var style = (Style)dg.Resources["selectedColumnCellStyle"];
    
                foreach (DataGridColumn clm in dg.Columns)
                {
                    if (clm.CellStyle == style)
                    {
                        clm.CellStyle = null;
                    }
                }
                if (dg.CurrentColumn != null)
                {
                    dg.CurrentColumn.CellStyle = style;
                }
            }
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク ferret001 2015年10月27日 0:53
    2015年10月26日 9:04

すべての返信

  • こんにちは。

    セルを特定したいのであれば、SelectedCellsChangedを使ってはどうですか。
    同一行で列が異なるセルを選択した場合もイベントを発生させたいのですよね。

    <Grid>
        <DataGrid x:Name="dataGrid" ItemsSource="{StaticResource listSample}" 
                  SelectedCellsChanged="dataGrid_SelectedCellsChanged" 
                  SelectionUnit="Cell">
            <DataGrid.Columns>
                …
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
    

    2015年10月26日 6:55
    モデレータ
  • こんな

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <DataGrid ItemsSource="{Binding}" DataContext="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                      CurrentCellChanged="DataGrid_CurrentCellChanged">
                <DataGrid.Resources>
                    <!-- 行の色を優先する場合 -->
                    <Style TargetType="DataGridCell" x:Key="selectedColumnCellStyle" >
                        <Style.Triggers>
                            <Trigger Property="IsSelected" Value="false">
                                <Setter Property="Background"  Value="#7fFF0000" />
                                <Setter Property="BorderBrush" Value="#7fFF0000" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
    
                    
                    <!-- 列の色を優先する場合 -->
                    <!--<Style TargetType="DataGridCell" x:Key="selectedColumnCellStyle">
                        <Setter Property="Background"  Value="#7fFF0000" />
                        <Setter Property="BorderBrush"  Value="#7fFF0000" />
                        <Style.Triggers>   
                            <DataTrigger Binding="{Binding Path=IsKeyboardFocusWithin,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=DataGridRow}}" Value="true">
                                <Setter Property="BorderBrush" Value="Black" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>-->
                </DataGrid.Resources>
                <DataGrid.Columns>
                    <DataGridTextColumn Header="0" Binding="{Binding Mode=OneWay}" IsReadOnly="true"/>
                    <DataGridTextColumn Header="1" IsReadOnly="true" Width="50"/>
                    <DataGridTextColumn Header="2" IsReadOnly="true" Width="50"/>
                    <DataGridTextColumn Header="3" IsReadOnly="True" Width="50"/>
                    <DataGridTextColumn Header="4" IsReadOnly="True" Width="50"/>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    using System;
    using System.Windows;
    using System.Windows.Controls;
    
    namespace WpfApplication1
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void DataGrid_CurrentCellChanged(object sender, EventArgs e)
            {
                var dg = (DataGrid)sender;
                var style = (Style)dg.Resources["selectedColumnCellStyle"];
    
                foreach (DataGridColumn clm in dg.Columns)
                {
                    if (clm.CellStyle == style)
                    {
                        clm.CellStyle = null;
                    }
                }
                if (dg.CurrentColumn != null)
                {
                    dg.CurrentColumn.CellStyle = style;
                }
            }
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク ferret001 2015年10月27日 0:53
    2015年10月26日 9:04
  • gekka様、まさにこの動作です。

    貴重なサンプルありがとうございます。

    2015年10月27日 0:53