データ ソースを xamPivotDataSelector™ に割り当てる場合、データ ソースのすべての項目 (Measures、Dimensions、Hierarchies など) が自動的にメタデータ ツリーに追加されます。このトピックは、どの項目をメタデータ ツリーに含め、どの項目を含めないか選択する方法を説明します。
以下の表に、このトピックを理解するための前提条件として求められるトピックをリストします。
このトピックには次のセクションがあります。
どの項目を xamPivotDataSelector のメタデータ ツリーに追加するかは DataSource プロパティに割り当てられているデータ ソースから制御します。これは MetadataTreeItemAdding イベントに加入することで実現します。さらに、 ResetMetadataTree メソッドが使用できます。
データ選択ウィザードが初期化中の場合、項目がデータ選択ウィザードのメタデータ ツリーに追加される前に必ず MetadataTreeItemAdding
イベントが発生します。イベントとともに提供されている MetadataTreeEventArgs インスタンスには、追加中の項目への参照と、項目の追加を中断できる Cancel プロパティが入っています。追加中の Item を予想し、それをメタデータ ツリーに含めるかどうか判断することとは別に、MetadataTreeItemAdding
イベントのイベント ハンドラーで、項目を初期化後に展開するかどうか指定することもできます。
初期化後に xamPivotDataSelector のメタデータ ツリーの項目を変更する場合は、ResetMetadataTree
メソッドを呼び出すことができます。これにより、データ ソースのすべての項目がメタデータ ツリーに再度追加され、項目ごとに再度 MetadataTreeItemAdding
イベントが発生します。
以下のスクリーンショットは xamPivotDataSelector のプレビューです。ここでは、メタデータ ツリーに追加された項目のみ AmountOfSale メジャーおよび Seller 階層と City 階層になっています。SalesDataSample クラスからのデータ ソースが使用されます。
手順を完了するには、データ ソースとして SalesDataSample
クラスを備えた xamPivotGrid コントロールと xamPivotDataSelector コントロールが構成された WPF アプリケーションが必要です。
このトピックでは、ある定義済みの基準を満たす項目のみメタデータ ツリーに追加されている MetadataTreeItemAdding
イベントのイベント ハンドラーを作成する方法を手順を追って説明します。以下はプロセスの概念的概要です。
MetadataTreeItemAdding イベントのイベント ハンドラーの追加。
追加中の項目の検査とその項目を含めるかどうかの判断。
以下の手順は、定義済みの項目のリストのみメタデータ ツリーに追加するために、MetadataTreeItemAdding
イベントを使用する方法を紹介します。
MetadataTreeItemAdding イベントのイベント ハンドラーを追加します。
通常は、ページをそのコンストラクターなどに読み込む前にこのイベントに加入します。こうして、xamPivotDataSelector の初期化中に確実にイベントを発行させることができます。
ResetMetadataTree
メソッドを呼び出す前に、後でいつでもこのイベントに加入することもできます。
追加中の項目を検査し、その項目を含めるかどうか判断します。
上記のように、MetadataTreeItemAdding
イベントの発生とともに提供されるイベント引数には、追加中の実際の項目への参照が含まれています。その ItemType プロパティと Caption プロパティの値を期待できますが、これでも項目を含めるかどうか判断するのに十分でない場合は、Hierarchy、Dimension、Level など、基礎となる DataObject を期待できます。
以下のコードは、特定の項目のみデータ選択ウィザードのメタデータ ツリーに追加する方法の例です。
C# の場合:
Code
using System.Windows.Controls;
using Infragistics.Olap;
using Infragistics.Olap.FlatData;
using Infragistics.Olap.Data;
using Infragistics.Samples.Data.Models;
using System.Linq;
…
// これをページのコンストラクターに配置します。
((FlatDataSource)dataSelector.DataSource).MetadataTreeItemAdding += DataSelector_MetadataTreeItemAdding;
…
private static string[] allowedMeasureNames = { "Measures", "AmountOfSale" };
private static string[] allowedDimensionNames = { "[Seller]", "[City]" };
private static string[] allowedHierarchyNames = { "[Seller].[Seller]", "[City].[City]" };
void DataSelector_MetadataTreeItemAdding(object sender, Infragistics.Olap.MetadataTreeEventArgs e)
{
if (e.Item.ItemType == ItemTypes.Measure &&
allowedMeasureNames.Contains(e.Item.Caption))
return;
if (e.Item.ItemType == ItemTypes.Dimension
&& allowedDimensionNames.Contains(((IDimension)e.Item.DataObject).UniqueName))
{
e.Item.ExpandWhenInitialized = true;
return;
}
if (e.Item.ItemType == ItemTypes.UserDefinedHierarchy
&& allowedHierarchyNames.Contains(((IHierarchy)e.Item.DataObject).UniqueName))
return;
e.Cancel = true;
}
// メタデータ ツリーをリセットする場合は、以下のメソッドを呼び出します。
// ((DataSourceBase)this.pivotGrid.DataSource).ResetMetadataTree();
Visual Basic の場合:
Imports System.Windows.Controls
Imports Infragistics.Olap
Imports Infragistics.Olap.FlatData
Imports Infragistics.Olap.Data
Imports Infragistics.Samples.Data.Models
Imports System.Linq
…
' Place this in the constructor of the page.
AddHandler DirectCast(dataSelector.DataSource, FlatDataSource).MetadataTreeItemAdding, AddressOf DataSelector_MetadataTreeItemAdding
…
Private Shared allowedMeasureNames As String() = {"Measures", "AmountOfSale"}
Private Shared allowedDimensionNames As String() = {"[Seller]", "[City]"}
Private Shared allowedHierarchyNames As String() = {"[Seller].[Seller]", "[City].[City]"}
Private Sub DataSelector_MetadataTreeItemAdding(sender As Object, e As Infragistics.Olap.MetadataTreeEventArgs)
If e.Item.ItemType = ItemTypes.Measure AndAlso allowedMeasureNames.Contains(e.Item.Caption) Then
Return
End If
If e.Item.ItemType = ItemTypes.Dimension AndAlso allowedDimensionNames.Contains(DirectCast(e.Item.DataObject, IDimension).UniqueName) Then
e.Item.ExpandWhenInitialized = True
Return
End If
If e.Item.ItemType = ItemTypes.UserDefinedHierarchy AndAlso allowedHierarchyNames.Contains(DirectCast(e.Item.DataObject, IHierarchy).UniqueName) Then
Return
End If
e.Cancel = True
End Sub
' If you want to reset the metadata tree and call the following method:
' DirectCast(dataSelector.DataSource, DataSourceBase).ResetMetadataTree()