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
