🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
DataGrid

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

C#

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

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

WPF

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

Q&A

解決済

1回答

7488閲覧

【WPF】【C#】DataGridCellでセルの背景色を変えた際にスクロールがあるとスクロールの度にずれる

pirorikin

総合スコア0

DataGrid

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

C#

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

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

WPF

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

0グッド

0クリップ

投稿2021/03/30 06:03

前提・実現したいこと

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を親に設定してみましたが
この方法だと想定通りに背景色は適用されました。
しかし、ヘッダーが固定にならない、横スクロールがある場合最下部までスクロールしないと
横スクロールできないという問題が発生し断念しました。

以上、どうぞよろしくお願いいたします。

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

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

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

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

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

hihijiji

2021/03/30 08:46

試しに VirtualizingStackPanel.VirtualizationMode="Standard"に してみて下さい。 遅くて使い物にならないかもしれませんが…
Hey_CH

2021/03/30 11:40

.NET Framework 4.8 では VirtualizingStackPanel.VirtualizationModeが無かったので(4.0にはあったので古いのかも?) VirtualizingPanel.VirtualizationMode="Standard"にしたらいけました。報告まで。
pirorikin

2021/03/31 01:14

hihijiji様、Hey_CH様 VirtualizingStackPanel(VirtualizingPanel)を設定して思った通りの動作を確認できました! hihijiji様の遅いかもしれないとのお話でしたが、今回使用するデータ量的ではさほど気になりませんでした。 なかなか思う情報が見つけられなかったので非常に助かりました。 ありがとうございました!!
guest

回答1

0

自己解決

DataGridに以下を設定

XAML

1VirtualizingPanel.VirtualizationMode="Standard"

hihijiji様、Hey_CH様ありがとうございました!

投稿2021/03/31 07:02

pirorikin

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問