質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

1回答

8127閲覧

【C#】DataGridCellのBackgroundが正しく表示されない場合がある【WPF】

sute

総合スコア25

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2016/04/13 02:03

lang

1<DataGrid Name="dataGrid" Canvas.Left="43" Canvas.Top="36" Height="336" Width="480" IsReadOnly="True" 2 CanUserSortColumns="False" CanUserAddRows="False" SelectionUnit="Cell" SelectionMode="Single" 3 MouseLeftButtonUp="dataGrid_MouseLeftButtonUp" LoadingRow="dataGrid_LoadingRow" > 4 <DataGrid.ColumnHeaderStyle> 5 <Style TargetType="DataGridColumnHeader"> 6 <EventSetter Event="Click" Handler="columnHeader_Click" /> 7 </Style> 8 </DataGrid.ColumnHeaderStyle> 9 <DataGrid.RowHeaderStyle> 10 <Style TargetType="DataGridRowHeader"> 11 <EventSetter Event="Click" Handler="rowHeader_Click" /> 12 </Style> 13 </DataGrid.RowHeaderStyle> 14</DataGrid>

lang

1private void columnHeader_Click(object sender, RoutedEventArgs e) 2{ 3 var columnHeader = sender as System.Windows.Controls.Primitives.DataGridColumnHeader; 4 if (columnHeader == null) 5 { 6 return; 7 } 8 9 for (int j = 0; j < this.dataGrid.Columns.Count; j++) 10 { 11 if (j != columnHeader.DisplayIndex) 12 { 13 continue; 14 } 15 16 for (int i = 0; i < this.dataGrid.Items.Count; i++) 17 { 18 this.dataGrid.ScrollIntoView(this.dataGrid.Items[i]); 19 DataGridCellInfo cellInfo = new DataGridCellInfo(this.dataGrid.Items[i], this.dataGrid.Columns[j]); 20 21 // DataGridCellInfoから該当するDataGridCellを取得 22 DataGridCell cell = getCellFromCellInfo(this.dataGrid, cellInfo); 23 24 cell.Background = new SolidColorBrush(Colors.LemonChiffon); 25 } 26 } 27}

列ヘッダーをクリックすると、該当する列に含まれるすべてのセルの背景色を変える処理を実装しています。
上記の処理ではほとんどのセルは正しく色が変わるのですが、
DataGridを上下にスクロールすると、一部のセルの背景色が変更されていませんでした。
この状態で更にそのセルが見えなくなる位置までスクロールし、再度その辺りまで戻すと、
今度は別のセルの背景色が変更されていない状態になります(さっき変更されていなかったセルは変更されている)。

どこか特定の列だけで起こっているというわけではなく、何故か最初に選択した列(2度目でも起こる場合あり)でのみ発生し、たいてい3度目以降に選択した列では上記の現象は発生しませんでした。

原因と対処がわかる方、どうかご回答の程よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

現在どのような実装になっているか全くわからないため、こうやったらできた、という例を挙げます。

  • DataGrid要素

AutoGenerateColumns="False"にして以下のように表示するクラス用にColumnsを定義します
これには、ColumnHeaderをクリックしたときにセルの色をどうするかも追加しています。

XAML

1 <DataGrid Name="dataGrid" Canvas.Left="43" Canvas.Top="36" IsReadOnly="True" 2 CanUserSortColumns="False" CanUserAddRows="False" SelectionUnit="Cell" SelectionMode="Single" AutoGenerateColumns="False"> 3 <DataGrid.ColumnHeaderStyle> 4 <Style TargetType="DataGridColumnHeader"> 5 <EventSetter Event="Click" Handler="columnHeader_Click" /> 6 </Style> 7 </DataGrid.ColumnHeaderStyle> 8 <DataGrid.RowHeaderStyle> 9 <Style TargetType="DataGridRowHeader"> 10 <EventSetter Event="Click" Handler="rowHeader_Click" /> 11 </Style> 12 </DataGrid.RowHeaderStyle> 13 <DataGrid.Columns> 14 <DataGridTextColumn Header="ID" Binding="{Binding ID}"> 15 <DataGridTextColumn.CellStyle> 16 <Style TargetType="DataGridCell"> 17 <Style.Triggers> 18 <DataTrigger Binding="{Binding IDSelected}" Value="True"> 19 <Setter Property="Background" Value="Aqua"/> 20 </DataTrigger> 21 <DataTrigger Binding="{Binding IDSelected}" Value="False"> 22 <Setter Property="Background" Value="Transparent"/> 23 </DataTrigger> 24 </Style.Triggers> 25 </Style> 26 </DataGridTextColumn.CellStyle> 27 </DataGridTextColumn> 28 <DataGridTextColumn Header="Value" Binding="{Binding Value}"> 29 <DataGridTextColumn.CellStyle> 30 <Style TargetType="DataGridCell"> 31 <Style.Triggers> 32 <DataTrigger Binding="{Binding ValueSelected}" Value="True"> 33 <Setter Property="Background" Value="Aqua"/> 34 </DataTrigger> 35 <DataTrigger Binding="{Binding ValueSelected}" Value="False"> 36 <Setter Property="Background" Value="Transparent"/> 37 </DataTrigger> 38 </Style.Triggers> 39 </Style> 40 </DataGridTextColumn.CellStyle> 41 </DataGridTextColumn> 42 </DataGrid.Columns> 43 </DataGrid>
  • DataGrid(Row)に表示するデータ

C#

1public class Item : System.ComponentModel.INotifyPropertyChanged { 2 public event PropertyChangedEventHandler PropertyChanged; 3 public void OnPropertyChanged(string name) { 4 if(PropertyChanged != null) 5 PropertyChanged(this, new PropertyChangedEventArgs(name)); 6 } 7 public int ID { get; set; } 8 public string Value { get; set; } 9 bool _IDSelected = false; 10 public bool IDSelected { 11 get { 12 return _IDSelected; 13 } 14 set { 15 _IDSelected = value; 16 OnPropertyChanged("IDSelected"); 17 } 18 } 19 bool _ValueSelected = false; 20 public bool ValueSelected { 21 get { 22 return _ValueSelected; 23 } 24 set { 25 _ValueSelected = value; 26 OnPropertyChanged("ValueSelected"); 27 } 28 } 29}
  • 表示する内容は適当にMainWindow.xaml.csに記述しています

C#

1public System.Collections.ObjectModel.ObservableCollection<Item> Data { get; set; } 2public MainWindow() { 3 Data = new System.Collections.ObjectModel.ObservableCollection<Item>(); 4 for(int i = 0; i < 1000; i++) { 5 Data.Add(new Item() { ID = i, Value = "Value" + i }); 6 } 7 InitializeComponent(); 8 dataGrid.ItemsSource = Data; 9}
  • イベントで処理する内容を書き換え

IDSelectedとValueSelectedを変えるとセルの色が変わるよって定義しているので、値を変えるだけです。

C#

1private void columnHeader_Click(object sender, RoutedEventArgs e) { 2 var header = sender as DataGridColumnHeader; 3 if(header == null) return; 4 if(header.Content.ToString() == "ID") { 5 Data.ToList().ForEach(d => { d.IDSelected = true; d.ValueSelected = false; }); 6 }else if(header.Content.ToString() == "Value") { 7 Data.ToList().ForEach(d => { d.IDSelected = false; d.ValueSelected = true; }); 8 } 9}

以上のようにしておけばスクロールでセルの色が抜けるような問題は起きませんでした。

投稿2016/11/20 11:30

Hey_CH

総合スコア437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問