バージョン

Excel の様な数式サポート

概要

計算列には数式が関連付けられています。たとえば、"Total Cost" というアンバインド列の Formula プロパティに "[Units] * [UnitPrice]" という数式を設定できます。こうすると、"Total Cost" 列のセルに、同じ行の Units 列と UnitPrice 列の各セルの積が自動的に表示されます。

さらに、現在共有されている既存のsum、average、min、max、countなどの基本的な計算式よりも複雑な列集計数式のサポートが追加されました。

単純なバインドコントロールを共有計算ネットワークに組み込みたいという要望もありました。さらに、単純なバインド コントロールを共有計算ネットワークに組み込みたいという要望に応えて、たとえばテキスト ボックスに全体的な係数値を入力し、それを同じフォーム上のグリッドの数式から参照できるようになりました。

CalcEngine の設計にあたっては、以下のデザイン制約が設けられました。

デザイン制約

  • 機能が使用されない場合に不都合が生じないように実装する必要がある(つまり、WebGrid™ が別のアセンブリを参照しないようにする)。

  • CalcEngine を使用する際に、グリッド アセンブリを参照するという"オーバーヘッド"が発生しないようにする。

  • Excel と同様の関数を数多く含む関数ライブラリを提供する。

  • デザイン時にも実行時にも数式を指定できるようにする。デザイナーにはFormula Builderが組み込まれていて、ユーザーは数式の構文規則を覚える必要はない。

  • 提供される関数ライブラリにはユーザー定義関数を追加することができ、それらのユーザー定義関数をデザインタイムにコードから使用できるようにする。

  • 再計算ロジックを実装する。Win フォーム実装では、時間のかかる再計算処理中にユーザー インターフェイスがブロックされないように非同期オプションを提供する。

全体的なアプローチ

数式は主に WebGrid 要素で使用することを目的としていますが、その他のコントロールでも使用できます。テキスト ボックス、ラベル、WebEditors™ などの単純なバインド コントロールは、数式をサポートするために何の変更も必要ありません。WebGrid などの複雑なコントロールやコンポーネントは、数式をサポートするためにオブジェクト モデルの変更が必要になります。

この機能は主に、UltraCalcEngine クラス、 UltraWebCalcManager コンポーネント、および数式デザイナーによって公開されています。

  • UltraCalcEngine はクラスであり、コンポーネントやコントロールではありません。UltraCalcEngine は計算ネットワークを表し、数式のコンパイル、数式の評価、数式評価時の値のソースまたは数式評価のターゲットとなる参照オブジェクトの管理などを実行します。通常の手順では実現できない高度なタスクを実行する場合を除き、普通は UltraCalcEngine とやり取りするコードを記述することはありません。また、UltraCalcEngine と UltraCalcManager コンポーネントやグリッドとのやり取りを認識する必要はありません。

  • UltraCalcManager コンポーネントは、フォーム上のコントロールで数式を利用する場合にユーザーがフォームのコンポーネント トレイでインスタンス化します。

注: グリッド デザイナーから数式デザイナーを起動するときにフォーム上に UltraCalcManager コンポーネントが存在しなければ、このコンポーネントを追加するよう求められます。

すべての UltraCalcManager に対して UltraCalcEngine が 1 つずつ作成され、関連付けられます。UltraCalcManager コンポーネントは、UltraGrid や数式機能をサポートするその他のコントロールに対して、数式をコンパイルして評価する手段を提供します。また、.NET エクステンダー アーキテクチャを通じて、スタンドアローン コントロールに数式サポートを提供します。これにより、個々のスタンドアローン コントロールにエクステンダー プロパティが追加されます。これには、コントロールを計算ネットワークに組み込むかどうかを指定するプロパティ、数式を指定するプロパティ、値の取得(または設定)に使用するコントロールのプロパティを指定するプロパティなどがあります。数式が指定されると、UltraCalcManager はその数式を評価した結果をコントロールの指定されたプロパティに設定します。数式が指定されていない場合、そのコントロールはフォーム上の他の数式に値を提供するソースとして使用できます。もちろん、数式を持つコントロールも他の数式の値のソースにすることができます。数式の依存関係は UltraCalcEngine によって維持されるため、適切な順序で数式が計算されます。1 つのフォームまたはユーザー コントロールに配置できる UltraCalcManager コンポーネントは 1 つだけです。また、複数のフォームにまたがる数式はサポートされていません。たとえば、あるフォームの数式から、別のフォームの再計算ネットワークの項目を直接参照することはできません。 * 数式デザイナーは単独のクラスやエンティティではなく、ダイアログやUI型エディターなどのデザイン時関連インフラストラクチャを1つにまとめたもので、数式を簡単に入力するための仕組みを提供します。数式はグリッド列やスタンドアローン コントロールに対して指定できるほか、いわゆる"名前付き参照"を作成するときにも使用できます。名前付き参照は通常、特定の値や数式を、他の数式で使用できる識別子に関連付けるときに使用します。たとえば、PI という識別子を値 3.14 に関連付けて、それを列数式の中で "[PI] * 2 * [radius]" のように参照できます。

全般的なコードの説明

数式は 1 つの値に評価される(結果的に 1 つの値になる)右辺値式です。したがって、数式に値を割り当てることはできません。数式の例としては、"[Quantity] * [Price]"、"SUM([Total])" および "AVG([Price])" などが挙げられます。後でわかるように、数式とは、実行する計算を指定する単なる文字列です。数式には専用の構文が定義されています。この構文は Microsoft Excel などのスプレッドシートでよく見られる標準的な構文と似ていますが、WinGrid はスプレッドシート コントロールではないため、若干の違いがあります。識別子はすべて角カッコで囲まれます。たとえば上記の最初の例では、[Quantity] と [Price] が識別子です。2 番目と 3 番目の例の SUM と AVG は関数です。Infragistics には、Microsoft Excel で提供されているのと同じ関数が数多く用意されています。これらの関数は名前も引数も Microsoft Excel の関数と同じです。そのため、Microsoft Excel の関数に慣れているユーザーは、Infragistics の関数を同じように利用して数式を簡単に作成できます。

数式の評価に使用される値のソース、または数式の評価結果のターゲットとなるオブジェクトのことを参照といいます。Formula プロパティが設定されている列のセルが数式評価のターゲットとなります。列に設定された数式が列内のセルごとに評価され、その評価の結果がセルの値として設定されます。これらの数式列のセルを他の数式の値のソースにすることもできます。計算順序を正しく認識するため、数式の依存関係が UltraCalcEngine によって維持されます。実装の観点から見ると、参照は IUltraCalcReference インターフェイスを実装するオブジェクトといえます。プログラム開発で数式を使用する際にこのインターフェイスを意識する必要はありません。

前述の名前付き参照は、UltraCalcManager によって管理された、IUltraCalcReference インターフェイスを実装する参照オブジェクトです。UltraCalcManager は名前付き参照を、その名前をキーとする参照コレクションとして公開します。名前付き参照はデザインタイムに UltraCalcManager のユーザー インターフェイスを通じて追加できます。名前付き参照には、定数値や数式を含めることができます。

アセンブリの依存関係の追加を最小限に抑えるため、コード/アセンブリ構成が見直され、UltraCalcEngine クラスと UltraCalcManager コンポーネントをどちらも含む Infragistics.Win.UltraCalcEngine という名前の単独のアセンブリが新たに作成されました。Web フォームにも同様の名前のアセンブリがあります。WinGrid や数式サポートを提供するその他のコントロールは、このアセンブリに依存しません。ただし WinGrid は、数式のコンパイルや評価、参照管理などのために UltraCalcManager と通信する必要があります。Infragistics.WebUI.Shared アセンブリで定義される  IUltraCalcManager などのインターフェイスから実行されます。

Shared アセンブリで定義されているインターフェイス

  • UltraCalcManager は IUltraCalcManager を実装しています。UltraGridは、数式のコンパイルや評価、参照管理などのために、IUltraCalcManagerインターフェイスを通じてCalcEngineと通信します。

  • IUltraCalcReferenceは、数式評価のソースまたはターゲットとなりうるオブジェクトに実装されます。また、他の参照オブジェクトへの論理的な経路を構成するオブジェクトも IUltraCalcReference を実装します。このグリッドでは、グリッド、バンド、列、行、セル、および集計を表すオブジェクトがそれぞれ IUltraCalcReference を実装しています。

  • IUltraCalcParticipantインターフェイスはUltraGridに実装されています。IUltraCalcParticipant には、CalcManager という名前の IUltraCalcManager 型のプロパティがあります。UltraCalcManager は、フォーム上にある UltraGrid、および IUltraCalcParticipant インターフェイスを実装するその他のコントロールのすべてのインスタンスについて、CalcManager プロパティに自分自身を設定します。これによって実装元コントロールが CalcManager と通信できるようになります。これは半信頼的なシナリオに対応するために不可欠です。

注: UltraCalcManager のインスタンスは各フォームに1つしか配置できません。ユーザーがフォームに新しいインスタンスを追加しようとすると、UltraCalcManager がすでにフォーム上に存在するかどうかがチェックされ、存在する場合はコンストラクターに例外がスローされます。コンストラクターに例外がスローされると、IDE でのコンポーネントの追加が失敗し、ユーザーにエラー メッセージが表示されます。