FlexGrid for WinForms
FlexGrid 間の比較
機能の比較 > FlexGrid 間の比較

VSFlexGrid(ActiveX)と C1FlexGrid(.NET)

ComponentOne は、FlexGrid コントロールの ActiveX 版と .NET 版を提供しています。ActiveX 版は「VSFlexGrid」、.NET 版は「C1FlexGrid」という名前で公開されています。後から登場した .NET 版の C1FlexGrid は、既存の VSFlexGrid を移植するのではなく、まったく新しいグリッドコントロールとして作成されています。これは C# で一から記述されており、同じ設計原則に基づきながら、ActiveX コントロールよりモダンでクリーン、かつ強力な新しいオブジェクトモデルを備えています。

このセクションは、アプリケーションを ActiveX から .NET 版、つまり C1FlexGrid コントロールに移行したいと考えている既存の VSFlexGrid ユーザーのためのガイドです。手間のかからない円滑な移行とスムーズな学習を図ることができるように、.NET 版には C1FlexGridClassic コントロールが用意されています。このコントロールは、C1FlexGrid クラスから派生され、VSFlexGrid コントロールとほぼ同じオブジェクトモデルを提供します。新しいオブジェクトモデルの使用方法を正しく理解できるように、C1FlexGridClassic コントロールの製品サンプルが「Classic(クラシック)」として用意されています。C1FlexGrid クラスに基づいてカスタムグリッドコントロールを作成する際に、このサンプルを見本として使用することもできます。

メモ: ComponentOneControlPanel.exe を使用して WinForms Edition をインストールする際にサンプルをインストールした場合、「クラシック」サンプルは、システムの \Documents\ComponentOne Samples\WinForms\v4.5.2\C1FlexGrid\CS にあります。

アプリケーションを新しく作成する場合は、新しい C1FlexGrid コントロールを使用することをお勧めします。ただし、既存のアプリケーションを ActiveX から .NET に移植する場合は、プログラミング作業が最小限で済むように C1FlexGridClassic コントロールを使用することをお勧めします。次の表に、VSFlexGrid と C1FlexGrid の主な違いを列挙します。

VSFlexGrid(ActiveX) C1FlexGrid(.NET)
行/列
  1. Rows プロパティと Cols プロパティを使用して行数と列数を取得または設定します。
  2. VSFlexGrid は TextMatrix プロパティを使用して行と列を表します。

たとえば、ActiveX では以下のように記述します。

Dim r%, c% c = 1
For r = c1FlexGrid1.FixedRows To c1FlexGrid1.Rows - 1
Debug.Print c1FlexGrid1.TextMatrix(r,c)
Next

  1. C1FlexGrid では、Rows プロパティと Cols プロパティは、それぞれ行と列のコレクションを返します。これらのコレクションには、各コレクションの要素数と固定要素数を返す読み取り/書き込みプロパティがあります。
  2. C1FlexGrid はインデクサを使用して行と列を表します。

たとえば、.NET では以下のように記述します。

Dim c As Integer = 1
For r = c1FlexGrid1.Rows.Fixed To c1FlexGrid1.Rows.Count - 1
Debug.Print(c1FlexGrid1(r, c))
Next

セル/セル範囲

Cell プロパティは、VSFlexGrid オブジェクトモデルの最も強力な要素の 1 つです。これを使用すると、任意のセルまたはセル範囲の任意のプロパティを 1 つのコマンドで取得または設定できます。単一のプロパティを使用するということは、バリアントを使用するということです。これにより、コードの作成中に何か間違いがあっても、細かな問題の多くをコンパイラが捕捉できなくなります。

たとえば、ActiveX では以下のように記述します。

flex.Cell(flexcpPicture, 5, 5, 10, 10)
= theImage

C1FlexGrid では、Cell プロパティの代わりに CellRange オブジェクトが、セル範囲にアクセスするためのタイプセーフなプロパティとメソッドを公開しています。したがって、theImage 変数に画像ではなく文字列が含まれていると、実行時エラーではなくコンパイラエラーが発生します。また、各プロパティの型が既知なので、コードを記述する際にコマンド補完が働きます。

たとえば、.NET では以下のように記述します。

Dim rg As CellRange
rg = c1FlexGrid1.GetCellRange(5,5,10,10)
rg.Image = theImage

列の型指定 ActiveX 版では、ColDataType プロパティを使用して、各列に含まれるデータの型を設定できます。この情報は、データまたは数値が含まれている列をソートする際に主に使用されます。

.NET 版では、列が保持するデータの型は Cols[i].DataType プロパティによって決定されます。デフォルトで、すべての列の DataType プロパティは「object」に設定されています。つまり、任意の列に任意の型のデータを格納できます。データ型を特定の型に設定することは可能です。ただし、グリッドは、グリッド内に格納されたデータを適切な型に強制変換しようとします。

たとえば、.NET では以下のように記述します。

c1FlexGrid1.Cols(2).DataType = GetType(Integer)
' 値を 12
に設定します c1FlexGrid1(1, 2) = "12"
' 文字列「hello」は整数に変換できません
' GridError イベントが発生します
' 元の値が維持されます
c1FlexGrid1(2, 2) = "hello"

スタイル

VSFlexGrid では、Cell プロパティを使用して個々のセルやセル範囲の外観をカスタマイズします。

たとえば、ActiveX では以下のように記述します。

//2 番目の行の背景色を設定します
c1FlexGrid1.Cell(flexcpBackColor, 2, 0, 2,
c1FlexGrid1.Cols-1) = vbRed

デメリット:

すべての赤色セルの外観を変更するには、すべてのスタイルをクリアしてやり直すか、赤色セルをスキャンして外観を変更する必要があります。

C1FlexGrid では、セルの外観は CellStyle オブジェクトを使用してカスタマイズします。

たとえば、.NET では以下のように記述します。

//セルスタイルを作成します
Dim redStyle As CellStyle = c1FlexGrid1.Styles
.Add("Red")
redStyle.BackColor = Color.Red
//2 番目の行の背景色を設定します
c1FlexGrid1.Rows(2).Style = redStyle

メリット:

このアプローチの主な利点は、新しいスタイルは、変更したり新しい範囲に割り当てることができるオブジェクトだということです。たとえば、赤色セルの前景色とテキストフォントを変更する場合は、以下のように記述します。

c1FlexGrid1.Styles("Red").ForeColor = Color.White
c1FlexGrid1.Styles("Red").Font = new Font("Arial", 9)

VSFlexGrid コントロールには、グリッドの表示方法に影響する多くのプロパティがありました(BackColor、BackColorAlternate、BackColorBkg、BackColorFixed、BackColorFrozen、BackColorSel など)。 C1FlexGrid コントロールでは、これらのプロパティはすべて CellStyle オブジェクトのコレクションに置き換えられます。したがって、Styles.Fixed.BackColor または Styles.Highlight.ForeColor のような記述が可能です。これにより、オブジェクトモデルがよりシンプルで一貫性が高く、さらに強力になります。組み込みスタイルを変更したり、カスタムスタイルを定義して行、列、または任意のセル範囲に割り当てることができます。