朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら
WPF VisualStudio2010のDataGridのセルにアクセスする方法





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








良いやや良い普通やや悪い悪い
1 0 1 1 0

投稿日時評価コメント