Visual Studio 2010のDataGridの場合のセルの背景の色を一つずつ変える方法を示しています。
ここでは、DataGridで表示するデータをNorthwindにしています。
それについては次を参考にしてください。
チュートリアル: DataGrid コントロールで SQL Server データベースのデータを表示する
Visual Studio 2008でのToolkitのDataGridのセルにアクセスする方法は以下のリンクを参考にしてください。
VisualStudio2008のDataGridのセルにアクセスする方法
C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Data; using System.Data.Objects; namespace WPF_DataGrid { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { //データベースからデータを取得するための変数 NorthwindEntities ent = new NorthwindEntities(); public MainWindow() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { ObjectQuery<employees> emps = ent.Employees; var query = from emp in emps orderby emp.City select new { emp.EmployeeID, emp.FirstName, emp.City }; dataGrid1.ItemsSource = query.ToList(); } private void dataGrid1_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { //ここでは、クリックしたセルのデータと同じデータのセルの背景色を赤にする処理をしています。 //どうやってセルにアクセスすればよいのかは感じてもらえればと思います。 //DataGridのSelectionUnitがCellであることを想定しています。 DataGrid dg = sender as DataGrid; //クリックしたセルの列のインデックスを取得 int columnIndex = dg.Columns.IndexOf(e.AddedCells[0].Column); //DataGrid上での行番号を表す変数 int index = -1; //選択されたセルのある行に入っているオブジェクトを取得。 //データベースからLINQで取得した時に無名クラスで一行を表していたので、 //そのクラスがここに現れる。 object o = e.AddedCells[0].Item; //選択された行のクラスと同じものであればそこが行番号になる。 for (int i = 0; i < dg.Items.Count; i++) { if (dg.Items[i] == o) { index = i; break; } } //DataGridの行オブジェクトを取得 DataGridRow dgr = dg.ItemContainerGenerator.ContainerFromIndex(index) as DataGridRow; //選択されているセルの内容を取得 string data = ((TextBlock)e.AddedCells[0].Column.GetCellContent(dgr)).Text; DataGridCell dgc = null; DataGridRow temp; string strTemp; for (int i = 0; i < dg.Items.Count; i++) { //行のインデックスから行を取得する temp = dg.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow; //今の行のデータを取得 strTemp = ((TextBlock)dg.Columns[columnIndex].GetCellContent(temp)).Text; //コンテナがDataGridCellなのでこのようにして取得 dgc = dg.Columns[columnIndex].GetCellContent(temp).Parent as DataGridCell; //同じデータなら全て色を変えるなら直下のコメントようにする。 //クリックされたものだけならコメントになっていないようにする。 //if (strTemp == data) if (strTemp == data && temp == dgr) { //赤い色に設定 dgc.Background = new SolidColorBrush(Colors.Red); } else { //選択されていないところは白に設定 dgc.Background = new SolidColorBrush(Colors.White); } } } } }
VB.NET
Imports System.Data Imports System.Data.Objects Imports System.Linq Class MainWindow 'データベースからデータを取得するための変数 Dim ent As NorthwindEntities = New NorthwindEntities Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded Dim emps As ObjectQuery(Of Employees) = ent.Employees Dim query = From emp In emps _ Order By emp.City _ Select New With {emp.EmployeeID, emp.FirstName, emp.City} dataGrid1.ItemsSource = query.ToList() End Sub Private Sub dataGrid1_SelectedCellsChanged(sender As System.Object, e As System.Windows.Controls.SelectedCellsChangedEventArgs) Handles dataGrid1.SelectedCellsChanged 'ここでは、クリックしたセルのデータと同じデータのセルの背景色を赤にする処理をしています。 'どうやってセルにアクセスすればよいのかは感じてもらえればと思います。 'DataGridのSelectionUnitがCellであることを想定しています。 Dim dg As DataGrid = CType(sender, DataGrid) 'クリックしたセルの列のインデックスを取得 Dim columnIndex As Integer = dg.Columns.IndexOf(e.AddedCells(0).Column) 'DataGrid上での行番号を表す変数 Dim index As Integer = -1 '選択されたセルのある行に入っているオブジェクトを取得。 'データベースからLINQで取得した時に無名クラスで一行を表していたので、 'そのクラスがここに現れる。 Dim o As Object = e.AddedCells(0).Item '選択された行のクラスと同じものであればそこが行番号になる。 For i As Integer = 0 To dg.Items.Count - 1 Step 1 If dg.Items(i) Is o Then index = i Exit For End If Next i 'DataGridの行オブジェクトを取得 Dim dgr As DataGridRow = CType(dg.ItemContainerGenerator.ContainerFromIndex(index), DataGridRow) '選択されているセルの内容を取得 Dim data As String = CType(e.AddedCells(0).Column.GetCellContent(dgr), TextBlock).Text Dim dgc As DataGridCell = Nothing Dim temp As DataGridRow Dim strTemp As String For i As Integer = 0 To dg.Items.Count - 1 Step 1 '行のインデックスから行を取得する temp = CType(dg.ItemContainerGenerator.ContainerFromIndex(i), DataGridRow) '今の行のデータを取得 strTemp = CType(dg.Columns(columnIndex).GetCellContent(temp), TextBlock).Text 'コンテナがDataGridCellなのでこのようにして取得 dgc = CType(dg.Columns(columnIndex).GetCellContent(temp).Parent, DataGridCell) '同じデータなら全て色を変えるなら直下のコメントようにする。 'クリックされたものだけならコメントになっていないようにする。 'If strTemp = data Then If strTemp = data And temp Is dgr Then '赤い色に設定 dgc.Background = New SolidColorBrush(Colors.Red) Else '選択されていないところは白に設定 dgc.Background = New SolidColorBrush(Colors.White) End If Next i End Sub End Class