前提・実現したいこと
WPF、C#でDataTableを使用したDataGridを表示しています。
セルの値によって背景色を設定したく、DataGridに表示された値のセルを
すべて評価してスタイルを指定しています。
画面上に収まる行数のデータであれば問題なく想定通りに表示されますが、
行数が増えてスクロールが表示されるとスクロールする度に
行単位で背景色があちこち動いてしまいます。
スクロールがある場合でもセルの背景色をずれないように設定する方法はないでしょうか。
※ビヘイビアは以下サイトを参考にさせていただいています。
https://www.paveway.info/entry/2019/05/08/wpf_getcellcontent
該当のソースコード
XAML
1<DataGrid Grid.Row="2" Margin="5" HorizontalAlignment="Left" VerticalAlignment="Top" 2 x:Name="dataGrid" CanUserAddRows="False" CanUserDeleteRows="True" 3 ItemsSource="{Binding DataTable.DefaultView}" SelectedIndex="{Binding SelectedIndex}" 4 AutoGenerateColumns="True" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" 5 SourceUpdated="dataGrid_SourceUpdated" CurrentCellChanged="dataGrid_CurrentCellChanged" 6 FontSize="28" IsReadOnly="{Binding IsReadOnly}" FrozenColumnCount="4" 7 PreviewKeyDown="dataGrid_PreviewKeyDown"> 8 9 <DataGrid.CellStyle> 10 <Style TargetType="DataGridCell"> 11 <Style.Triggers> 12 <Trigger Property="Name" Value="Cell0"> 13 <Setter Property="Background" Value="Transparent"/> 14 </Trigger> 15 <Trigger Property="Name" Value="Cell1"> 16 <Setter Property="Background" Value="Red"/> 17 </Trigger> 18 <Trigger Property="Name" Value="Cell2"> 19 <Setter Property="Background" Value="Yellow"/> 20 </Trigger> 21 <Trigger Property="Name" Value="Cell3"> 22 <Setter Property="Background" Value="Blue"/> 23 </Trigger> 24 <Trigger Property="Name" Value="Cell4"> 25 <Setter Property="Background" Value="Aqua"/> 26 </Trigger> 27 </Style.Triggers> 28 </Style> 29 </DataGrid.CellStyle> 30</DataGrid>
C#
1int i = 0; 2int j = 0; 3foreach (DataRowView item in dataGrid.Items) 4{ 5 foreach (var col in item.Row.ItemArray) 6 { 7 var row = dataGrid.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow; 8 // 行オブジェクトが取得できない場合 9 if (row == null) 10 { 11 // 対象の行が表示されていない場合、行オブジェクトが取得できないため 12 // 対象の行が表示されるようスクロールします。 13 dataGrid.UpdateLayout(); 14 dataGrid.ScrollIntoView(dataGrid.Items[i]); 15 // 再度、行オブジェクトを取得します。 16 row = dataGrid.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow; 17 } 18 19 string tmp = col.ToString(); 20 if (tmp.IndexOf(",") > 0) 21 { 22 // データグリッドのセルオブジェクトを取得します。 23 var cell = dataGrid.Columns[j].GetCellContent(row); 24 // データグリッドのセルオブジェクトが取得できない場合 25 if (cell == null) 26 { 27 // 対象のセルが表示されていない場合、セルオブジェクトが取得できないため 28 // 対象のセルが表示されるようスクロールします。 29 dataGrid.UpdateLayout(); 30 dataGrid.ScrollIntoView(dataGrid.Columns[j]); 31 // 再度、セルオブジェクトを取得します。 32 cell = dataGrid.Columns[j].GetCellContent(row); 33 } 34 TextBlock textBlock = cell as TextBlock; 35 string text = textBlock.Text; 36 37 if (!string.IsNullOrWhiteSpace(text)) 38 {// 値が入っている 39 // テキストの値ででセルの色を変える 40 switch (text) 41 { 42 case "1": 43 (cell.Parent as DataGridCell).Name = "Cell1"; 44 break; 45 case "2": 46 (cell.Parent as DataGridCell).Name = "Cell2"; 47 break; 48 case "3": 49 (cell.Parent as DataGridCell).Name = "Cell3"; 50 break; 51 case "4": 52 (cell.Parent as DataGridCell).Name = "Cell4"; 53 break; 54 default: 55 (cell.Parent as DataGridCell).Name = "Cell0"; 56 break; 57 } 58 } 59 } 60 j++; 61 } 62 i++; 63 j = 0; 64} 65 66// スクロールを一番上に戻す 67dataGrid.UpdateLayout(); 68dataGrid.ScrollIntoView(dataGrid.Items[0]);
試したこと
DataGrid自体のスクロールを禁止にして、ScrollViewerを親に設定してみましたが
この方法だと想定通りに背景色は適用されました。
しかし、ヘッダーが固定にならない、横スクロールがある場合最下部までスクロールしないと
横スクロールできないという問題が発生し断念しました。
以上、どうぞよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー