FlexGrid for WinForms 2017.01.24 更新 グレープシティ株式会社 FlexGrid for WinForms 目次 はじめに 12 主な特長 13-14 製品の概要 15 製品構成 15 新機能と変更点 15 5.0Jで更新された内容 クラスメンバ 23-24 サンプル 24-25 4.0J で更新された内容 クラスメンバ 25-32 32-35 3.0Jで更新された内容 35-38 2.0Jで更新された内容 38-39 VS-FlexGrid ProからFlexGrid for WinForms へ 39-40 FlexGridの.NET 製品とActiveX製品の相違点 40 スタイル 40-41 セル範囲 41-43 型付けした列 44 C1FlexGridとC1FlexGridClassic 44 プロパティ比較一覧 44-55 メソッド比較一覧 55-57 イベント比較一覧 57-59 クイックスタート 手順 1: C1FlexGrid を使用したアプリケーションを作成する 60 60 手順 2: C1FlexGrid をデータソースに連結する 60-66 手順 3: C1FlexGrid の設定をカスタマイズする 66-68 設計時のサポート エディタ 69 69 列エディタ 69-70 スタイルエディタ 71-72 キャプションスタイルと列スタイル 72-76 スマートタグ 1 15-23 76 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C1FlexGrid タスク 76-80 Column タスク 80-85 基本操作 86-88 行と列 88-89 列のサイズ変更 90-92 セルの範囲 92 セルのイメージ 92 92-93 セルの内容 93-94 セルの外観 94-96 条件付きの書式設定 96-97 オーナー描画セル 97-99 セルの編集 99-100 リストボックスとコンボボックス 100-101 チェックボックス 101-102 マップリスト 102-105 セルボタン 105-106 マスク 106-108 入力値の正当性検査 108-109 カスタムエディタ 109-111 カスタムエディタの作成 編集モードの制御 セルのマージ 111 111-112 112 テーブルヘッダのマージ 112-114 データビューのマージ 114-115 セルをはみだして表示 115-116 カスタムマージ 116-117 アウトラインとデータの集計 117 小計行の作成 117-119 カスタムツリーの作成 119-122 コントロールによるアウトラインとツリーの作成 122-123 データのロード 2 89-90 セルの選択 セルのフォーマット 123-127 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms アウトラインツリー 127-128 小計の追加 128-132 Subtotal メソッドの使用 132-133 アウトラインの保守 133-134 Node クラスの使用 134 保存とロード、および印刷 テキストファイルの保存とロード Microsoft Excel ファイルの保存とロード 134-135 135 データベースからのグリッドのロード 135-136 グリッドの印刷 136-137 フィルタリング 137-138 AllowFilteringプロパティ 138-140 プログラムによるフィルタの管理 140-142 プログラムによるフィルタの適用 142-144 フィルタ動作のカスタマイズ 144-146 フィルタリングUIのカスタマイズ 146-148 プロパティグループ データ連結 148-149 150 データソースへの連結 150-155 データの取得と設定 155-156 チュートリアル Edit チュートリアル 157 157 手順1: コントロールの作成 157-160 手順2: 列タイプとデータの書式設定 160-163 手順3: ドロップダウンリスト 163-166 手順4: データの正当性検査 166-168 手順5: クリップボードへの対応 168-169 手順6: カスタムエディタの組み込み 169-172 Outline チュートリアル 172-173 手順1: コントロールの作成 173-178 手順2: データの読み込みとアウトラインの構築 178-181 手順3: マウスおよびキーボードのカスタム設定 181-183 手順4: 編集の許可と禁止 3 134 183 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 手順5: ツールチップの実装 183-185 Data Analysis チュートリアル 185-186 手順1:コントロールの作成 186-194 手順3:自動ソート 194-195 手順4:小計行とアウトラインツリー 195-197 グリッド 198 198 FlexGridの各部名称について 198 エディタにアクセスする 198 列エディタにアクセス 198-200 スタイルエディタにアクセス 200-201 VisualStyle を使用して外観を変更する 201-204 XP のテーマで表示する 204-205 グリッド領域の背景色を変更する 205-206 最後の列を広げてグリッド領域を埋める 206 グリッドの背景画像を設定する 206-207 透明度を指定して背景画像を設定する 207-208 レイアウトを保存/ロードする 208-210 パフォーマンスを改善する 210-213 JIS2004 対応フォントを使用する 213-214 グループ化の機能を使用する 境界線 214 214 コントロールの境界線スタイルを変更する 214-217 グリッドの境界線スタイルを設定する 217-223 グリッドの境界線を変更する(非表示、色変更) 223-224 行/列の境界線を設定する 224-225 セルに線を描画する 225-227 スクロールバー 227 スクロールバーの表示/非表示を設定する 227-229 常にスクロールバーを表示する 229-230 スクロールバーの表示状態を取得する 4 186 手順2:グリッドの初期化とデータ表示 タスク別ヘルプ 230 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms スクロール動作を変更する VS-FlexGrid と同様のスクロール動作にする 231 スクロールチップを表示する 231-232 スクロール位置を変更する 232-234 スタイル 234 組み込みスタイルの位置について 234-235 通常セルの外観を変更する 235-237 固定セルの外観を変更する 237 選択されているセルの外観を変更する 237-238 カレントセルの外観を変更する 238-239 カレントセルのフォーカス枠を変更する 239-242 カレントセルのフォーカス枠の色を変更する 242-243 1行おきのスタイルを設定する 243-244 固定セルや静止セルも1行おきに外観を変更する 244-247 Excel スタイルのヘッダを使用する 247-248 行/列の外観を変更する 248-250 カスタムスタイルを作成する 250-253 セル(範囲)の外観を変更する 253-254 適用したスタイルをクリアする 254-256 データの内容に応じてスタイルを適用する 256-260 設定したスタイルを優先させる 260-261 スタイルの要素 261-262 背景色/文字色を変更する 262-263 フォントを変更する 263-264 データの表示位置を変更する 5 230-231 264 画像の表示位置を変更する 264-265 3Dテキストを表示する 265-266 背景画像を設定する 266-268 折り返して表示する 268-269 トリミングして表示する 269-270 縦書きで表示する 270-271 データ型を設定する 271-272 書式を設定する 272-274 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms マージンを設定する 274-275 スタイル要素の設定をクリアする 275-277 277 行/列 277 デザイン 行列数を設定する 277-278 固定行または固定列を設定する 278-279 静止行または静止列を設定する 279-281 列ヘッダを設定する 281-282 行ヘッダを設定する 282-283 すべての行の高さ/列の幅を変更する 283-284 行の高さ/列の幅を変更する 284-285 デザイン時に設定した列幅が無効になってしまう場合の対処方法 285-288 行列のデータ型を設定する 288-290 行列の書式を設定する 290-291 固定列に行番号を表示する 291-294 294 行を追加する 294-296 列を追加する 296-298 行/列を削除する 298-300 行を挿入する 300-302 列を挿入する 302-303 ユーザーによる行の追加を許可する 303-305 ユーザーによる行の削除を許可する 305-307 ユーザーによる行/列の移動を許可する 307-309 ユーザーによる行の高さ/列幅の変更を許可する 309-310 データにあわせて行/列のサイズを調整する 310-311 行/列の最小、最大サイズを設定する 311-313 ユーザーによる行/列の静止を許可する 313-314 ユーザーによるデータ検索を有効にする 314-315 セルの値 6 285 列の順序を変更する 操作 315 セルに値を設定する 315-316 セル範囲に値を設定する 316-317 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms セルの値を取得する 317-319 セル(範囲)の値をクリアする 319-322 画像/表示 オーナー描画を使用する 322-323 グラデーション背景を描画する 323-326 セルを塗りつぶす 326 セルラベルを表示する 326-327 セルに画像を設定する 327-331 新規追加行を示すアイコンを変更する 331-332 エラー情報を表示する 332-334 エラー情報のアイコンを変更する 334-335 カレント行を示すアイコンを表示する イメージを拡大/縮小する 335 335-336 列単位でイメージを拡大/縮小 336-337 グリッド全体でイメージを拡大/縮小 337-339 描画方法を変更する 339-340 コンテキストメニューを表示する 340-343 ユーザーデータをツールチップに表示する 343 行のユーザーデータをツールチップに表示 343-345 列のユーザーデータをツールチップに表示する 345-347 セルのユーザーデータをツールチップに表示 347-349 セル範囲のユーザーデータをツールチップに表示 349-350 スタイルのユーザーデータをツールチップに表示 350-353 マウス下のセルをハイライト表示する マージ 7 322 353-354 354 隣接する同一データを自動マージする 354-356 隣接する同一データを自動マージする(制限付き) 356-359 自動マージ処理をカスタマイズする 359-360 カスタムマージ(セル結合)を行う 360-361 オーバーフロー表示を行う 361-362 ノード行をマージする 362-364 固定セルと通常セルのマージモードを別々に設定する 364-366 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms マージセルかどうかを判別する 選択/移動 367 367-371 複数の選択モードを利用する 371-372 372 選択範囲を作成する 372-374 選択範囲を取得する 374 複数行を選択する(ListBox) 374-376 行の選択状態を取得する(ListBox) 376-377 カレントセルを移動/取得する 377-378 Enter/Tab キーによりカレントセルを移動する 378-380 右クリックでカレントセルを移動する 380-381 任意のセルを表示する 381-382 カレントセルのカーソルを非表示にする 382-384 クリックされたセルを取得する 384-385 クリックされたセルの種類を判別する 385-386 ダブルクリック時にテキストを選択状態にする 386-387 入力/編集 387 常時入力モードにする 387-388 編集中のセルの外観を変更する 388-389 グリッド全体の編集を禁止する 389-390 列単位で編集を禁止する 390-392 行単位で編集を禁止する 392-393 セル単位で編集を禁止する 8 366-367 選択モードを変更する 行全体をハイライト表示する 393 Enter キーを押した際、編集モードに移行しないようにする 393-394 IMEモードを切り替える 394-395 キー入力を検知する 395-396 セル単位で編集データをチェックする 396-398 行単位で編集データをチェックする 398-399 左右の矢印キーによる編集の終了を無効にする 399-400 セル編集時の改行を禁止する 400-401 文字数単位で入力を制限する 401-404 バイト単位で入力を制限する 404-405 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 数値のみの入力を許可する 405 カスタムエディタを設定する 405-407 入力マスクを設定する 407-408 パスワード入力を行う 408-410 大文字に変換して入力する 410-411 セルボタン/コンボボックス セルボタンを表示する 411-412 セルボタンの画像を変更する 412-413 コンボボックスを表示する 413-414 コンボボックスの背景色を変更する 414-415 リストにアイコンを表示させる 415-416 表示値/実値のように2種類のデータを持たせる 416-418 選択されたインデックスを取得する 418-419 マルチカラムコンボボックスを表示する 419-422 コンボボタン/セルボタンを表示するタイミングを変更する 422-423 コンボボックスの幅を設定する 423-424 表示するリストの数を変更する 424-425 表示するリストの順番を設定する 425-428 リストの内容を行ごとに変更する 428-429 データマップの内容を行ごとに変更する 429-431 セルごとにコンボボックスを設定する 431-433 チェックボックス 433 チェックボックスを表示する 433-435 チェックボックスを表示する(SetCellCheck) 435-436 チェックボックスのイメージを変更する 436-438 チェックボックスのセルにテキストを表示する 438-439 日付型セル 439 カレンダーコントロールを使用して日付の入力を行う 439-441 カレンダーコントロールを表示しない 441-442 スピンボタンを使用して日付の入力を行う 442-444 日付の書式を設定する 444-445 和暦で表示する 445-448 時刻のみを表示する 9 411 448 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 入力可能な日付を設定する 数値型セル 450 450-451 数値型セルの書式を設定する 451-452 ツリー表示/小計行 452 小計行を表示する 452-453 小計行をカスタマイズして表示する 453-454 小計行を使用してアウトラインツリーを表示する 454-456 ノード行を指定してアウトラインツリーを表示する 456-458 連結グリッドでアウトラインツリーを表示する 458-459 ノード行にチェックボックスを表示する 459-461 縮小・展開をコードで実行する 461-463 縮小・展開イメージを変更する 463-465 465 ユーザーによるフィルタリングを許可する 465-468 コードによりフィルタリングを適用する 468-470 フィルタアイコンに独自のアイコンを表示する 470-472 フィルタボタンに独自のアイコンを表示する 472-473 ソート 473 ユーザーによるソートを許可する 473-474 特定列でのソートを制限する 474-475 ソート順序について 476 ソート処理を無効にする 476-479 コードによりソートする 479-480 複数列のソートを実行する 480-481 インジケータを明示的に表示する 481-482 インジケータを非表示にする 483-484 インジケータに独自のアイコンを表示する 484-485 データ連結 10 449-450 数値エディタを使用する フィルタリング 485 非連結列を追加する 485-487 非連結列の入力を許可する 487-489 固定列にデータを表示する 489-492 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms フィールドにビットマップイメージを表示する 492-495 自動で列幅を調整する 495-497 印刷 印刷(プレビュー)を実行する ページ範囲を指定して印刷する 497-498 498 印刷ページの余白を設定する 498-500 印刷ヘッダ/フッタを設定する 500-501 印刷フッタにページ番号を出力する 501-502 ページごとに印刷ヘッダ(フッタ)を設定する 502-503 用紙サイズを指定する 503-505 コントロールの境界線を表示せずに印刷する 505-506 印刷プレビュー画面を最大化して表示する 506-507 印刷プレビュー画面をカスタマイズする 507-509 複数のグリッドを印刷する 509-512 ファイル入出力 512 Excel ファイルの保存とロード 512-514 XMLファイルの保存とロード 514-516 テキストファイルの保存とロード 516-518 ファイル入出力時に複数のオプションを設定する 518-519 グリッドを画像として出力する 519-521 クリップボード 521 自動クリップボードの機能を有効にする 521 行ヘッダや列ヘッダを含めてコピーする 521-522 コピー&ペースト処理をコードで実装する 522-524 非表示になっている行や列を除いてコピーする 524-527 データの実値をコピーする 527-530 リファレンス 11 497 531 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms はじめに FlexGrid for WinForms は、データバインディングの最新技術を取り入れており、Microsoft.NET フレームワークとシームレ スに統合します。そのため、表形式のデータの表示、編集、フォーマット、整理、要約、および印刷を行うユーザーフレンドリな インターフェースを作成するための使いやすくて柔軟なグリッドコントロールが得られます。 FlexGrid for WinForms パッケージは、以下の2つのコントロールで構成されます。 C1FlexGrid コントロール C1FlexGrid コントロールは強力でフル機能を備えたグリッドです。グリッドで圧縮バイナリまたはテキストファイル (MicrosoftR Access? および ExcelR と互換性を持つ)の読み込み/書き込みを行います。C1FlexGrid は基本機能 や、アウトラインツリー、ソート、セル結合、マスク編集、変換コンボと画像リスト、および自動データ集計などの高度な 機能をすべて提供します。 C1FlexGrid は、ADO.NET と DataObjects for WinForms を含む任意の .NET データソースからデータを表示する バインドモードか、グリッド自身でデータを管理する非バインドモードで使用できます。 C1FlexGridClassic コントロール C1FlexGridClassic コントロールは、C1FlexGrid から派生するコントロールで、VSFlexGrid ActiveX コントロールにほ ぼ 100% 同じオブジェクトモデルを提供します。C1FlexGridClassic は既存の VSFlexGrid プロジェクトの移行を簡素化 するために開発されました。 C1FlexGridClassic のソースコードがサンプルとして付属しています。このソースコードは、カスタムグリッドコントロール 開発の基本クラスとしての C1FlexGrid コントロールの使用方法を示す参考として使用できます。 12 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 主な特長 FlexGrid for WinForms の主な機能は以下のとおりです。 コードなしの開発 スマートタグでアクセスできる使い安いエディタを使用して、設計時に列、スタイルなどを指定できます。列エディタで列 の追加・削除、整列、幅調整などの設定を簡単に行うことが可能です。既存のスタイルを修正したり、カスタムスタイル を作成するには、スタイルエディタを使用できます。従いまして、コードを書く必要はなく、グリッドを設計時に管理できま す。 高度なセル編集 簡単なテキスト編集、ドロップダウンリスト、コンボリスト、セルボタン、マスク、入力検証で編集処理を制御できます。た とえば、入力時に自動的にデータを検証するテンプレートを提供するには入力マスクを使用でき、特定の列を読み取り 専用にすることもできます。 統合した印刷 単一のコマンドでグリッドを印刷できます!用紙の方向、余白、フッタを制御することもでき、ユーザにダイアログを表示 して、プリンタを設定することも可能です。また、印刷イベントにて、ページ区切りの追加、ヘッダ行の繰り返し、各ペー ジにカスタム要素の追加を行うことができます。 階層的なスタイル 強力なプロパティおよびメソッドを使用することで要件に応じるデータ表示を実現できます。たとえ ば、C1FlexGrid.Subtotalメソッドを使用してデータを要約し、集計値を追加するまたは Tree プロパティでデータの階 層的な表示を実現できます。 柔軟なデータ連結 グリッドは、ADO.NET または C1DataObjects for .NET などのいずれかの.Net データソースに連結してバウンドモー ドでデータを表示できます。そして、グリッド自体がデータを管理できるアンバウンドモードも用意されています。 Office Microsoft2007・・2010のスタイルを使用して のスタイルを使用して UI の強化 C1FlexGrid は、Office2007、2010のスタイルに似る視覚スタイルを対応しています。たとえば、Blue、Silver と Black。 階層的なデータを子テーブルで表示する FlexGridは、階層データソースにバインドしている場合、各マスターレコードは展開/縮小でき子グリッドの詳細が表示/ 非表示にできます。結果としては、階層データを表示する際のMicrosoft Accessによって提示されたグリッドの種類に 類似した"データ·ツリー"になります。これは、 C1FlexGridコントロールからコントロール(C1FlexDataTree)を継承する ことにより達成できています。また、バインドされている場合はコントロールが下位のデータソースを検出して、子テーブ ルを表示する場合それ自体の追加のインスタンスを作成します。 ツリーに変換する可能 特定の行の IsNode プロパティを設定して、FlexGrid を TreeView に変換することができます。高度な DataGrid のよ うな機能を備える TreeView を使用できます。 セルにデータおよび画像を表示する グリッドの各セルはデータを表示する他、画像も表示できます。データベースの情報を図で表示するため、簡単なおよ び効率的な方法、イメージリストにグリッドの列をバインドすることも可能です。 描画する時の特殊な効果 グリッドのセルに、線、ビットマップ、アイコンなどの特殊な効果を実現することにより、グリッドの外観を独自に変更でき ます。画像をスケールするまたは透明の効果を追加することもできます。 13 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 列にフィールド名を設定する 必要に応じて、列を位置よりその名前で参照することが可能です。データ連結を実現したグリッドの場合は、列キーは 自動的にフィールド名に割り当てられていますが、コードにて割り当てることも可能です。従いまして、ユーザがグリッド 上の異なる位置に移動した場合でも、列を取得するには列の ColIndex(ColKey) 構文を使用できます。 結合セル 近接する同値のセルを結合して、外観や明瞭を高めるために複数の行または列をスパンできます。 範囲の集計 ステートメントは1つのみを使用してセル範囲の集計、平均、または他の統計を計算できます。 複数のファイル形式を使用したデータの保存 複数のファイル形式を使用したデータの保存/ロード ロード text、.xls、.xlsx (OpenXml 形式)など、またはOpenXMLファイルの他の拡張子でグリッド内容をロード・保存することが できます。そして、DataReaderオブジェクトを使用してデータベースからもグリッドデータをロードすることができます。 組み込みのフィルタリング機能 AllowFiltering プロパティを設定することにより、グリッドの各列にフィルタを設定できます。 14 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 製品の概要 製品構成 FlexGrid for WinForms は、次の2つのコンポーネント(コントロール)とヘルプ、サンプルなどから構成されています。 コントロール C1FlexGrid コントロール C1FlexGrid は、パワフルであらゆる機能を備えたグリッドです。データの表示、編集、書式設定、集計、および印刷 を、まったく新しい方法で実現します。また、任意の区切り文字によるテキストファイル、Excel ファイル、XML ファイルを グリッドに読み書きできます。C1FlexGrid には、ひととおりの基本機能はもちろん、アウトラインツリー、ソート、セル マージ、マスク編集、コンボボックスとイメージリストの変換、自動データ集計などの高度な機能が用意されています。 C1FlexGrid は、連結と非連結の両方のモードで使用できます。連結モード(バウンドモード)では、ADO.NET データ ソースからのデータを表示します。非連結モード(アンバウンドモード)では、グリッド自身がデータを管理します。 C1FlexGridClassic コントロール C1FlexGridClassic は、C1FlexGrid から派生したコントロールです。C1FlexGridClassic が提供するオブジェクトモデル は、ActiveX 製品の VSFlexGrid コントロールと似ています。 このコントロールはサンプルとして提供されており、ソース コードも付属しています。このコードを参照することで、C1FlexGrid コントロールを基本クラスとして使用し、カスタムグ リッドコントロールを開発する方法が理解できます。詳しくは、製品付属の「FlexGridClassic サンプル」に含まれている ソースコード(FlexGridClassic.cs ファイル)、およびサンプルヘルプを参照してください。 注意 注意:C1FlexGridClassic はあくまでもサンプルとして作成されたDLLです。通常使用する際には、C1FlexGrid をご使用く ださい。C1FlexGridClassic は、ユーザーサポートの対象外です。 製品ヘルプ 今、ご覧いただいているものです。FlexGrid for WinForms をご利用いただくために必要なあらゆる情報が記載されていま す。 サンプル FlexGrid for WinForms の使用例、応用例をまとめたサンプルプログラム集です。これらのサンプルは、VB と C# の違いを 比較しながら学習できるように、まったく同じプロジェクトが両方の言語で作成、収録されています。また、サンプルの目的や使 用方法を説明したサンプルヘルプも付属しています。 新機能と変更点 各バージョンで追加された機能や変更点について紹介します。 5.0Jで更新された内容 以下は、FlexGrid for Windows Forms 5.0J で追加された主な機能です。 組み込みのデータフィルタリング 描画の改良 オブジェクトモデルの改良-Tree オブジェクト、Node オブジェクト CheckBoxサポートの改良 コントロール更新の改良 列設定の手間を軽減 起動時のパフォーマンスの向上 新規行テンプレートへの表示テキストの指定 クリップボード処理でのコピー内容指定 15 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 行レベルでの検証 集計行のカスタマイズ 異なるマージモードの併用 常時入力モードを簡単に実現 CellStyle クラスへの機能追加 印刷機能の強化 新しい外観描画の仕組み 廃止された機能-Redraw プロパティ 新機能概要 【組み込みのデータフィルタリング】 AllowFiltering プロパティを True に設定すると、C1FlexGrid コントロールはグリッドの各列に対して、ユーザーがフィルタを 適用できるようにします。 データフィルタリング機能は、Windows7やVistaにおいてMicrosoftが使用しているスタイルに従っています。ユーザーが列 ヘッダ上にマウスポインタを動かしたときに、グリッドはヘッダ上にフィルタボタンを表示します。フィルタボタンのクリックによ り、表示するデータを選択するフィルタエディタが起動します。すべての列がフィルタを持っており、行が表示されるためには、 すべてのフィルタを通過しなくてはなりません。 組み込みのフィルタには、ユーザーが表示する特定の値を選択できる値フィルタ フィルタ(ValueFilter)のほか、 ユーザーが“指定の 値より大きい”、”指定の値を含む” といった条件を指定できる条件フィルタ( 条件フィルタ(ConditionFilter))もあります。開発者が特定のカ スタムフィルタを作成し、列に適用することもできます。 以下の画像は、フィルタ機能が実行されているところを表しています。この画像では、表示する商品を選択できる値フィルタエ 値フィルタエ ディタ ディタが表示されています。 次の画像では、発注量の範囲を選択する条件フィルタ 条件フィルタエディタが表示されています。 16 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms フィルタが適用されている列には、マウスが列ヘッダ上に置かれていないときでも、ヘッダにフィルタアイコンが表示されます。 このことは、上記画像において ProductID 列および Quantity 列のヘッダにフィルタアイコンが表示されていることで、おわ かりいただけると思います。 組み込みのフィルタは、次の言語における自動ローカライズをサポートしています: 英語、スペイン語、フランス語、イタリア語、ポルトガル語、ドイツ語、オランダ語、ロシア語、日本語。 これらのローカライゼーションは製品に組み込まれており、サテライトDLLを必要としません。 新しいフィルタリング機能は極めて強力かつフレキシブルで、視覚的にも目立ちすぎることがありません。詳細は「フィルタリン グ」を参照してください。 【描画の改良】 Windows XP/Vista/7で機能するテーマサポートを強化しました。以下の画像は、Windows 7における C1FlexGrid コントロー ルの外観を表しています。VisualStyle プロパティは System に設定されています。 17 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms グリッドが、列と行のヘッダに対して、完全にシステムのテーマを利用している点に加え、ソートインジケータが現在は列ヘッダ の右側でなく上部に表示されている点にご注目ください。これらの新しい特性は、Windows 7/Vista のリストに見られる同機能 に倣っています。 【オブジェクトモデルの改良- 【オブジェクトモデルの改良-Tree オブジェクト、 オブジェクト、Node オブジェクト】 Node オブジェクトには、ツリーの作成および操作をより簡単に行えるようにするプロパティが追加されました。新しいプロパ ティは、標準のTreeViewコントロールとの互換性のために設計されています。そのため、コードの移行が簡単で、学習の必要 がありません。 Node オブジェクトの新しいプロパティには、Parent、Nodes、Checked、PrevNode,、および NextNodeがあります。 Node オブジェクトのCheckedプロパティは、3つのチェック状態(チェック、未チェック、未定義)をサポートします。これにより、 親ノードに子ノードのチェック状態を反映させるツリーを作成することが容易になります。これに対して、標準のTreeViewコント ロールがサポートするのは、チェックと未チェックのみです。 Nodeオブジェクトモデルの改良により、標準のTreeViewコントロールのツリーと同様に、C1FlexGridベースのツリーをプログラ ミングできるようになりました。 【CheckBoxサポートの改良】 サポートの改良】 前バージョンでは、一般的なAfterEdit イベントを使う必要がありましたが、5.0Jでは新たにCellChecked イベントが追加さ れ、セルおよびツリーノードのチェックボックスが扱いやすくなりました。 【コントロール更新の改良】 再描画の一時停止や再開に使用する、新しいBeginUpdate メソッドとEndUpdate メソッドが追加されました。これらのメソッ ドは、標準の.NETコントロールと互換性を持つ改良型オブジェクトモデルのために、Redraw プロパティ(廃止されます)と置き 換わるものです。 【列設定の手間を軽減】 C1FlexGrid をフォームに配置したときの、デフォルトの固定列の列幅を、他の列よりも狭くしました。列幅を調整するのは簡単 18 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ではありますが、今回の変更により、C1FlexGridを使用する開発者はグリッドをフォームに配置するたびにマウスで固定列の 幅を調整せずに済むようになりました。 【起動時のパフォーマンスの向上】 C1FlexGrid には、データソースに連結している場合、グリッドに列サイズを自動変更させる AutoResize プロパティがありま す。グリッドが大規模なデータソース(要素が10,000程度)に連結されている場合、この自動サイズ変更処理にはかなりの時 間がかかります。 AutoResize プロパティのデフォルト値に True が使用されていたことで、多くのユーザーは気付かないパフォーマンス上の不 利益が生じていました。これを改善するため、本バージョンではAutoResize プロパティのデフォルト値が False に変更されまし た。これに伴い、自動サイズ調整が必要なアプリケーションではAutoResize プロパティを明示的に True に設定する必要が あります。 注意 注意:これは、既存のアプリケーションに影響を及ぼす変更です。列の自動サイズ変更が必要なアプリケーションで は、AutoResize プロパティをTrue に設定する必要があります(設計時には Visual Studio のデザイナを使用して、実行 時にはコードから設定できます)。 【新規行テンプレートへの表示テキストの指定】 新たに追加されたNewRowWatermark プロパティにより、AllowAddNewプロパティがTrueに設定されているときに表示さ れる新規行のテンプレートに、任意のテキストを指定できるようになりました。 【クリップボード処理でのコピー内容指定】 ClipboardCopyModeプロパティが追加され、AutoClipboardプロパティがTrueに設定されている場合に、列ヘッダや行ヘッ ダを、クリップボードへのコピー内容に含めるかどうか、また Clip プロパティからコピーされるデータに含めるかどうかを指定で きるようになりました。 【行レベルの検証】 新たに追加されたRowValidating イベントとRowValidated イベントは、グリッドがフォーカスを失ったとき、または別の行が 選択されたときに発生します。 これらのイベントにより、行レベルの検証を行い、結果不正だった場合、ユーザーが他の行へ移動できないようにすることなど も可能になりました。 【集計行のカスタマイズ】 Subtotal メソッドの呼び出し後、集計行が作成される前に発生するBeforeSubtotal イベントと集計行が作成された後に発生 するAfterSubtotalイベントが追加されました。 これらのイベントを使用することで、集計行をカスタマイズしたり、スタイルや内容を変更したり、いくつかの集計行の作成をま とめて保留したりすることができます。 【異なるマージモードの併用】 AfterMergingFixedプロパティにより、固定セルとスクロール可能なセルに対して、異なるマージモードを指定することが可能 になりました。たとえば、列ヘッダではカスタムマージを行い、データセルでは自動マージを使用したい、といった場合などには 特に便利です。 【常時入力モード】 EditOptionsプロパティに設定するEditFlags列挙体に以下の2つのメンバが追加され、常時入力モードのグリッドを、コーディ ングを伴わず、オプション設定のみで簡単に実現できるようになりました。 19 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms EditFlags.ExitOnLeftRightKeys: このフラグが True に設定されている場合(デフォルトの設定)、組み込みのテキストエディタおよび数値エディタは、キャレット が先頭位置にある状態でユーザーが左矢印キーを押したとき、またはキャレットが末尾位置(TextLengthの位置)にある状態 でユーザーが右矢印キーを押したとき、編集モードを抜けます。 このフラグが False に設定されている場合、組み込みのテキストエディタおよび数値エディタは、ユーザーが[Enter]キーを押 すか、または別なセルをクリックするまで、編集モードを抜けません。 EditFlags.EditOnRequest: このフラグが True に設定されている場合(デフォルトの設定)、ユーザーが入力を開始するかまたはセルをダブルクリックする まで、グリッドは編集モードに入りません(MS Excel と同じ動作)。 このフラグが False に設定されている場合、グリッドがフォーカスを得たとき、また選択セルが変更されたときには、グリッドは 自動的に編集モードに入ります(MS Access と同じ動作)。 【CellStyleクラスへの機能追加】 クラスへの機能追加】 CellStyleクラスへの機能追加(StringFormatプロパティ、およびGetTextRectangleメソッド、GetImageRectangleメソッド) により、セル内のテキストやイメージといったコンテンツ自体の表示領域を計測可能になったため、コンテンツの周囲に線を描 画するなど、装飾を施すことも可能になりました。 【PrintDocumentGridRendererクラスの追加】 クラスの追加】 このクラスはグリッドをPrintDocument オブジェクトにレンダリングするときに使用されます。FlexGridはPrintGridメソッドを提 供しており、これはグリッドを印刷/プレビューする最も簡単な方法です。 PrintGridメソッドは単一のFlexGridを含むPrintDocumentオブジェクトを自動的に作成します。しかし、そのドキュメント上で、 別のグリッドを含め、他のコンテンツ要素を現在のグリッドを組み合わせることはできません。 このような用途に使用するのが、PrintDocumentGridRendererクラスです。 たとえば以下は、フォームに配置されている2つのグリッドを単一のPrintDocumentにレンダリングする例です。 20 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private _g1, _g2 As PrintDocumentGridRenderer Private printDocument1 As Printing.PrintDocument Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' ボタンのクリック時、印刷プレビューダイアログを表示します。 Using dlg As New PrintPreviewDialog() dlg.Document = Me.printDocument1 dlg.ShowDialog(Me) End Using End Sub Private Sub printDocument1_BeginPrint(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintEventArgs) ' グリッドのレンダラを作成し、印刷オプションを設定します。 _g1 = New PrintDocumentGridRenderer(flex1) _g1.Options = PrintGridFlags.ActualSize ' グリッドのレンダラを作成し、印刷オプションを設定します。 _g2 = New PrintDocumentGridRenderer(flex2) _g2.Options = PrintGridFlags.FitToPageWidth Or PrintGridFlags.ExtendLastCol End Sub Private Sub printDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) ' グリッドをレンダリングします。 If (_g1.CurrentPage < _g1.PageCount) Then _g1.PrintPage(e) e.HasMorePages = True 21 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Next ' グリッドをレンダリングします。 ElseIf (_g2.CurrentPage < _g2.PageCount) Then _g2.PrintPage(e) e.HasMorePages = _g2.CurrentPage < _g2.PageCount End If End Sub C# コードの書き方 C# PrintDocumentGridRenderer _g1, _g2; PrintDocument printDocument1; private void button1_Click(object sender, EventArgs e) { // ボタンのクリック時、印刷プレビューダイアログを表示します。 using (PrintPreviewDialog dlg = new PrintPreviewDialog()) { dlg.Document = this.printDocument1; dlg.ShowDialog(this); } } void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) { // グリッドのレンダラを作成し、印刷オプションを設定します。 _g1 = New PrintDocumentGridRenderer(flex1); _g1.Options = PrintGridFlags.ActualSize ; // グリッドのレンダラを作成し、印刷オプションを設定します。 _g2 = New PrintDocumentGridRenderer(flex2); _g2.Options = PrintGridFlags.FitToPageWidth Or PrintGridFlags.ExtendLastCol; } void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { // グリッドをレンダリングします。 _g2 = new PrintDocumentGridRenderer(flex2); _g2.Options = PrintGridFlags.FitToPageWidth | PrintGridFlags.ExtendLastCol; if (_g1.CurrentPage < _g1.PageCount) { _g1.PrintPage(e); e.HasMorePages = true; } // グリッドをレンダリングします。 else if (_g2.CurrentPage < _g2.PageCount) { _g2.PrintPage(e); e.HasMorePages = _g2.CurrentPage < _g2.PageCount; } } 22 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【新しい外観描画の仕組み】 個々のセルスタイルを設定する代わりに、グリッドの外観描画を定義したC1FlexGridRenderer クラスを使用して外観を描画す る方法です。定義した Renderer をプロパティに指定するだけで、複数のグリッド間で統一感のあるプロフェッショナルな外観 設定を簡単に共有できます。 Renderer プロパティは、VisualStyleプロパティの実装に使用されているレンダリングエンジンを利用したものです。Renderer プロパティはC1FlexGridRendererオブジェクトで、すべてのグリッドのレンダラの継承元となる抽象ベースクラスです。 さらに、C1FlexGridRenderer クラスから継承し、MS Office 2007のVisual Style(blue, silver, black)で使用されているすべて のグラデーションやイメージを作成可能な25色を使用するGridRendererOffice2007クラスも提供しています。 レンダラをによる描画に関する詳細は、リファレンスページおよび製品付属サンプルプロジェクト「GridRenderer」の Documentation フォルダにある、GridRenderer.htmを参照してください。 【廃止された機能- 【廃止された機能-Redraw プロパティ】 以下のプロパティが廃止されました。 廃止されたプロパティ 代わりに使用 Redraw BeginUpdateメソッド、EndUpdate メソッド クラスメンバ C1FlexGrid コンポーネントに追加された最新のメンバは以下のとおりです。 メンバ 説明 AllowFiltering プロパティ ユーザーがデータをフィルタできるかどうかを取得または設定します。 AllowFiltering プロパティ その列で使用するフィルタのタイプを取得または設定します。 Filter プロパティ その列のフィルタリングに関与するIC1ColumnFilter を取得または設定します。 ApplyFilters メソッド すべての列フィルタをグリッド上のデータに適用します。 BeforeFilter イベント 列フィルタがグリッドに適用される前に発生します。 AfterFilter イベント 列フィルタがグリッドに適用された後に発生します。 IC1ColumnFilter インタフェース 列のフィルタオブジェクトにより実装されるインタフェース。 IC1ColumnFilterEditor インタ フェース 列のフィルタエディタコントロールにより実装されるインタフェース。 ValueFilter クラス 一連の値に基づくフィルタを表します。 ConditionFilter クラス 1つまたは2つの論理条件に基づくフィルタを表します。 ColumnFilter クラス ValueFilter とConditionFilter を含むフィルタを表します。 Parent プロパティ そのノードの親ノードを取得します。 PrevNode プロパティ 前の兄弟ノードを取得します。 NextNode プロパティ 次の兄弟ノードを取得します。 Nodes プロパティ そのノードの子を含む配列を取得します。 Checked プロパティ そのノードに関連したチェックボックスの値を取得または設定します。 BeginUpdate メソッド BeginUpdateメソッドに対する呼び出し後、コントロールの更新を再開します。 23 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms EndUpdate メソッド EndUpdate メソッドが呼び出されるまでコントロールの更新を抑制することで、パフォー マンスを維持します。 DataMemberChanged イベント DataMember プロパティの値が変更されたときに発生します。 DataSourceChanged イベント DataSource プロパティの値が変更されたときに発生します。 DataBindingComplete イベント データ連結操作が完了したときに発生します。 CellChecked イベント ユーザーにより、セルのチェックボックスがチェックされた後、またはチェックがはずされ た後に発生します。 StringFormat プロパティ セルのテキスト内容の書式設定に使用するStringFormat オブジェクトを取得します。 GetTextRectangle メソッド テキストが表示されているセルの部分(マージンとボーダーを差し引いた領域)を取得 します。 GetImageRectangle メソッド イメージが表示されているセルの部分(マージン、ボーダーおよびテキストを差し引いた 領域)を取得します。 PrintDocumentGridRenderer ク PrintDocument オブジェクトへのグリッドのレンダリングに使用されるクラス。 ラス C1FlexGridRenderer クラス カスタムグリッドレンダラの抽象ベースクラス。 Renderer プロパティ コントロールのルック&フィールのカスタマイズに使用されるC1FlexGridRenderer を 取得または設定します。 AfterMergingFixed プロパティ スクロール不可のセルをマージする方法を取得または設定します。 AfterSubtotal イベント 各行がグリッドに追加された後に発生します。 BeforeSubtotal イベント 各行がグリッドに追加される前に発生します。 ClipboardCopyMode プロパティ AutoClipboard プロパティが True に設定されている場合、クリップボードにコピーさ れるグリッドの部品を取得または設定します。 NewRowWatermark プロパティ AllowAddNew プロパティが True に設定されている場合、新しい行テンプレート上に 表示される文字列を取得または設定します。 RowValidated イベント 行がフォーカスを失って、検証が行われた後に発生します。 RowValidating イベント 行がフォーカスを失い、検証が必要になる場合に発生します。 ExitOnLeftRightKeys (EditFlags 列挙体のメンバ) ユーザーがコンテンツの末尾で右矢印キーを押すか、コンテンツの冒頭で左矢印キー を押した場合、エディタを終了します。 EditOnRequest(EditFlags 列挙体 マウスまたはキーボードのイベントに応答する場合にのみ編集モードに入ります。この のメンバ) フラグを False に設定すると、コントロールがフォーカスを取得するか、ユーザーがカー ソルを移動したときにグリッド FilteredColumn(GlyphEnum 列 挙体のメンバ) 列が現在有効なフィルタを保持することを示します。 FilterEditor(GlyphEnum 列挙体 のメンバ) 列がドロップダウンフィルタエディタを保持することを示します。 サンプル C1FlexGrid の製品付属のサンプルに以下が新しく追加されました。 サンプル 24 説明 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ColumnFilters 新しいフィルタリング機能の使用方法に関するサンプルです。 このサンプルでは、AllowFiltering プロパティとAfterFilterイベントを使って、グリッドの組み込みフィル タの制御や、カスタマイズを行う方法を紹介します。 CustomFilters カスタムフィルタを実装する方法を紹介するサンプルです。 ExcelStyleFilter データのソートやフィルタリングをコンテキストメニューから行います。 FilterRow フィルタ行を実装する方法を紹介します。 GridRenderer Renderer プロパティを使用したカスタムレンダラの実装方法を紹介します。 NewFeatures 5.0Jで追加された機能をピックアップして紹介します。 4.0J で更新された内容 以下は、FlexGrid for .NET 4.0Jで追加された主な機能です。 スマートデザイナ カスタムマージオプション Excel ファイルの保存とロード エディタの強化 スクロール関連 行/列ヘッダ関連 スタイル関連 ソート データ連結関連 セルの編集関連 データマップ関連 SaveGrid/Excel 形式に対する最適化の追加 グリッドデザイナでのフォントサイズコントロールの動作の改善 NoFreezing フラグの外観と動作の設定を可能にする SaveExcel の動作の改善 GridTree.Sort メソッドへのオーバーロードの追加 印刷コードへの付加チェックの追加 VisualStyle プロパティの追加 Addメソッド (Int32) およびAdd メソッド (Int32) メソッドの追加 MouseEnterCell イベントおよび MouseLeaveCell イベントの追加 Grid プロパティの追加 SaveExcelメソッドのオーバーロード追加 追加機能概要 【スマートデザイナ スマートデザイナ】 スマートデザイナの機能を実装しました。スマートデザイナの詳細や設計時の操作方法については、「設計時のサポート」を参照 してください。 【カスタムマージオプション カスタムマージオプション】 新たにカスタムマージオプションを実装しました。以前のバージョンでは、カスタムマージを実現するためにグリッドをサブクラス 化して GetMergedRange メソッドをオーバーライドする必要がありました。カスタムマージオプションを使用すると、簡単にマー ジ範囲のリストを提供できます。 AllowMergingEnum.Custom設定 設定 AllowMergingEnum.Custom設定は、C1FlexGrid.AllowMerging プロパティの新しい設定で、カスタムのマージセル範囲を指 定できます。これまでは、コントロールをサブクラス化して C1FlexGrid.GetMergedRange メソッドをオーバーライドする必要があ りました。カスタム範囲は、C1FlexGrid.MergedRanges プロパティで指定します。 25 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms MergedRangesプロパティ C1FlexGrid.MergedRanges プロパティは、サブクラス化せずにカスタムマージを可能にします。以前のバージョンでは、カスタム マージにはグリッドをサブクラス化して C1FlexGrid.GetMergedRange メソッドをオーバーライドする必要がありました。このプロ パティを使用すると、簡単にマージ範囲のリストを提供できます。 カスタムマージ範囲は、グリッドを Excel ファイル(C1FlexGridBase.SaveExcel/C1FlexGridBase.LoadExcel)、および XML ファイ ル(C1FlexGridBase.WriteXml/C1FlexGridBase.ReadXml)の保存とロード時にサポートされます。 注意: 注意:新しいカスタムマージの機能については、製品付属の「CustomCellMergeNew サンプル」、 「CustomCellMergeNew2 サンプル」を参照してください。以前のカスタムマージの機能については、製品付属の 「CustomCellMerge サンプル」、「CustomCellMerge2 サンプル」を参照してください。 【Excel ファイルの保存とロード ファイルの保存とロード】 Excel ファイルの保存とロード時に固定行(列)と静止行(列)をフリーズできるようになりました。この動作は、 FileFlags.NoFreezing プロパティを使用して変更できます。 ま た、FileFlags.SaveMergedRanges、FileFlags.LoadMergedRanges、FileFlags.IncludeMergedRanges、FileFlags.NoFreezing の各設定を新たに追加し、セルをマージした状態で Excel ファイルの保存とロードを行えるようになりました。 CellStyle.WordWrap プロパティが True に設定されているとき、埋め込みの改行を含む文字列を Excel ファイルに確実に保存 する(行の高さを適切に設定する)ように改善しました。WordWrap プロパティが False に設定されているときでも、常にハード 改行を使用可能にします。この変更により、Excel 出力がグリッドの内容により近いものになります。 FileFlags.SaveMergedRanges 新しい FileFlags.SaveMergedRanges フラグを使用し、マージ範囲を Excel ファイルに保存できます。たとえば、以下のようにな ります。 Visual Basic コードの書き方 Visual Basic flex.SaveExcel(fileName, FileFlags.IncludeFixedCells Or FileFlags.SaveMergedRanges) C# コードの書き方 C# flex.SaveExcel(fileName, FileFlags.IncludeFixedCells | FileFlags.SaveMergedRanges); FileFlags.LoadMergedRanges FileFlags.LoadMergedRanges 設定は、C1FlexGridBase.LoadExcel フラグパラメータの新しい設定で、Excel シートからマージ セルをロードできます。ロードする Excel シートにマージセルが含まれる場合、このフラグが C1FlexGrid.AllowMerging プロパ ティを AllowMergingEnum.Custom に設定してマージセルを C1FlexGrid.MergedRanges コレクションにロードします。 FileFlags.IncludeMergedRanges FileFlags.IncludeMergedRanges 設定は、FileFlags.SaveMergedRanges と FileFlags.LoadMergedRanges を組み合わせた もので、マージ範囲を含む Excel ファイルを保存およびロードする場合に使用できます。 FileFlags.NoFreezing FileFlags.NoFreezing 設定は、Excel ファイルの保存およびロード時にグリッドの行と列がフリーズされないようにする新しい設 26 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 定です。デフォルトでは、固定行(列)と静止行(列)は、Excel ファイルへのインポート時にフリーズされ、Excel ファイル内の静止 行と列はグリッドへのインポート時にフリーズされます。 【エディタの強化】 組み込み数値エディタを追加しました。また、ComboBoxEditor プロパティを新たに追加しました。 数値エディタ 数値の編集時、グリッドはデフォルトで組み込み数値エディタを使用します。数値エディタは、セルスタイル(列)に割り当てられた Format プロパティを使用可能にし、(セル型に基づいて)キーチェック、入力時の書式、範囲チェックを提供します。 EditFlags.UseNumericEditor フラグを含めないことで、組み込み数値エディタを無効にできます。 ComboBoxEditor プロパティ ComboBoxEditor プロパティは、アクティブな ComboBox エディタコントロールの主要なプロパティへの簡単アクセスを提供し ます。以下のサブプロパティが含まれます。 プロパティ 説明 Items 現在アクティブな ComboBox エディタ内の項目のコレクションを取得します。 SelectedIndex 現在アクティブな ComboBox エディタ内で選択されたインデックスを取得または設定します。 SelectedItem 現在アクティブな ComboBox エディタ内で選択された項目を取得または設定します。 SelectedKey 現在アクティブな ComboBox エディタ内で選択された項目に対応するキーを取得します。 これらのプロパティは、現在アクティブな ComboBox エディタ上でプロパティを取得または設定します。これらはすべて現在のエ ディタを ComboBox オブジェクトにキャストして、ComboBox オブジェクト上で適切なプロパティを取得または設定します。アク ティブなエディタがない場合やエディタが ComboBox でない場合、 これらのプロパティは null または -1 を返し、設定できませ ん。たとえば、以下のようになります。 Visual Basic コードの書き方 Visual Basic ' ComboBoxEditorプロパティを使用: Console.WriteLine("ComboBoxのインデックス:{0}", flex.ComboBoxEditor.SelectedIndex) ' ComboBoxEditorプロパティを使用しない: If Not flex.Editor Is Nothing Then Dim cb As ComboBox cb = CType(flex.Editor, ComboBox) Console.WriteLine("ComboBoxのインデックス:{0}", cb.SelectedIndex) End If C# コードの書き方 C# // ComboBoxEditorプロパティを使用: Console.WriteLine("ComboBoxのインデックス:{0}", flex.ComboBoxEditor.SelectedIndex); <// ComboBoxEditorプロパティを使用しない: if (flex.Editor != null) { 27 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ComboBox cb; cb = flex.Editor as ComboBox; Console.WriteLine("ComboBoxのインデックス:{0}", cb.SelectedIndex); } 注意 :このプロパティは、C# の 'as' のような条件分岐のキャスト演算子を現在持っていない Visual Basic で特に便利で す。 【スクロール関連】 スクロールバーの常時表示、セル単位のスクロールが可能になりました。また、これまでの BeforeScrollTip イベント を ShowScrollTip イベントに置き換えました。 ScrollOptions プロパティ C1FlexGridBase.ScrollOptions は、ScrollFlags 列挙体フラグを使用してグリッドのスクロール動作をカスタマイズします。 ScrollFlags 列挙体には、次のフラグが含まれます。 フラグ 説明 AlwaysVisible 必要のない場合でも、スクロールバーを常に表示します。 ScrollByRowColumn ピクセル単位ではなく、行または列単位でスクロールします。 DelayedScroll スクロールバーがドラッグされている間スクロールしません。 ShowScrollTips 垂直スクロールバーの横にツールチップを表示します。 このプロパティは、以前のバージョンでは使用できなかったオプションを提供します。また、独自のプロパティを持ったオプションも 指定します。 ActiveX 製品 VS-FlexGrid Pro と同様のスクロール動作を実装するには、DelayedScroll と ScrollByRowColumn を実装装しま す。 Visual Basic コードの書き方 Visual Basic flex.ScrollOptions = ScrollFlags.DelayedScroll Or _ ScrollFlags.ScrollByRowColumn C# コードの書き方 Visual Basic flex.ScrollOptions = ScrollFlags.DelayedScroll | ScrollFlags.ScrollByRowColumn; 以下のプロパティが廃止されました。 廃止されたプロパティ 代わりに使用 ScrollTrack ScrollFlags.DelayedScroll フラグ ScrollTips ScrollFlags.ShowScrollTips フラグ ScrollTipText ShowScrollTipイベント ScrollBarsVisible プロパティ 28 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 以前のバージョンでは、コントロールのサイズとそのクライアント領域を比較してスクロールバーの表示状態を検出する必要があ りました。ScrollableControl.ScrollBarsVisible プロパティにより、それが不要となりました。 これまでの BeforeScrollTip イベントに代わって ShowScrollTip イベントを使用 BeforeScrollTip イベントの代わりに ShowScrollTip イベントが使用されるようになりました。古いイベントには次の2つの問題 点がありました。 外部プロパティ(ToolTipText)を使用してイベント引数を提供。 対応する After イベントを持たない Before イベント。 新しい ShowScrollTip イベントを使用すると、イベントパラメータを使用してツールチップテキストを提供できるようになり、ずっと わかりやすくて使いやすいものになりました。たとえば、以下のようになります。 Visual Basic コードの書き方 Visual Basic ' 古いコード(旧式) Private Sub _flex_BeforeScrollTip(ByVal sender As Object, ByVal e As RowColEventArgs) Handles _flex.BeforeScrollTip _flex.ToolTipText = String.Format("row {0}", e.Row) End Sub ' 新しいコード Private Sub _flex_ShowScrollTip(ByVal sender As Object, ByVal e As ToolTipEventArgs) Handles _flex.ShowScrollTip e.ToolTipText = String.Format("row {0}", e.Row) End Sub C# コードの書き方 C# <// 古いコード(旧式) private void _flex_BeforeScrollTip(object sender, RowColEventArgs e) { _flex.ToolTipText = string.Format("row {0}", e.Row); } <// 新しいコード private void _flex_ShowScrollTip(object sender, ToolTipEventArgs e) { e.ToolTipText = string.Format("row {0}", e.Row); } 【行/列ヘッダ】 ShowThemedHeaders プロパティ ShowThemedHeaders プロパティは、行と列のヘッダを XP のテーマで表示するかどうかを個別に、また、 ScrollableControl.BorderStyle プロパティとも別個に制御します。 【スタイル関連】 スタイルの背景画像、配置方法を指定できるようになりました。また、選択したセルに対応する行ヘッダと列ヘッダの描画に使用 するスタイルを追加しました。 CellStyle.BackgroundImage/ /CellStyle.BackgroundImageLayout プロパティ CellStyle.BackgroundImage/CellStyle.BackgroundImageLayout プロパティは、スタイルの背景画像、配置方法を指定しま 29 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms す。これを使用し、カスタムの境界線、グラデーション、透過度などの高度なテーマを提供できます。また、特にセルの背景をサ ポートするために追加された新しい ImageAlignEnum.TileStretch 設定もあります。この設定は、画像の端部分の元のサイズ を維持したまま中央部分を伸縮します。 SelectedColumnHeader/ /SelectedRowHeader プロパティ 選択したセルに対応する行ヘッダと列ヘッダの描画に使用するスタイルです。CellStyleCollection.SelectedColumnHeader プロ パティとCellStyleCollection.SelectedRowHeader プロパティを使用して Excel ファイルのようなスタイルでカレントセルの位置を わかりやすくすることができます。このプロパティは、ScrollableControl.BorderStyle/ShowThemedHeaders プロパティに影 響します。行または列のヘッダが XP のテーマで描画されていない場合のみ有効になります。 【ソート】 現在のソートを定義する列への参照を取得できるようになりました。 SortColumn プロパティ SortColumn プロパティはグリッドに適用された現在のソートを定義する列への参照を取得します。これは、グリッドの ソートに使用するメソッド(Sort メソッド、ヘッダ列のクリック、データソースオブジェクトのソート)に関係なく機能します。 ユーザーは、Column.Sort プロパティの値を確認してソート順を決定できます。 【データ連結関連】 CellChanged イベントを改良し、グリッドと DataTable オブジェクトの連結時に e.Col パラメータに変更された実際の列を 渡すようにした。 データ連結時に Column.Caption プロパティが使用可能になりました。 【セルの編集関連】 StartEdit と AfterEdit イベント動作の機能を強化ユーザーがセルボタンをクリックした場合、StartEdit イベント とAfterEdit イベントが発生しないよう改善しました。この場合、CellButtonClick イベントのみが発生します。 C1FlexGridBase.AutoClipboard で切り取り/貼り付けするか、ドラッグ&ドロップした際に、StartEdit イベント とAfterEdit イベントが発生するように改善しました。 EditFlags.DelayedCommit の設定を新たに追加しました。 EditFlags.DelayedCommit 設定は、EditOptions プロパティと共に使用し、変更が基のデータソースに適用されるタイミ ングを決定します。 C1FlexGridBase.EditOptions 値にEditFlags.DelayedCommit フラグが含まれる(デフォルト設定)場合、 グリッドは標準の Windows Forms 動作を使用し、カーソルが新しい行に移動したかグリッドがフォーカスを失ったときに のみ変更をコミットします。 C1FlexGridBase.EditOptions 値に EditFlags.DelayedCommit フラグが含まれない場合、変更は個々の編集の直後に データソースにコミットされます。 【データマップ関連】 自動貼り付けロジックを改良し、データマップされたセルを使用可能にしました。 データマップ列の処理機能を強化 列のDataType プロパティを設定すると、データ型に基づいてその RowCol.TextAlign プロパティが自動的に設定されま す。今回、 RowCol.DataMap プロパティを設定して同じ効果が得られるようになりました。これにより、コントロールはさらに使用し やすくなります。 それは、標準的なシナリオの場合、DataMap を使用して数値(ID。デフォルトでは右揃え)を文字列(デ フォルトでは左揃え) 30 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms に変換するからです。たとえば、グリッドが製品テーブルに連結された場合、数値の分類 ID 列はデフォルトで右揃えとな ります。文字列を含む DataMap をその列に割り当てると、列は自動的に左揃えになります。 大容量のデータマップ(500 アイテム以上)使用時のコンボボックスのパフォーマンスを改善しました。 【GridTree.Sort メソッドへのオーバーロードの追加】 新しいオーバーロードが GridTree.Sort メソッドに追加されました。この新しいオーバーロードは、_flex.Sort(IComparer コンペア ラ)に類似したカスタムコンペアラをパラメータとして取得します。 【印刷コードへの付加チェックの追加】 印刷コードに付加チェックが追加されました。この結果、ユーザーが文書の半分ほどページサイズを変更したところで、新しい ページサイズに合うようにグリッドイメージが適宜縮小されます。 【VisualStyle プロパティの追加】 VisualStyle プロパティが C1FlexGridBase クラスに追加されました。このプロパティは、VisualStyle 列挙体から値を取得し、一 般的に使用される視覚スタイルにマッチするようにグリッドの外観全体をカスタマイズします。VisualStyle プロパティを使用する と、複数の個別プロパティやスタイルをカスタマイズしなくても、高品質なレイアウトを素早くかつ簡単に設定できます。 VisualStyle プロパティは、行/列ヘッダの描画や強調に使用するグラデーション、枠、および選択領域を制御します。フォント、 前景色など、外観に関連しないその他のプロパティには影響を与えません。 また、VisualStyle プロパティは ComponentOne Studio に含まれるすべてのコントロールに実装されているため、一貫性のあ るプロフェッショナルな外観を持つアプリケーションを作成することが可能です。 VisualStyle で使用可能な設定は以下のとおりです。 VisualStyle 説明 Custom 視覚スタイルなし(通常のスタイルと外観のプロパティを使用します) System スタイルは現在のシステム設定に一致します。 Office2007Blue スタイルは Office2007 Blue カラースキームに一致します。 Office2007Silver スタイルは Office2007 Silver カラースキームに一致します。 Office2007Black スタイルは Office2007 Black カラースキームに一致します。 VisualStyle プロパティの設定方法に関する詳細は、「VisualStyle を使用して外観を変更する」を参照してください。 【RowCollection.Add メソッド (Int32) および ColumnCollection.Add メソッド (Int32) メソッドの追加】 Add メソッド (Int32)と Add メソッド (Int32)が、それぞれ RowCollection クラスと ColumnCollection クラスに追加されました。こ れらのメソッドは InsertRange に似ていますが、特定の位置にエレメントを追加するのではなく、常にコレクションの最後に追加し ます。 【MouseEnterCell イベントおよび MouseLeaveCell イベントの追加】 MouseEnterCell イベントと MouseLeaveCell イベントが C1FlexGridBase クラスに追加されました。これらのイベントは、非推 奨となった MouseHoverCell に置き換わるものです。MouseHoverCell は、入るか、離れるセルの行および列インデックスを 含む RowColEventArgs を渡します。 【RowCol.Grid プロパティの追加】 行または列オブジェクトからオーナーグリッドコントロールへの参照の取得を可能にする Grid を追加しました。? 【SaveExcelメソッドのオーバーロード追加】 メソッドのオーバーロード追加】 SaveExcel メソッドに以下のオーバーロードが追加されました。 31 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C1FlexGridBase.SaveExcel(String, String, FileFlags, PrinterSettings) 【Microsoft® Office Excel 2007 ファイルの読み込みと保存をサポートする OpenXml の追加】 Microsoft® Office Excel 2007 ファイルの読み込みと保存をサポートする OpenXml の追加 FlexGrid for WinForms は、Open Xml Format をサポートするようになりました。これは Microsoft Excel ファイルに対応する 2007 Microsoft® Office System のデフォルトの XML ベースのファイル形式です。OpenXml ファイルには、ZIP 形式を使用して 圧縮された多くの XML ファイルが含まれています。これらのファイルは圧縮されているため、OpenXml ファイルは一般的な文書 ファイル(.doc および .xls など)よりも通常小さくなります。.xls ファイルの読み込みや保存と同じように、.xlsx ファイルまたは OpenXml ファイルを別の拡張子を使用して、読み込み、保存することができます。詳細は、「OpenXml ファイルの読み込みと保 存」を参照してください。 【その他】 IC1EmbeddedEditor インタフェースを公開しました。 IC1EmbeddedEditor のメソッドはリフレクションを使用して呼び出されることに注意してください。コントロールはインタ フェース全体を実装する必要はありません。一致する名前、パラメータ、および戻り値を持つパブリックメソッドはすべて、 グリッドによって認識されて呼び出されます。 AggregateFlags 列挙体に新しい値、AggregateFlags.ExcludeHiddenCells を追加しました。 小計行機能を改良して TimeSpan 値の操作を可能にしました。 C1FlexGridBase.AutoSizeCols メソッドを改良し、ヘッダセル内のソートグリフが占めるスペースを計算に入れるようにし ました。 値の強制型変換のパフォーマンスを改善(書式付き文字列のロード時に特に著しく改善)しました。 コントロールの作成とロード時間の最適化を追加しました。 アクセシビリティを改良して ComponentOne True DBGrid と Microsoft DataGridView との整合性を保証します。 XP スタイルの境界線の描画を改良しました。 XP スタイルが有効にされ、ScrollableControl.BorderStyle プロパティ が XpThemes または FixedSingle に設定されて いる場合、テーマの色が SystemColors.WindowFrame の代わりに使用されます。 UseCompatibleTextRendering プロパティ UseCompatibleTextRendering プロパティは、コントロールが Graphics クラス(GDI+。旧バージョンと互換性を持ち、 デフォルトで true)、または新しい TextRenderer(GDI。.NET 2.0 以上で使用可能)を使用してテキストを描画するかどうかを決定します。 TextRenderer ク ラスは、複雑なスクリプトをサポートする GDI、およびいくつかの国際的アプリケーションにより対応させた Uniscribe API を使用します。また、GDI はハードウェアアクセラレーションもサポートしていますが、テストでは、新しい GDI 描画では互 換(GDI+)モードより約 25% 処理が遅くなります。 このプロパティは、各自のアプリケーションの他のコントロールやダイアログに一致したモードを選択できるように追加さ れました。 クラスメンバ 4.0J で追加されたメンバは以下のとおりです。 メンバ 説明 ComboBoxEditorプロパティ 現在アクティブな エディタのプロパティへの簡単なアクセスを提供する ComboBoxEditor オブジェクトを取得します。 GetDataDisplay メソッド (Int32, Int32, ByRef Image, ByRef CheckEnum) 文字列として書式設定されたグリッドセルの値、およびセル内の画像 またはチェックボックスを取得します。 GetDataDisplay メソッド (Int32, String, ByRef Image, ByRef CheckEnum) 文字列として書式設定されたグリッドセルの値、およびセル内の画像 またはチェックボックスを取得します。 IsCellCheckBoxメソッド セルの内容をチェックボックスとして表示するかどうかを決定する値を 取得します。 IsCellSelectedメソッド セルが選択されているかどうかを決定する値を取得します。 BackgroundImageプロパティ スタイルの背景画像を取得または設定します。 32 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms LoadExcel メソッド (String, FileFlags) Microsoft Excel(.xls)ファイルの最初のワークシートからグリッドを ロードします。 MergedRangesプロパティ C1FlexGrid.AllowMerging プロパティが AllowMergingEnum.Custom 列挙体 に設定されたときにマージす るグリッドセルを決定する CellRangeCollection を取得します。 SaveExcel メソッド (String, FileFlags) グリッドの内容を Microsoft Excel(.xls)ファイルに保存します。 ScrollOptionsプロパティ グリッドのスクロール動作を指定する ScrollFlags 列挙体 値を取得ま たは設定します。 垂直スクロールチップを表示する前に発生します。 ShowScrollTipイベント ShowThemedHeadersプロパティ コントロールが行ヘッダまたは列ヘッダの表示に XP テーマを使用す るかどうかを取得または設定します。 SortColumnプロパティ グリッドに適用された現在のソートを定義する列への参照を取得しま す。 Subtotal メソッド (AggregateEnum, Int32, String, String) セルの内容に基づいて行をグループ化して集計値を計算します。 Subtotal メソッド (AggregateEnum, Int32, String, String, String) セルの内容に基づいて行をグループ化して集計値を計算します。 Subtotal メソッド (AggregateEnum, Int32, String, String, String, String) セルの内容に基づいて行をグループ化して集計値を計算します。 UseCompatibleTextRenderingプロパティ テキスト描画が以前のリリースの Windows Forms と互換性を持つか どうかを指定します。 CellRangeCollectionクラス CellRange オブジェクトのコレクション。 新しい CellRange オブジェクトをコレクションに追加します。 Add メソッド (CellRange) Add メソッド (CellRange, Boolean) 新しい CellRange オブジェクトをコレクションに追加します。オプション として、他の重複する範囲をコレクションから削除します。 Clearメソッド コレクションからすべてのオブジェクトを削除します。 Containsメソッド CellRange オブジェクトがコレクションのメンバかどうかを決定します。 Count プロパティ コレクション内の CellRange の数を取得します。 IndexOf メソッド (CellRange) コレクションの CellRange のインデックスを取得します。 IndexOf メソッド (Int32, Int32) コレクション内で指定した行と列を含む最初の CellRange オブジェクト のインデックスを取得します。 Insertメソッド CellRange オブジェクトをコレクションの指定したインデックスに挿入し ます。 Itemプロパティ 指定したインデックスにある CellRange オブジェクトを取得または設定 します。 Removeメソッド CellRange オブジェクトをコレクションから削除します。 RemoveAtメソッド コレクションから指定したインデックスにあるオブジェクトを削除しま す。 BackgroundImageLayoutプロパティ スタイルが背景画像を拡大縮小して配置する方法を決定する値を取 33 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 得または設定します。 SelectedColumnHeaderプロパティ 選択した列ヘッダの描画に使用するスタイルを取得します。 SelectedRowHeaderプロパティ 選択した行ヘッダの描画に使用するスタイルを取得します。 BuildString メソッド (StyleElementFlags) この CellStyle の文字列表示を返します。 IndexOf メソッド (String, Boolean) 指定した名前を持つ のインデックスを取得します。オプションとして、 列が見つからない場合例外をスローします。 ComboBoxEditorクラス 現在アクティブな ComboBox エディタに関する情報を提供するヘル パークラス。 Itemsプロパティ 現在アクティブな ComboBox エディタ内の項目のコレクションを取得 します。 SelectedIndexプロパティ 現在アクティブな ComboBox エディタ内で選択されたインデックスを 取得または設定します。 SelectedItemプロパティ 現在アクティブな ComboBox エディタ内で選択された項目を取得また は設定します。 SelectedKeyプロパティ 現在アクティブな ComboBox エディタ内で選択された項目に対応する キーを取得します。 MaximumLevelプロパティ アウトラインの最も深いノードのレベルを取得します。 ScrollBarsVisibleプロパティ 現在表示されているスクロールバーを示す ScrollableControl.ScrollBars 値を取得します。 ExcludeHiddenCells(AggregateFlags列挙体のメ ンバ) 集計から非表示行と列を除外します。 Custom(AllowMergingEnum列挙体のメンバ) C1FlexGrid.MergedRanges コレクションを使用してマージするセルを 決定します。 BackgroundImage(StyleElementFlags列挙体の メンバ) スタイルの背景画像を指定します。 BackgroundImageLayout(StyleElementFlags列 挙体のメンバ) スタイルの背景画像の配置を指定します。 DelayedCommit(EditFlags列挙体のメンバ) 行の変更、またはフォーカスの移動の場合のみデータソースへの変更 をコミットします。 IncludeMergedRanges(FileFlags列挙体のメンバ) C1FlexGridBase.SaveExcel メソッドと C1FlexGridBase.LoadExcel メ ソッドを使用し、マージ範囲を含めて Excel の保存およびロードしま す。 LoadMergedRanges(FileFlags列挙体のメンバ) C1FlexGridBase.LoadExcel メソッドを使用して Excel からのインポート 時にマージ範囲をロードします。このフラグは、テキストファイルのロー ド時には影響せず、Excel 入力の場合のみに影響します。 NoFreezing(FileFlags列挙体のメンバ) C1FlexGridBase.SaveExcel メソッドと C1FlexGridBase.LoadExcel メ ソッドを使用し、Excel のエクスポートとインポート時に行と列をフリー ズしません。 SaveMergedRanges(FileFlags列挙体のメンバ) マージ範囲を xls 出力ファイルに保存します。このフラグは、テキスト ファイルの保存のときは影響せず、Excel 出力のときにのみ影響しま す。 SelectedColumnHeader(CellStyleEnum列挙体 選択した列ヘッダの描画に使用するスタイル。 34 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms のメンバ) SelectedRowHeader(CellStyleEnum列挙体のメ ンバ) 選択した行ヘッダの描画に使用するスタイル。 ShowThemedHeadersEnum列挙体 コントロールが行ヘッダまたは列ヘッダの表示にテーマを使用するか どうかを指定します。 TileStretch(ImageAlignEnum列挙体のメンバ) 画像を部分に分けてグリッドに入れ、隅部分はコピーし、中央はセル の大きさに合わせて伸縮します。 UseNumericEditor(EditFlags列挙体のメンバ) 数値型を編集するときに組み込み数値エディタを使用します。 IC1EmbeddedEditorインタフェース エディタによって実装され、グリッドによってセル上の編集コントロール をホストするために使用されるインタフェース。 C1EditorFormatメソッド 指定したマスクを使用して特定の値を書式設定します。 C1EditorGetStyleメソッド 編集前と編集中に表示するボタンの種類を決定するエディタスタイル (DropDown、Modal、None)を取得します。 C1EditorGetValueメソッド エディタの現在の値を取得します。 C1EditorInitializeメソッド エディタの内容とスタイルを初期化するために呼び出されます。 C1EditorKeyDownFinishEditメソッド 特定のキーが編集を終了するかどうかを決定する値を取得します。 C1EditorUpdateBoundsメソッド エディタのサイズと位置を更新するために呼び出されます。 C1EditorValueIsValidメソッド エディタの現在の内容が有効かどうかを決定する値を取得します。 OwnerDrawCellEventArgs コンストラクタ OwnerDrawCellEventArgs クラスの新しいインスタンスを初期化しま す。 MouseEnterCellイベント マウスがセルに入ると発生します。 MouseLeaveCellイベント マウスがセルから離れる発生します。 ResetVisualStyleメソッド VisualStyle プロパティの値をリセットします。 VisualStyleプロパティ コントロールの外観全体を決定する値を取得または設定します。 Add メソッド (Int32) Column オブジェクトの特定の数をコレクションに追加します。 Sort メソッド (Int32, IComparer) 指定されたIComparerを使用して、すべてのノードを特定のレベルで ソートします。 Add メソッド (Int32) Row オブジェクトの特定の数をコレクションに追加します。 VisualStyle列挙体 コントロールの描画時に使用する VisualStyle を指定します。 Grid プロパティ この行または列を所有する C1FlexGridBase@C1FlexGridBase への 参照を取得します。 3.0Jで更新された内容 以下は、 FlexGrid for .NET 3.0J で追加された主な機能です。 マルチカラムコンボボックスへの対応 XML ファイルのインポート/エクスポート(C1FlexGridBase.ReadXml/C1FlexGridBase.WriteXml メソッド) セルラベルの表示(ShowCellLabels プロパティ) エラー情報の表示(ShowErrors プロパティ、C1FlexGridBase.GetCellErrorInfo/C1FlexGridBase.GetRowErrorInfo イベント) XP のテーマを追加(ScrollableControl.BorderStyle プロパティ) 35 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms スタイルの保持メカニズムを改良 Excel エクスポートの現地通貨処理フィルタを改良 AddNew の動作を改良して他のグリッド(TrueDBGrid、Microsoft DataGrid、Microsoft Access)との整合性を向上 内部使用または保護されていた便利なメソッドを表示 PrintGridFlags 列挙体に ExtendLastCol 設定を追加 追加機能概要 【マルチカラムコンボボックスへの対応】 新しい IC1MulticolumnDictionary インタフェースを実装した DataMaps と共に、複数列コンボが実装されました。 MultiColumnDictionary クラスは、IC1MultiColumnDictionary を持っており、文字列データまたはデータソース(ITypedList を実装する任意のオブジェクト)に基づく複数列データマップとして使用できます。 MultiColumnDictionary クラスには2つのコンストラクタがあります。 コンストラクタの1つは、パイプ区切り(|)の項目リストを格納する文字列を取ります。 各項目はタブ区切りの列リストを格納します。 Visual Basic コードの書き方 Visual Basic ' 文字列に基づく MultiColumnDictionary を作成して、列に割り当てます。 ' 注意:これにより各項目に整数型のキーが自動的に生成され、 ' キー値がグリッド内に格納されます。 Dim text As String = "Row1, Col1\tRow1, Col2 Dim map As MultiColumnDictionary = New MultiColumnDictionary(text,0,True) _flex.Cols(1).DataMap = map C# コードの書き方 C# // 文字列に基づく MultiColumnDictionary を作成して、列に割り当てます。 // 注意:これにより各項目に整数型のキーが自動的に生成され、 // キー値がグリッド内に格納されます。 string text = "Row1, Col1\tRow1, Col2|Row2, Col1\tRow2, Col2"; MultiColumnDictionary map = new MultiColumnDictionary(text, 0, true); _flex.Cols[1].DataMap = map; もう1つのコンストラクタは、4つの引数を取ります。すなわち、データソース、グリッドに格納されるデータの格納先の列の名 前、ドロップダウンリストに表示されるフィールドのリスト、リストを閉じたときにグリッドに表示される列インデックスです。たとえ ば、次のようになります。 Visual Basic コードの書き方 Visual Basic ' データに基づく MultiColumnDictionary を作成して、列に割り当てます。 ' 注意:データソースが変更されるとリストは自動的に更新されます。 Dim dt As DataTable = GetDataTable("employees") Dim columnNames() As String = New String() {"FirstName", "LastName", "Country"} Dim map As MultiColumnDictionary = New MultiColumnDictionary(dt,"EmployeeID",columnNames,1) _flex.Cols(2).DataMap = map 36 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# // データに基づく MultiColumnDictionary を作成して、列に割り当てます。 // 注意:データソースが変更されるとリストは自動的に更新されます。 DataTable dt = GetDataTable("employees"); string[] columnNames = new string[] { "FirstName", "LastName", "Country" }; MultiColumnDictionary map = new MultiColumnDictionary(dt, "EmployeeID", columnNames, 1); _flex.Cols[2].DataMap = map; 【AddNew の動作を改良して他のグリッド( の動作を改良して他のグリッド(TrueDBGrid、 、Microsoft DataGrid、 、Microsoft Access)との整合性を向上】 )との整合性を向上】 これまで、新しい行はカーソルが新しい行テンプレート内に移動したときに追加されていましたが、今回のバージョンからは、 ユーザーが新しい行テンプレートの編集を開始したときに新しい行が追加されるようになりました。 【内部使用または保護されていた便利なメソッドを表示】 内部使用または保護されていた以下のメソッドが表示されるようになりました。 メソッド 説明 IsCellFixed(int row, int col) ブール型 IsCellCursor(int row, int col) ブール型 IsCellHighlighted(int row, int col) ブール型 IsCellValid(int row, int col) ブール型 HitTestInfo HitTest() 引数なし。現在のマウス位置を使用します。 SetCellStyle(int row, int col, string styleName) void。名前によってスタイルを設定します。 Styles.Add(string name, string basedOn) CellStyle。名前によってスタイルを作成します。 【PrintGridFlags 列挙体に ExtendLastCol 設定を追加】 この新しい設定により、グリッドは各印刷ページの最後の列を拡張します。C1FlexGridBase.PrintGrid メソッド、および C1PrintDocument と共に使用できます。たとえば、次のようになります。 Visual Basic コードの書き方 Visual Basic ' PrintGrid メソッドを使用してグリッドを印刷します。 _flex.PrinGrid("mygrid", PrintGridFlags.ShowPreviewDialog Or PrintGridFlags.ExtendLastCol) ' C1PrintDocument を使用してグリッドを印刷します。> _flex.PrintParameters.PrintGridFlags = PrintGridFlags.ExtendLastCol Dim c1pd As New C1PrintDocument() c1pd.StartDoc() c1pd.RenderBlockText("This is a C1PrintDocument.") c1pd.RenderBlockText(" ") c1pd.RenderBlockC1Printable(_flex, c1pd.BodyAreaSize.Width) c1pd.EndDoc() 37 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# // PrintGrid メソッドを使用してグリッドを印刷します。 _flex.PrinGrid("mygrid", PrintGridFlags.ShowPreviewDialog // C1PrintDocument を使用してグリッドを印刷します。 _flex.PrintParameters.PrintGridFlags = PrintGridFlags.ExtendLastCol; C1PrintDocument c1pd = new C1PrintDocument(); c1pd.StartDoc(); c1pd.RenderBlockText("This is a C1PrintDocument."); c1pd.RenderBlockText(" "); c1pd.RenderBlockC1Printable(_flex, c1pd.BodyAreaSize.Width); c1pd.EndDoc(); これは、グリッドの ExtendLastCol プロパティから完全に独立していることに注意してください。ExtendLastCol グリッドプロパ ティは印刷に対して効力を持ちません。 2.0Jで更新された内容 以下は、FlexGrid for .NET 2.0J で追加された主な機能です。 カスタムエディタへの対応 Excel ファイルの保存とロード 自動クリップボードへの対応 セルのマージとグループ化のカスタム動作 データソースオブジェクトへの簡単アクセス CellStyle クラスのパワーアップ 新しいイベント 処理のスピードアップ 追加機能概要 【カスタムエディタへの対応】 任意の .NET コントロールをグリッドエディタとして使用できるようになりました。コントロールのインスタンスを列の CellStyle.Editor プロパティに指定すれば、グリッドはそのコントロールを使用して列内のセルを編集できます。 IC1EmbeddedEditor インタフェースを実装して、グリッドと外部エディタの統合を改良することで、カスタムエディタの動作をカ スタマイズできます。C1Input ライブラリ内のコントロールはすべて、IC1EmbeddedEditor を実装しており、グリッドエディタと して使用できるようになりました(コードは必要ありません)。 また、UIType エディタクラスをグリッドエディタとして使用する方法を示すサンプルコードも用意されています(製品付属の 「CustomEditors サンプル」を参照してください)。 【Excel ファイルの保存とロード】 C1FlexGridBase.SaveGrid と C1FlexGridBase.LoadGrid の各メソッドは、Microsoft Excel ファイル(.xls)を保存およびロードで きるバージョンをオーバーロードしました。グリッドでは、純正の .NET コードが使用されているため、Excel をコンピュータにイン ストールする必要がありません。 さらに、C1FlexGridBase.SaveExcel と C1FlexGridBase.LoadExcel という特別のメソッドでは、コントロールを追加してグリッドを Excel ワークブックの特定シートに保存できます。 38 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【自動クリップボードへの対応】 新しい AutoClipboard プロパティでは、グリッドは標準のクリップボードキーを自動的に処理して、セル値の切り取り、コ ピー、貼り付け、および削除を行えます。 【セルのマージとグループ化のカスタム動作】 新しい CustomComparer プロパティでは、隣接セルをマージまたはグループ化するかどうかを決定する場合に使用する IComparer クラスを指定できます。 【データソースオブジェクトへの簡単アクセス】 新しい Row.DataSource プロパティでは、行のデータソースに簡単にアクセスできます。たとえば、グリッドを ADO.NET DataView に連結している場合、各グリッド行に付加された DataViewRow オブジェクトを簡単に取得できます。 【CellStyle クラスのパワーアップ】 CellStyle クラスには、CellStyle.Editor プロパティと CellStyle.Render メソッドが新たに加わりました。 CellStyle.Editor プロパティでは、カスタムエディタを指定できます。CellStyle.Render メソッドでは、スタイルを使用して文字列 やイメージを任意の Graphics オブジェクトに描画できます。 【新しいイベント】 グリッドは、ユーザーが行を追加または削除する前と後にイベントを発生させて、これらのアクション (C1FlexGridBase.BeforeAddRow、C1FlexGridBase.AfterAddRow、C1FlexGridBase.CancelAddRow、 C1FlexGridBase.BeforeDeleteRow、C1FlexGridBase.AfterDeleteRow)を監視したり取り消したりできるようになりました。ま た、非連結データ列をサポートするイベントも新たに追加されました(C1FlexGridBase.GetUnboundValue と C1FlexGridBase.SetUnboundValue の各イベント)。 【処理のスピードアップ】 いくつかの最適化により、グリッドにおける描画やスクロールが旧バージョンに比べて飛躍的に高速化しました。 VS-FlexGrid ProからFlexGrid for WinForms へ Visual Basic 6.0 の環境で、ActiveX 製品 VS-FlexGrid Pro を使用して作成したアプリケーションを、新たに.NET環境で構築し 直す場合、最適なツールとしてなにを選択するべきでしょうか? 答えは、FlexGrid for WinForms です。 FlexGrid for WinForms は、ActiveX コンポーネントである VS-FlexGrid Pro のソースをすべて書き直し、.NET Framework へ シームレスにつながるオブジェクト構造を実現しました。そのため、ADO.NETをはじめとする.NET Framework の革新的な機能 を十二分に活用でき、開発工程の生産性を最大限に高めます。一方で、セルマージやソート、アウトライン表示など、長年に 渡り高い評価を得る、VS-FlexGrid Pro の特長が大切に継承されています。 FlexGrid for WinForms と ActiveX 製品の VS-FlexGrid Pro や MSFlexGrid との間には互換性はなく、移行ツールも用意され ていません。そのため、残念ながら、ソースコードを変更せずに.NETアプリケーションに変換するといったことはできません。 39 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ただし、「製品の特長が継承されている」、このことは思いのほか重要です。はじめて使用するコントロールの場合、使いこな せるようになるまでには、それなりの学習期間が必要ですが、FlexGrid for WinForms を選択することで、これまでに培った ActiveX製品VS-FlexGrid Pro の使用経験を最大限に生かしつつ、.NET での開発をスムーズに進めることができます。元来、 FlexGrid for WinForms はシンプルなオブジェクト構造を持っているため、製品を習得しやすいこともあります。.NETに慣れて いない開発者でも、VS-FlexGrid Pro の経験を生かしつつ、新たな世界に挑戦できます。 このページでは、ActiveX 製品 VS-FlexGrid Pro を使用して作成したアプリケーションを、FlexGrid for WinForms を使用し た.NETアプリケーションに再構築する際に参考となるよう、「.NETとActiveX製品の相違点」、「プロパティ、メソッド、イベント比 較」にて、お役に立てるような情報をご提供しております。ActiveX から .NET アプリケーションへの再構築をご検討中のお客 様は、是非ご覧ください。 FlexGridの.NET 製品とActiveX製品の相違点 ここでは FlexGrid for WinForms と VS-FlexGrid Pro の大きな相違点、行と列のコレクション(Rows/Cols)、スタイル (Styles)、セル範囲(CellRange)、型付けした列についてご紹介します。機能的に異なる点ではなく、.NET 製品と ActiveX 製 品の基本的な考え方の違いになります。 スタイル 40 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 41 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms セル範囲 42 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 43 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 型付けした列 C1FlexGridとC1FlexGridClassic C1FlexGridClassic は、ユーザーサポートの対象外です。 VS-FlexGrid Pro は、複数の VSFlexGrid コントロール(ADO、DAO、アンバウンド、Unicode など)で構成されていますが、 FlexGrid for WinForms では、C1FlexGrid と C1FlexGridClassic の2種類になります。 C1FlexGrid は VS-FlexGrid Pro の ActiveX コントロールを単に移植しただけものではありません。C1FlexGridは、まったく新し いタイプのグリッドコントロールとしてC#でゼロから記述されており、同じ設計原理を使用しながら ActiveX コントロールのオブ ジェクトモデルよりさらに最新かつクリーンでパワフルな新しいオブジェクトモデルを採用しています。C1FlexGridコントロール は、ADO.NET データソースに連結することも、非連結モードで使用することも可能です。 また、既存アプリケーションとのソースコードの互換性を最高レベルに維持するため、さらには、VS-FlexGrid Pro ユーザーの 学習曲線をできる限りスムーズなものにするため、C1FlexGridClassic コントロールも提供されています。 C1FlexGridClassic は、C1FlexGrid を基本クラスとして使用するコントロールで、VS-FlexGrid Pro 7.0J のオブジェクトモデルと ほとんど同じオブジェクトモデルを提供します。C1FlexGridClassicのソースコードが提供されているため、新しいオブジェクトモ デルの使い方を正確に理解することが可能です。あるいは、ソースコードを手本にして、C1FlexGridを基本クラスにした独自の グリッドを作成できます。 新しく.NETアプリケーションを作成する場合は、C1FlexGrid コントロールをご利用ください。 カスタムコントロールを作成したい場合や、VS-FlexGrid Pro に動作を近づけたい場合などに、C1FlexGridClassic コントロール のソースコードを参考にしてください。 44 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms プロパティ比較一覧 全般 VS-FlexGrid Pro FlexGrid for WinForms 備考/機能概要 AllowBigSelection SelectionModeプロパティ SelectionModeEnum (C1FlexGridBaseクラス) 行(列)のヘッダのクリックにより行(列)全体を選択できるようにします。 SelectionModeプロパティ SelectionModeEnum (C1FlexGridBaseクラス) マウスやキーボードを使ってセルを範囲選択できるようにします。 AllowSelection AllowUserFreezing AllowFreezingプロパティ (C1FlexGridBaseクラス) AllowUserResizing AllowResizingプロパティ AllowFreezingEnum マウスを使って静止行(列)数を変更できるかどうかを設定します。 AllowResizingEnum (C1FlexGridBaseクラス) マウスを使って行(列)の大きさを変更できるようにします。 BorderStyleプロパティ BorderStyleEnum (ScrollableControlクラス) ボーダースタイルを取得または設定 AutoResize AutoResizeプロパティ (C1FlexGridBaseクラス) データベースからデータを読み込んだときに、列の幅を自動的に調節 するかどうかを設定します。 AutoSearch AutoSearchプロパティ AutoSearchEnum (C1FlexGridBaseクラス) ユーザーが文字をタイプしたときに一致する項目を検索するかどうかを 設定します。 AutoSearchDelayプロパティ AutoSearchプロパティで使用されるバッファがリセットされるまでの遅 延時間を秒単位で設定します。 Appearance AutoSearchDelay (C1FlexGridBaseクラス) AutoSizeMode AutoSizeRowsメソッド AutoSizeFlags AutoSizeRowメソッド AutoSizeメソッドが有効のとき、列幅と行の高さのどちらを調整するか を設定します。 AutoSizeColメソッド AutoSizeColsメソッド (C1FlexGridBaseクラス) AutoSizeMouse AllowResizingプロパティ AllowResizingEnum (C1FlexGridBaseクラス) 行ヘッダをダブルクリックすると、列内のデータに合わせて列幅が自動 調節されるかどうかを設定します。 BackColor Styles.Normal.BackColorプ ロパティ スクロール可能領域の背景 色を設定します。 BackColorAlternate Styles.Alternate.BackColorプロパティ 1行おきの背景色を設定します。 BackColorBkg Styles.EmptyArea.BackColor グリッドの最後の列(最右列)または行(最下行)を越えた通常グレー表 プロパティ 示されている領域の背景色を設定します。 BackColorFixed Styles.Fixed.BackColorプロ パティ BackColorFrozen Styles.Frozen.BackColorプロ 静止列(行)の背景色を設定します。 パティ 45 固定列(行)の背景色を設定します。 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms CaseSensitive (VSFlexString) FindRowメソッド (C1FlexGridBaseクラス) 文字検索において、大文字と小文字を区別するかどうかを設定しま す。 引数caseSensitiveを使用 Clip Clipプロパティ 選択範囲のセルの内容を設定します。 (C1FlexGridBaseクラス、 CellRange構造体) ClipSeparators ClipSeparatorsプロパティ 行(列)区切りに使用される文字を設定します。 (C1FlexGridBaseクラス) Editable AllowEditingプロパティ コントロールを編集可能にするかどうかを設定します。 (C1FlexGridBase、RowColク ラス) EditMask EditMaskプロパティ セル編集に使用する入力マスクを設定します。 (C1FlexGridBase、 CellStyle、RowColクラス) EditMaxLength TextBoxのMaxLengthプロパ セルに入力可能な文字数を設定します。 ティを使用 製品ヘルプ:よくある質問 (FAQ)を参照 EditSel??? TextBoxのSelectionStartプ ロパティなどを使用 セル内で範囲選択されたテキストの文字数/開始点/文字列を設定し ます。 製品ヘルプ:よくある質問 (FAQ)を参照 EditText Editor.Textプロパティ 編集するセルの内容を設定します。 (C1FlexGridBaseクラス) EditWindow Editor プロパティ グリッドが現在編集モードかどうかを検査できます。 (C1FlexGridBaseクラス) FillStyle FlexDataSource SelectionModeプロパティ SelectionModeEnum (C1FlexGridBaseクラス) プロパティの設定対象をカレントセルにするか、選択されたすべてのセ ルにするかを指定します。 DataSourceプロパティ データソースを設定します。 (C1FlexGridBaseクラス) FloodColor オーナー描画を使用 インジケータのようにセルを塗りつぶす色を設定します。 製品ヘルプ:よくある質問 (FAQ)を参照 FontWidth Font プロパティ テキストフォントの幅を設定します。 (C1FlexGridBase、CellStyle クラス) ForeColor Styles.Normal.ForeColorプ ロパティ スクロール可能領域のテキスト色を設定します。 ForeColorFixed Styles.Fixed.ForeColorプロ 固定列(行)のテキスト色を設定します。 46 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms パティ ForeColorFrozen Styles.Frozen.ForeColorプロ 静止列(行)のテキスト色を設定します。 パティ FormatString Styles.Fixed.TextAlign、 Caption プロパティ 列の幅、列の配置、固定行(列)の数およびそれらのヘッダとして表示 するテキストなどを設定します。 前バージョンとの互換のために用意さ れています。 (Row、Column クラス) Appearance BorderStyleプロパティ (ScrollableControlクラス) ボーダースタイルを取得または設定 GridColor GridColorFixed Styles.Normal.Border.Color Styles.Fixed.Border.Colorプロパティ データセルまたは固定行(列)のグリッド線の色を設定します。 GridLines GridLinesFixed Styles.Normal.Border.Style Styles.Fixed.Border.Styleプロパティ 通常セルまたは固定行(列)のグリッド線のスタイルを設定します。 GridLineWidth Styles.Normal.Border.Width グリッド線の幅を設定します。 プロパティ HighLight HighLightプロパティ 選択したセルをハイライト表示します。 (C1FlexGridBase、 CellStyleCollecitionクラス) OLEDragMode OLEDropMode OwnerDraw Picture DragModeプロパティ DragModeEnum (C1FlexGridBaseクラス) OLEドラッグ&ドロップ操作の処理をコンポーネントが自動で行うか、ま たはコードから手動で行うかを設定します。 DropModeプロパティ DropModeEnum (C1FlexGridBaseクラス) コントロールが自動または手動のどちらのOLEドロップターゲットとして 使用できるかを設定します。 DrawModeプロパティ DrawModeEnum (C1FlexGridBaseクラス) DrawCellイベントを発生させるタイミングを設定します。 BackgroundImageプロパ ティ VSFlexGridコントロールのピクチャ(表全体を表したビットマップ)を参照 します。 (C1FlexGridBaseクラス) PictureType 該当なし Pictureプロパティによって生成されるピクチャの形式を設定します。 Redraw BeginUpdateメソッド、 EndUpdateメソッド VSFlexGridコントロールの再描画を制御します。 (C1FlexGridBaseクラス) RightToLeft 該当なし テキストの表示方向(右から左へ/左から右へ)を設定します。 SelectionMode SelectionModeプロパティ SelectionModeEnum (C1FlexGridBaseクラス) 行(列)単位、またはリストボックス方式でセルを選択できるようにしま す。 Border プロパティ グリッド全体を囲むボーダーの色、および静止領域とスクロール可能領 域との境界線の色を設定します。 SheetBorder (CellStyleクラス) TabBehavior 47 KeyActionTabプロパティ KeyActionEnum Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms (C1FlexGridBaseクラス) [Tab]キーでフォーカスを移動する対象を、コントロールとグリッドセル のどちらにするかを指定します。 セル関連 VS-FlexGrid Pro FlexGrid for WinForms 備考/機能概要 BackColorSel Styles.Highlight.BackColorプ ロパティ 選択されたセルのテキスト色の背景色を設定します。 Cell CellRangeオブジェクト 任意の選択範囲の属性を設定します。 Cell??? GetCellRectメソッド セルの高さ/幅/上端の位置/左端の位置を参照し、必要があ れば、画面をスクロールしてそのセルを表示領域内に移動します。 CellAlignment TextAlignプロパティ TextAlignEnum (CellStyleクラス、RowColクラ ス) セルまたは指定範囲のセルのどの位置にデータを表示するかを設 定します。 CellForeColor BackColorプロパティ セルまたは指定範囲のセルの背景色/文字色を設定します。 CellBackColor ForeColorプロパティ (CellStyleクラス) CellButtonPicture CellButtonImageプロパティ セルボタンに使用されるピクチャを設定します。 (C1FlexGridBaseクラス) CellChecked CheckBoxプロパティ CheckEnum (CellRangeオブジェクト) セルまたは指定範囲のセルにチェックボックスを表示するかどうか を設定します。 GetCellCheckプロパティ、 SetCellCheckプロパティ、 GetCellCheckメソッド、 SetCellCheckメソッド (C1FlexGridBaseクラス) CellFloodColor オーナー描画を使用 インジケータのようにセルを塗りつぶす色を設定します。 製品ヘルプ:よくある質問 (FAQ)を参照 CellFloodPercent オーナー描画を使用 製品ヘルプ:よくある質問 (FAQ)を参照 CellFont??? Font プロパティ セルを塗りつぶす領域を、セル全体に対する百分率で設定しま す。 セルに使用されるテキストのフォントを設定します。 (CellStyleクラス) CellPicture Image プロパティ セルまたは指定範囲に表示するピクチャを設定します。 (CellRangeオブジェクト) SetCellImageメソッド、 GetCellImageメソッド (C1FlexGridBaseクラス) 48 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms CellPictureAlignment ImageAlign プロパティ CellTextStyle ComboCount ImageAlignEnum (CellStyle、RowColクラス) セルまたは指定範囲のセルのどの位置にピクチャを表示するかを 設定します。 TextEffect プロパティ TextEffectEnum (CellStyleクラス) セルまたは指定範囲のセルのテキストの表示スタイルを設定しま す。 ComboBoxEditor.Items.Count セルのコンボリストの項目数を参照します。 プロパティ (ComboBoxEditorクラス) ComboData DataMapプロパティ セルのコンボリストの項目に関連付けられたID文字を参照します。 (RowCol、CellStyleクラス) ComboIndex SelectedIndexプロパティ (ComboBoxEditorクラス) ComboItem SelectedItemプロパティ (ComboBoxEditorクラス) ComboList ComboListプロパティ セルのコンボリストで現在選択されている項目のインデックスを設 定します。 リストを使って編集を行うときのみ、セルのコンボリストの項目に関 連付けられた文字列を参照します。 セルのコンボリストの項目を設定します。 (C1FlexGridBase、CellStyle、 RowColクラス) ComboSearch Ellipsis EditOptionsプロパティ EditFlags AutoSearchを使用 (C1FlexGridBase クラス) コンボリストがユーザー入力文字の自動検索(インクリメンタル サーチ)をサポートするかどうかを設定します。 Trimming プロパティ StringTrimming (CellStyleクラス) セル内の文字列がすべて表示できないときに、省略符号(...)を表 示するようにするかどうかを設定します。 製品ヘルプ:よくある質問 (FAQ)を参照 FocusRect FocusRect プロパティ (C1FlexGridBaseクラス) カレントセルの周囲に描画するフォーカス枠のスタイルを設定しま す。 ForeColorSel Styles.Highlight.ForeColorプ ロパティ 選択されたセルのテキスト色を設定します。 PicturesOver ImageAndTextプロパティ セル内のテキストとピクチャを重ね合わせるかどうかを設定しま す。 (RowColクラス) Text(VSFlexGrid) SetDataメソッド カレントセルまたは指定範囲のセルのテキストを設定します。 (C1FlexGridBaseクラス) TextArray Item プロパティ 任意のセルのテキストを設定します。 (C1FlexGridBaseクラス) TextMatrix TextEffectプロパティ 任意のセルのテキストを設定します。 (CellStyleクラス) TextStyle TextStyleFixed 49 TextEffectプロパティ TextEffectEnum (CellStyleクラス) 標準のセルと固定列(行)のテキストを3D表示します。 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Value 該当なし カレントセルの数値を参照します。 ValueMatrix 該当なし 指定したセルの数値を参照します。 列関連 VS-FlexGrid Pro FlexGrid for WinForms 備考/機能概要 Col カレント列を設定します。 Col プロパティ (C1FlexGridBaseクラス) ColAlignment ColComboList TextAlignプロパティ TextAlignEnum (RowColクラス) セルのどの位置にデータを表示するかを列単位で設定します。 ComboListプロパティ 指定した列で使用するドロップダウンリストの項目を設定します。 (RowColクラス) ColData UserDataプロパティ ユーザーデータを取得または設定します。 (RowColクラス) ColDataType DataTypeプロパティ 列のデータ型を設定します。 (RowColクラス) ColEditMask EditMaskプロパティ セルの編集に使用する入力マスクを列単位で設定します。 (RowColクラス) ColFormat Format プロパティ 数値、ブール値、日付の表示書式を設定します。 (RowColクラス) ColHidden Visible プロパティ 列を表示するかどうかを設定します。 (RowColクラス) ColImageList ImageMapプロパティ (RowColクラス) ColIndex Index プロパティ データ値をイメージに変換するのに使用するデータマップを取得ま たは設定します。 列のインデックスを参照します。 (RowColクラス) ColIsVisible LeftColプロパティ・RightColプロパ ティにより判別 指定した列が表示領域内にあるかどうかを参照します。 (C1FlexGridBaseクラス) ColKey Name プロパティ 指定の列を識別するためのキーを設定します。 (Column クラス) ColPos Left プロパティ コントロールの左端から指定列の左端までの距離を参照します。 (Column クラス) ColPosition Move メソッド 選択した列を指定した場所に移動します。 (Column、ColumnCollectionクラ ス) Cols Count プロパティ 列の総数を設定します。 (ColumnCollectionクラス) 50 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ColSel ColSelプロパティ 列の選択範囲を設定します。 (C1FlexGridBaseクラス) ColWidth Width プロパティ 指定した列の幅を設定します。 (Column クラス) ColWidthMax MaxSizeプロパティ 列の幅の最大値を設定します。 (RowColCollectionクラス) ColWidthMin MinSizeプロパティ 列の幅の最小値を設定します。 (RowColCollectionクラス) ExtendLastCol ExtendLastColプロパティ (C1FlexGridBaseクラス) FixedAlignment TextAlignFixed プロパティ FixedCols 最後(右端)の列の幅をコントロール幅に合わせて自動的に調節す るかどうかを設定します。 TextAlignEnum (RowColクラス) 固定列のどの位置にテキストを表示するかを設定します。 Fixed プロパティ 固定列の総数を指定します。 (ColumnCollectionクラス) FrozenCols Frozen プロパティ 静止列(編集可能かつスクロール不可の列)の総数を設定します。 (ColumnCollectionクラス) LeftCol LeftColプロパティ コントロールの左端(固定列は除く)に表示する列を設定します。 (C1FlexGridBaseクラス) MouseCol MouseColプロパティ 現在マウスポインタが置かれている列番号を参照します。 (C1FlexGridBaseクラス) RightCol RightColプロパティ コントロールの右端に表示されている列の番号を参照します。 (C1FlexGridBaseクラス) 行関連 VS-FlexGrid Pro FlexGrid for WinForms 備考/機能概要 BottomRow BottomRowプロパティ コントロールの最下部に表示されている行の番号を参照します。 (C1FlexGridBaseクラス) FindRow FindRowメソッド 指定した文字列を含む行インデックスを参照します。 (C1FlexGridBaseクラス) FixedRows Fixed プロパティ 固定行の総数を指定します。 (RowCollectionクラス) FrozenRows Frozen プロパティ (RowCollectionクラス) IsSelected Selected プロパティ (Row、RowCol、RowCollectionクラ ス) 51 静止行(編集可能かつスクロール不可の行)の総数を設定しま す。 指定した行を選択状態にします。また、指定行が選択状態である かどうかを参照します。 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms MouseRow MouseRowプロパティ 現在マウスポインタが置かれている行番号を参照します。 (C1FlexGridBaseクラス) Row Row プロパティ カレント行を設定します。 (C1FlexGridBaseクラス) RowData UserDataプロパティ ユーザーデータを取得または設定します。 (RowCol、CellStyleクラス) RowHeight Height プロパティ 指定した行の高さを設定します。 (Row クラス) RowHeightMax MaxSizeプロパティ 行の高さの最大値を設定します。 (RowCollectionクラス) RowHeightMin MinSizeプロパティ 行の高さの最小値を設定します。 (RowCollectionクラス) RowHidden Visible プロパティ 行を表示するかどうかを設定します。 (RowColクラス) RowIsVisible TopRow/BottomRowプロパティに より判別 指定した行が表示領域内にあるかどうかを参照します。 (C1FlexGridBaseクラス) RowPos Top プロパティ コントロールの上端から指定行の上端までの距離を参照します。 (Row クラス) RowPosition Move プロパティ 選択の行を指定の場所に移動します。 (Row、RowCol、RowCollectionクラ ス) Rows Count プロパティ 行の総数を設定します。 (RowCollectionクラス) RowSel RowSelプロパティ 行の選択範囲を設定します。 (C1FlexGridBaseクラス) RowStatus FrameworkのDataRow.RowStateプ ロパティを使用 行の状態(追加済み、削除済み、修正済み)を示す値を設定しま す。 SelectedRow SelectedRows Selected プロパティ (Row、RowCol、RowCollectionクラス) 選択された行の位置および行数を参照します。 TopRow TopRowプロパティ コントロールの上端(固定列は除く)に表示する行を設定します。 (C1FlexGridBaseクラス) ソート VS-FlexGrid Pro FlexGrid for WinForms 備考/機能概要 ColSort Sort プロパティ 行を並べ替える方向を列ごとに設定します。 (Column クラス) 52 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ExplorerBar AllowDraggingプロパティ ヘッダを使ってソートや移動ができるようにするかどうかを設定します。 AllowSortingプロパティ (C1FlexGridBase、RowColクラ ス) Sort Sort プロパティ 指定した列をソートのキーとして、選択範囲の行を並べ替える順番を設定 します。 (Column クラス) マージ VS-FlexGrid Pro FlexGrid for WinForms 備考/機能概要 MergeCells AllowMergingプロパ ティ (C1FlexGridBaseクラ ス) MergeCol MergeRow MergeRow AllowMergingプロパ ティ AllowMergingEnum 内容の同じセル間のグリッド線を削除し、複数のセルを1つのセルにまとめます (マージします)。 AllowMergingEnum 指定した列(行)のセルをマージします。 (RowColクラス) MergeCompare CustomComparerプロ パティ セルをマージする際の比較方法を設定します。 (C1FlexGridBaseクラ ス) スクロール VS-FlexGrid Pro FlexGrid for WinForms ScrollBars ScrollBarsプロパ 表示するスクロールバーの種類を選択します。 ティ 備考/機能概要 (C1FlexGridBase クラス) ScrollTips ScrollOptionsプ ロパティ ユーザーが垂直方向にスクロールするときに、ツールチップを表示するかどうかを設定し ます。 (C1FlexGridBase クラス) ScrollTipText ShowScrollTipイ ベント グリッドが垂直方向にスクロールしているときに表示するツールチップのテキストを設定し ます。 (C1FlexGridBase クラス) ScrollTrack ScrollOptionsプ ロパティ ユーザーがスクロールのつまみを動かしたときに、それに合わせてVSFlexGridの内容を スクロールするかどうかを設定します。 (C1FlexGridBase クラス) 53 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 計算・小計行 VS-FlexGrid Pro FlexGrid for WinForms 備考/機能概要 Aggregate Aggregate プロパティ AggregateEnum (C1FlexGridBaseクラス) AggregateFlags 特定範囲に対する集合関数(合計、平均など)を算出します。 IsSubtotal 該当なし 指定した行に小計を表示するのか、通常のデータを表示するのかを設定し ます。 MultiTotals 該当なし 小計を1行にまとめて表示するかどうかを設定します。 SubtotalPosition SubtotalPositionプロパ ティ 小計を挿入する位置(データの上または下)を設定します。 (C1FlexGridBaseクラス) データ接続 VS-FlexGrid Pro FlexGrid for WinForms DataMember DataMemberプロパ ティ 備考/機能概要 データメンバを設定します。 (C1FlexGridBaseクラ ス) DataMode 該当なし コントロールをデータソースと連結した場合に、変更内容を同期させるかどうかを設 定します。 DataSource DataSourceプロパ ティ (C1FlexGridBaseクラス) データソースを設定します。 VirtualData 該当なし データをまとめて一度にロードするか、または必要に応じてロードするかを設定しま す。 階層 VS-FlexGrid Pro FlexGrid for WinForms 備考/機能概要 Children Children プロパティ 子ノードの総数を参照します。 (Node クラス) Expanded Expanded プロパティ ノードの現在の状態(展開/縮小)を設定します。 (Node クラス) Image Image プロパティ ノードのピクチャを設定します。 (Node クラス) IsCollapsed Collapsed プロパティ 行の表示状態(展開/縮小)を設定します。 (Node クラス) Key Key プロパティ ノードキーを設定します。 (Node クラス) Level 54 Level プロパティ ノードのアウトラインレベルを参照します。 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms (Node クラス) NodeClosedPicture NodeImageCollapsedプロパ 縮小されたアウトラインノードを表すピクチャを設定します。 ティ (GridTreeクラス) NodeOpenPicture NodeImageExpandedプロパ 展開されたアウトラインノードを表すピクチャを設定します。 ティ (GridTreeクラス) OutlineBar Tree プロパティ (C1FlexGridBaseクラス) OutlineCol Level プロパティ データの表示階層を切り替えるためのアウトラインバーのタイプを設 定します。 アウトラインツリーを表示する列を設定します。 (Node クラス) RowOutlineLevel Tree プロパティ 小計行の表示階層を設定します。 (C1FlexGridBaseクラス) Text(VSFlexNode) Data プロパティ ノードのテキストを設定します。 (Node クラス) TreeColor LineColorプロパティ データをツリー表示するときの線の色を設定します。 (GridTreeクラス) メソッド比較一覧 VS-FlexGrid Pro FlexGrid for WinForms 備考/機能概要 AddItem AddItemメソッド VSFlexGridコントロールに新しい行を追加します。 (C1FlexGridBaseクラス) AddNode AddNodeメソッド (Node クラス) AutoSize AutoSizeCol メソッド カレントノードに基づく特定位置(最初/最後の子ノードなど)にノード を追加します。 セル項目に合わせて列幅または行の高さを自動的に調節します。 AutoSizeCols メソッド AutoSizeRow メソッド AutoSizeRows メソッド (C1FlexGridBaseクラス) BindToArray 該当なし VSFlexGridコントロールをバリアント型の配列に連結します。 BuildComboList 該当なし ColComboListプロパティに割り当てる文字列をレコードセットのデー タから取得します。 CellBorder Color プロパティ カレントセルまたは選択範囲の周りや内側にボーダーを描画します。 Direction プロパティ Width プロパティ (CellBorderクラス) Clear Clear メソッド VSFlexGridコントロールの内容をクリアします。 (C1FlexGridBase、RowCol、 55 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms CellStyleクラスなど) DataRefresh Refresh メソッド データソースのデータを強制的に再取得します。 (C1FlexGridBaseクラス) DragRow Move メソッド ドラッグによる行の移動を開始します。 (Row、RowColクラスなど) EditCell StartEditingメソッド (C1FlexGridBaseクラス) コントロールをセル編集モードに切り替えます。 EnsureVisible EnsureVisibleメソッド 必要に応じてグリッドをスクロールし、指定のノードを表示領域に表示 します。 (Node クラス) FinishEditing FinishEditingメソッド (C1FlexGridBaseクラス) GetMergedRange GetMergedRangeメソッド 保留中のすべての編集を終了し、グリッドをブラウズモードに戻しま す。 指定のセルを含むマージ範囲を参照します。 (C1FlexGridクラス) GetNode GetNodeメソッド NodeTypeEnum (Node クラス) 指定の小計行に対するアウトラインノードオブジェクトを参照します。 GetNodeRow 該当なし アウトラインモードの特定行における親または子ノードなどの行番号 を参照します。 GetSelection Selection プロパティ row1引数(col1引数)の値がrow2引数(col2引数)の値を超えないよ うに、現在の選択範囲を参照します。 (C1FlexGridBaseクラス) LoadArray 該当なし バリアント配列または他のVSFlexGridコントロールからデータをロード します。 LoadGrid LoadExcel メソッド グリッドのデータと形式をファイルから読み込みます。 LoadExcelSheetNames メソッド LoadGrid メソッド (C1FlexGridBaseクラス) Move Move メソッド (Node クラス) アウトラインツリー上で指定のノードを上位または下位レベルに移動 します。 OLEDrag FrameworkのDoDragDropメ ソッドを使用 OLEドラッグ操作を開始します。 Outline Subtotal メソッド 小計の表示階層を設定します。 (C1FlexGridBaseクラス) PrintGrid PrintGridメソッド グリッドをプリンタに出力します。 (C1FlexGridBaseクラス) RemoveItem RemoveItemメソッド VSFlexGridコントロールから行を削除します。 (C1FlexGridBaseクラス) RemoveNode RemoveNodeメソッド 指定のノードおよびそのすべての子ノードをグリッドから削除します。 (Node クラス) SaveGrid 56 SaveExcel メソッド グリッドのデータと形式をファイルに保存します。 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms SaveGrid メソッド (C1FlexGridBaseクラス) Select Select メソッド ノードを選択します。 (C1FlexGridBaseクラス) ShowCell ShowCellメソッド (C1FlexGridBaseクラス) Sort Sort メソッド (C1FlexGridBaseクラス) Subtotal Subtotal メソッド 必要に応じて内容をスクロールし、指定セルを表示領域に表示しま す。 指定した列をソートのキーとして、選択範囲の行を並べ替える順番を 設定します。 (C1FlexGridBaseクラス) 小計を算出します。 イベント比較一覧 VS-FlexGrid Pro FlexGrid for WinForms AfterCollapse AfterCollapseイベント アウトラインモードにおいて、1つまたは複数の行が展開(縮小)された後 に発生します。 AfterDataRefresh AfterDataRefreshイベ ント レコードソースからデータが読み込まれた後に発生します。 AfterEdit AfterEditイベント ユーザーがセルの内容を変更した後に発生します。 AfterMoveColumn AfterDragColumnイベ エクスプローラバー上で、列をドラッグして移動した後に発生します。 ント AfterMoveRow AfterDragRowイベント エクスプローラバー上で、行のドラッグまたはDragRow メソッドの呼び出し によって行を移動した後に発生します。 AfterRowColChange AfterRowColChange イベント カレントセル(RowおよびColプロパティの値)が他のセルに変更された後 に発生します。 AfterScroll AfterScrollイベント コントロールがスクロールされた後に発生します。 AfterSelChange AfterSelChangeイベン 選択したセル範囲(RowSelおよびColSelプロパティの値)が変更された後 ト に発生します。 AfterSort AfterSortイベント エクスプローラバー上で、列ヘッダのクリックによって列をソートした後に発 生します。 AfterUserFreeze AfterFreezeRow イベ ント 静止列(行)の総数が変更された後に発生します。 備考/機能概要 AfterFreezeColumn イ ベント AfterUserResize AfterResizeRow イベ ント ユーザーが行や列の大きさを変更した後に発生します。 AfterResizeColumn イ ベント BeforeCollapse 57 BeforeCollapseイベン ト アウトラインモードにおいて、1つまたは複数の行が展開(縮小)される直 前に発生します。 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms BeforeEdit BeforeEditイベント コントロールがセル編集モードに切り替わるときに発生します。 BeforeMouseDown BeforeMouseDownイ ベント コントロールがMouseDownイベントを処理する前に発生します。 BeforeMoveColumn BeforeDragColumnイ ベント エクスプローラバー上で、ドラッグして列を移動する前に発生します。 BeforeMoveRow BeforeDragRowイベン エクスプローラバー上で、行のドラッグまたはDragRowメソッドの呼び出し ト によって行が移動される直前に発生します。 BeforePageBreak BeforePageBreakイベ ント VSFlexGridコントロールの印刷中に発生し、改ページを制御します。 BeforeRowColChange BeforeRowColChange カレントセル(RowおよびColプロパティの値)が他のセルに変更される直 イベント 前に発生します。 BeforeScroll BeforeScrollイベント コントロールがスクロールされる直前に発生します。 BeforeScrollTip BeforeScrollTipイベン ト スクロール時のツールチップを表示する前に発生します。 BeforeSelChange BeforeSelChangeイベ ント 選択したセル範囲(RowSel、ColSelの値)が変更される直前に発生しま す。 BeforeSort BeforeSortイベント エクスプローラバー上で、クリックして列をソートする前に発生します。 BeforeUserResize BeforeResizeRow イベ ユーザーが行や列の大きさを変更する前に発生します。 ント BeforeResizeColumn イベント CellButtonClick CellButtonClickイベン ト ユーザーがセルのボタンをクリックする前に発生します。 CellChanged CellChangedイベント セルの内容が変更された後に発生します。 ChangeEdit ChangeEditイベント エディタ内のテキストが変更された後に発生します。 ComboCloseUp ComboCloseUpイベン コンボボックスが閉じる前に、発生します。 ト ComboDropDown ComboDropDownイ ベント コンボボックスが閉じる前に、発生します。 Compare Compare イベント Sort プロパティが「9-ユーザー定義」に設定されたときに行を比較するた めに発生します。 DrawCell OwnerDrawCellイベン セルのカスタム描画を行う前に発生します。 ト EnterCell EnterCellイベント 別のセルがアクティブセルになったときに発生します。 Error GridErrorイベント データバウンド時にデータベースエンジンからエラーが返された後に発生 します。 KeyDownEdit KeyDownEditイベント 編集モード中にキーが押されたときに発生します。 KeyPressEdit KeyPressEditイベント 編集モード中に文字が入力されたときに発生します。 KeyUpEdit KeyUpEditイベント 編集モード中にキーが離されたときに発生します。 LeaveCell LeaveCellイベント カレントセルが別のセルに移る直前に発生します。 58 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms RowColChange RowColChangeイベン アクティブセルが別のセルに移ったときに発生します。 ト SelChange SelChangeイベント 選択範囲が別のセルや別の範囲に変更されたときに発生します。 SetupEditWindow SetupEditorイベント 編集ウィンドウを作成して表示する前に、発生します。 StartEdit StartEditイベント コントロールがセル編集モードに切り替わったとき(BeforeEditイベントの 後)に発生します。 StartPage 該当なし グリッドの印刷中、各ページの印刷が開始される直前に発生します。 ValidateEdit ValidateEdit イベント コントロールがセル編集モードから通常のモードに切り替わる前に発生し ます。 59 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms クイックスタート このセクションでは、基本的な C1FlexGrid 機能を使用して、簡単なグリッドアプリケーションを作成する方法について学習しま す。このセクションでは、C1FlexGrid のすべての機能の包括的なチュートリアルを意図するものではありませんが、クイックス タートについて説明し、製品を使用するためのいくつかの一般的な方法に重点を置いて説明します。詳細なチュートリアルに ついては、「チュートリアル チュートリアル」を参照してください。 手順 1: C1FlexGrid を使用したアプリケーションを作成する 次の手順では、簡単なグリッドアプリケーションの作成方法を順を追って説明します。 1. 新しいプロジェクトを作成します。 2. C1FlexGrid コントロールをフォームに追加します。 3. C1FlexGrid タスク メニューを開きます。C1FlexGrid タスク タスクメニューへのアクセスについての詳細は、「C1FlexGrid タ スク」を参照してください。 4. C1FlexGrid タスク タスクメニューで、[親コンテナへのドッキング 親コンテナへのドッキング]をクリックします。これにより、グリッドの Dock プロパティ が Fill に設定され、グリッドがフォーム領域いっぱいに表示されます。 5. プログラムを実行し、簡単なグリッドアプリケーションが表示されます。 おめでとうございます ! 簡単なグリッドアプリケーションが正常に作成されました。次のトピックでは、C1FlexGrid コントロール をデータソースに連結する方法について学習します。 手順 2: C1FlexGrid をデータソースに連結する 次の手順では、「手順 1: C1FlexGrid を使用したアプリケーションを作成する」トピックで作成したグリッドアプリケーションにデータ ソースを連結する方法を順を追って説明します。 1. C1FlexGrid タスク メニューを開きます。C1FlexGrid タスク タスクメニューへのアクセスについての詳細は、「 C1FlexGrid タスク 」 を参照してください。 2. C1FlexGrid タスク タスクメニューで、[データソースの選択 データソースの選択]ドロップダウン矢印をクリックして、ドロップダウンボックスから[プロジェ プロジェ クトデータソースの追加 クトデータソースの追加]リンクを選択します。 3. [データソース構成ウィザード データソース構成ウィザード]が表示されます。[データソースの種類を選択 データソースの種類を選択]ページで選択されたデフォルトの設定[データ データ ベース ベース]をそのままにして、[次へ 次へ]をクリックします。 60 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 4. [データソース データソース モデルの選択 モデルの選択]ページで[データセット データセット]を選択のままにして[次へ 次へ]をクリックします。 5. [新しい接続 新しい接続]ボタンをクリックして、新しい接続を作成するか、ドロップダウンリストから接続を選択します。[接続の追加 接続の追加]ダイ アログボックスが表示されます。 61 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 6. [Microsoft Access データベースファイル データベースファイル]をデータソース データソースにします。 7. [参照 参照]をクリックします。[Microsoft Access データベースファイルの選択 データベースファイルの選択]ダイアログボックスで、製品に収録されている NWind.mdb データベースファイルを選択し、[開く 開く]をクリックします。 8. [接続の追加 接続の追加]ダイアログボックスで、[接続テスト 接続テスト]ボタンをクリックして、データベースまたはサーバーに正常に接続されてい ることを確認します。[データ接続の選択 データ接続の選択]ページに新しい文字列が表示されます。 62 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 9. [OK]をクリックして、[接続の追加 接続の追加]ダイアログボックスを閉じます。 10. [次へ 次へ]ボタンをクリックして、手順を続行します。データファイルをプロジェクトに追加し、接続文字列を変更するかどうかを確 認するダイアログボックスが表示されます。データベースをプロジェクトにコピーする必要がないので、[いいえ いいえ]をクリックしま す。 11. アプリケーションの設定ファイルに接続文字列を保存するには、[次の名前で接続を保存する 次の名前で接続を保存する]チェックボックスをオンにして、 名前を入力します。[次へ 次へ]ボタンをクリックして、手順を続行します。 63 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 12. [データベースオブジェクトの選択 データベースオブジェクトの選択]ページで、[テーブル テーブル]ノードを展開して、[製品 製品]テーブルを選択し、すべてのフィールドを オンにします。[データセット名 データセット名]ボックスに[NwindDataSet]を入力し、[終了 終了]をクリックしてウィザードを終了します。 64 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 13. データセットと接続文字列がプロジェクトに追加されます。さらに、Visual Studio が次のコードを自動的に作成してデータセッ トに入力します。 Visual Basic コードの書き方 Visual Basic Me.ProductsTableAdapter.Fill(Me.ProductsDS.Products) C# コードの書き方 C# this.productsTableAdapter.Fill(this.productsDS.Products); プログラムを実行し、次の点に注目します。 [Products]テーブルのデータがグリッドに表示されます。 65 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms おめでとうございます ! グリッドアプリケーションがデータソースに正常に連結されました。次のトピックでは、書式スタイル、 VisualStyle、および組み込みスタイルをカスタマイズする方法について学習します。 手順 3: C1FlexGrid の設定をカスタマイズする 次の手順では、グリッドの書式スタイル、VisualStyle、および組み込みスタイルの設定を順を追って説明します。 1. デザイナを表示し、最初の列ヘッダーの右端に表示される水平方向の二重矢印を[UnitPrice]列が表示されるまで左 にドラッグして、グリッドの最初の列のサイズを変更します。 2. [UnitPrice]列をクリックして、[Column タスク タスク]メニューを開きます。 66 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 3. [書式設定 書式設定]テキストボックスの横にある省略符号ボタンをクリックして、[書式文字列のダイアログボックス 書式文字列のダイアログボックス]を開きま す。 4. [書式文字列のダイアログボックス 書式文字列のダイアログボックス]で、[形式の種類 形式の種類]の下にある[通貨 通貨]を選択して、[OK]をクリックします。 5. [プロパティ プロパティ]ウインドウで、 VisualStyle プロパティを Office2007Blue に設定します。 6. C1FlexGrid タスク メニューを開きます。直前にタスクメニューを使用して列を編集したので、[Column タスク タスク]メニュー が表示されます。[C1FlexGrid タスク タスク]を選択して、C1FlexGrid タスク タスクメニューに戻ります。 7. [C1FlexGrid タスク タスク]メニューで、[スタイルエディタ]を選択して、スタイル スタイルエディタ を開きます。 8. [組み込みスタイル 組み込みスタイル]の下にある[Fixed]を選択します。 9. 右ペインの[Font]ノードを展開して、Bold プロパティを True に設定します。 10. ForeColor プロパティを「Web」タブの CornflowerBlue に設定し、[OK]をクリックしてダイアログボックスを閉じます。 プログラムを実行し、次の点に注目します。 グリッドアプリケーションに書式文字列、C1FlexGridBase.VisualStyle、および組み込みスタイルを使用した[Products]テーブ ルが表示されます。 67 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms グリッドの書式文字列、C1FlexGridBase.VisualStyle、および組み込みスタイルが正常に設定されました。これでクイックスター トは終了です。 68 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 設計時のサポート 設計時に Visual Studio のプロパティグリッド、メニュー、デザイナを使用して FlexGrid for WinForms を構成できます。以下 のセクションでは、C1FlexGrid の設計時環境を使用し、C1FlexGrid コントロールを設定する方法について説明します。 エディタ C1FlexGrid のレイアウトと外観を制御できる設計時エディタとして、列エディタとスタイルエディタ 列エディタとスタイルエディタの2つがあります。さらに、特 定列のキャプションおよび列の外観を変更できる設計時エディタとして、キャプションスタイルと列スタイル キャプションスタイルと列スタイルの2つがあります。 列エディタ コードを記述するかわりに、設計時にグリッド列の設定をすることができます。デザイナは、次の3つの方法のいずれかでアク セスできます。 フォームに貼り付けたグリッドを選択し、プロパティウィンドウの Cols プロパティの隣に表示される省略ボタン(…)をク リックする コントロールを右クリックし、コンテキストメニューから列エディタ 列エディタを選択します。 グリッドの右上隅にあるスマートタグ ( ) をクリックし、C1FlexGrid タスクメニューから列エディタ 列エディタを選択します。 以下のような列エディタ エディタが表示されます。 連結モードでは、DataSource のフィールドの表示や、列のキャプション、幅、表示位置などの設定が行えます。非連結モード では、列のデータタイプを選択するために同じく使用します。 FlexGrid 列エディタで行える操作は次のとおりです。 列の移動: マウスでヘッダセルを新しい位置へドラッグすることで、列の移動が行えます。 列幅調整: マウスでヘッダセルの右端をドラッグすることで、列幅を変更できます。また、〈Shift〉キーを押しながら他の ヘッダセルをクリックすることで複数列を選択でき、プロパティウィンドウを用いて同時にセル幅を変更できます。列幅 を-1に設定すると、デフォルトの幅に戻ります。 列プロパティの設定: 1つ以上の列が選択されている場合、エディタの左にあるプロパティグリッドで、選択されている 69 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 列のプロパティを確認したり編集が行えます。 列の挿入、または削除: 選択した列の前、または後に新しい列の挿入や(主にアンバウンドモードで有用)、選択した 列を削除するためにツールバーを使用してください。 一般的な操作を行うためのツールバー: 下記はツールバー上のボタンの機能について説明しています。 ボタン 説明 フォント: ドロップダウンリストで選択したフォントを設定します。 フォントサイズ: ドロップダウンリストで選択したフォントサイズを設定します。 フォントの書式設定: フォントに太字、斜体、下線を適用します。 位置揃え: フォントの配置を左、中央、右、標準に設定します。 配置: 列の内容を、上詰め、中央揃え、下詰めに整列させます。これらは、グリッドの列のヘッダ以 外の領域に反映されます。列のヘッダの配置を設定するには、列を選択して、TextAlignFixed プロ パティを設定してください。 背景色: 選択した列の背景色を設定します。 前景色: 選択した列の前景色を設定します。 固定行を対象とする: 固定行に設定を適用します。 ヘルプ: プロパティグリッドで選択したプロパティの説明を表示するかどうかを決めます。 全ての変更を元に戻す: 変更をすべて取り消し、デフォルトの状態に戻します。 ロード後に列幅を調整: このボタンは、グリッドがデータソースに連結される場合に、データの内容 にあわせてグリッドが自動的にすべての列幅を調整するかどうかを決めます。 データソースから再ロード: 現在のデータソースから取得した情報ですべての列をリセットします。グ リッドがデータソースに連結され、最初から編集し始めたい場合に、このボタンは有用です。グリッド がデータソースに連結されない場合、ボタンは無効になります。 列の選択: ドロップダウンリストから設定する列を選択します。 列の挿入: 選択した列の左側、もしくは右側に列を挿入します。これらのボタンはグリッドのみに機 能し、データソースには影響を及ぼしません。 列の削除: 選択した列を削除します。 列幅: 選択しているすべての列の幅を同じ幅に揃えるか、広げるか狭くします。 列の表示/非表示: 列の表示/非表示を切り替えます。 すべての列を表示: すべての列を表示します。 非表示列を表示: 非表示の列を見えるように表示します。列の Visible プロパティをFalseに変更す ると列は非表示になります。こうすることで、マウスで列を選択できなくなります。それらを選択し編 集することができるように、列をすべて表示するためにはこのボタンを使用してください。 これらのボタンは、プロパティグリッドを制御します。選択した列のプロパティをアルファベット順に表 示するか分類された順に表示するかどうかを決めます。 70 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms スタイルエディタ 必要に応じて、スタイルをコードの記述時ではなく設計時に設定できます。スタイルエディタ スタイルエディタは、次の3つの方法のいずれかで アクセスできます。 該当するグリッドを選択し、プロパティウィンドウを開いて Styles プロパティの隣に表示される省略ボタン(…)をクリック します。 グリッドを右クリックし、コンテキストメニューからスタイル スタイルエディタを選択します。 グリッドの右上隅にあるスマートタグ ( ) をクリックし、C1FlexGrid タスク メニューからスタイルエディタ スタイルエディタを選択します。 次のスタイルエディタのダイアログが表示されます。 スタイルエディタを使用すると、既存のスタイル変更や新しいカスタムスタイルを追加して、それらをセル、行、および列に後か ら設定することができます。 〈追加 追加〉と〈削除 削除〉ボタンは、カスタムスタイルを追加および削除します。リスト内でカスタムスタイルを選択して新しい名前を入力 すると、カスタムスタイルの名前を変更できます。〈クリア クリア〉ボタンは、すべてのカスタムスタイルを削除して組み込みスタイルを デフォルト値に戻します。 〈オートフォーマット オートフォーマット〉ボタンは、定義済みスタイルの完全セットを選択できる2番目のダイアログを表示します。[オートフォー オートフォー マット マット]ダイアログの外観は次のとおりです。 71 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms キャプションスタイルと列スタイル 選択した列のキャプションスタイル キャプションスタイルエディタと列スタイル 列スタイルエディタを使用し、それぞれ、キャプションテキストと列テキストのプロ パティ、および配置、背景、境界線を指定できます。 キャプションスタイル キャプションスタイルエディタと列スタイル 列スタイルエディタは、Column タスク タスクメニューでのみアクセスできます。Column タスク タスクメ ニューの詳細については、「Column タスク」を参照してください。 キャプションスタイル キャプションスタイルエディタと列スタイル 列スタイルエディタには、「テキスト テキスト」、「配置 配置」、「背景 背景」、「罫線 罫線」の4つのタブがあります。[プレ プレ ビュー ビュー]領域では、グリッドに適用する前の設定を確認できます。 テキスト 「テキスト テキスト」タブは、キャプションのフォントと書式を設定します。 72 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms フォント フォント領域では、次のオプションが使用できます。 フォント名: フォント名を選択します。 サイズ: フォントサイズを選択します。 色: フォント色を選択します。 文字の方向: Normal(標準)、Up(上方向)、Down(下方向)から選択します。 フォントの効果: ボタンを使用し、太字、斜体、下線の ON/OFF を切り替えます。 フォーマット フォーマット領域では、次のオプションが使用できます。 書式設定: 〈...〉ボタンをクリックし、[書式文字列 書式文字列]ダイアログボックスを開きます。[書式文字列 書式文字列]ダイアログの詳細につ いては、セルの内容 を参照してください。 入力マスク: 〈...〉ボタンをクリックし、[定型入力 定型入力]ダイアログボックスを開きます。[定型入力 定型入力]ダイアログの詳細につい ては、マスク . を参照してください。 3D効果: 効果: Flat(フラット)、Raised(浮出し)、Inset(くぼみ)のいずれかを選択します。テキストの効果オプションの詳細 については、TextEffectEnum 列挙体を参照してください。 トリミング: None、Character、Word、EllipsisCharacter、EllipsisWord、EllipsisPath から選択し、長い文字列をセ ルに合わせてトリミングする方法を設定します。トリミングの詳細については、Visual Studio のヘルプ 「StringTrimming 列挙体(System.Drawing)」 を参照してください。 折り返して全体を表示する: キャプションのワードラップを有効にするには、このボックスを ON にします。 配置 「配置 配置」タブは、キャプションのテキストと画像の両方の配置を設定します。 73 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 文字の配置領域では、次のオプションが使用できます。 横位置: ボタンをクリックし、左揃え、中央揃え、右揃え、標準 左揃え、中央揃え、右揃え、標準を切り替えます。 縦位置: ボタンをクリックし、上揃え、中央揃え、下揃え 上揃え、中央揃え、下揃えを切り替えます。 画像の配置領域では、次のオプションが使用できます。 配置: ボタンをクリックし、セル内の画像配置を切り替えるか、画像のスケール、タイル、ストレッチ、タイルストレッチ スケール、タイル、ストレッチ、タイルストレッチ、 非表示を切り替えます。画像の配置オプションの詳細については、ImageAlignEnum 列挙体を参照してください。 サンプルイメージの表示: [プレビュー]領域にサンプル画像を表示するには、[サンプルイメージの表示]ボックスを ON にします。 表示領域では、次のオプションが使用できます。 テキスト テキスト/画像の間隔: 画像の間隔:この値を増減し、テキストと画像の間の間隔を調整します。 表示方法: TextOnly、ImageOnly、Overlay、Stack、None から選択します。表示方法の詳細については、 DisplayEnum列挙体を参照してください。 背景 74 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 「背景 背景」タブは、背景色と背景画像を設定します。 背景色領域では、次のオプションが使用できます。 色: セルの背景色を選択します。 背景画像領域では、次のオプションが使用できます。 画像: 画像を選択するには〈選択〉ボタンをクリックし、画像を削除するには〈クリア〉ボタンをクリックします。 レイアウト: スケール、タイル、ストレッチ、タイルストレッチ、非表示を切り替えます。 罫線 「罫線 罫線」タブは、罫線と余白を設定します。 75 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 罫線領域では、次のオプションが使用できます。 スタイル: None(なし)、 (なし)、Flat(フラット)、 (フラット)、Double(2重線)、 (2重線)、Raised(浮出し)、 (浮出し)、Inset(くぼみ)、 (くぼみ)、Groove,(溝付き)、 (溝付き)、Fillet (フィレット)、 (フィレット)、Dotted(点線) (点線)から選択します。各種の罫線スタイルオプションの詳細については、 C1.Win.C1FlexGrid.BorderStyleEnum Enumeration列挙体を参照してください。 幅: 値を増減し、罫線の幅を調整します。 色: 罫線の色を選択します。 文字の方向: Both(両方向)、 (両方向)、Horizontal(水平方向)、 (水平方向)、Vertical(垂直方向) (垂直方向)から選択します。各種の罫線の方向オプ ションの詳細については、BorderDirEnum 列挙体を参照してください。 余白領域では、次のオプションが使用できます。 左: 値を増減し、左余白を調整します。 上: 値を増減し、上余白を調整します。 右: 値を増減し、右余白を調整します。 下: 値を増減し、下余白を調整します。 スマートタグ スマートタグ()は、各コントロールで通常使用されるプロパティを提供するショートカット[タスク タスク]メニューを表します。 C1FlexGrid を通じて使用可能なスマートタグには、[C1FlexGrid タスク]メニューと[Column タスク]メニューの2種類のがあ ります。 76 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C1FlexGrid タスク C1FlexGrid タスク タスクメニューでは、列エディタ と スタイルエディタ にすばやくアクセス し、AllowAddNew、AllowDelete、AllowEditing、AllowDragging の各プロパティを設定できます。 C1FlexGrid タスク タスクメニューにアクセスするには、グリッドの右上隅にあるスマートタグ ( ) をクリックします。C1FlexGrid タス クメニューが開きます。C1FlexGrid タスク タスクメニューは以下のように操作します。 データソースの選択 [データソースの選択 データソースの選択]ボックスのドロップダウン矢印をクリックし、使用可能なデータソースのリストを開きます。新しいデータ ソースを追加できるようになります。プロジェクトに新しいデータソースを追加するには、〈プロジェクトデータソースの追加 プロジェクトデータソースの追加…〉〉を クリックして[データソース構成ウィザード データソース構成ウィザード]を開きます。 77 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms プロジェクトに新しいデータソースを追加する方法の詳細については、データソースへの連結 を参照してください。 追加を有効にする [追加を有効にする 追加を有効にする]チェックボックスを ON にすると、AllowAddNew プロパティが True になり、グリッドに新しい行を追加で きるようになります。デフォルトは、OFF となっています。 削除を有効にする [削除を有効にする 削除を有効にする]チェックボックスを ON にすると、AllowDelete プロパティが True になり、グリッドの行を削除できるよう になります。デフォルトは、OFF となっています。 編集を有効にする [編集を有効にする 編集を有効にする]チェックボックスを ON にすると、AllowEditing プロパティが True になり、グリッドの行を編集できるよう になります。デフォルトは、ON となっています。 列の順序変更を有効にする [列の順序変更を有効にする 列の順序変更を有効にする]チェックボックスを ON にすると、AllowDragging プロパティが True になり、グリッドの列をド ラッグできるようになります。デフォルトは、ON となっています。 VisualStyle VisualStyle については、「VisualStyle を使用して外観を変更する」を参照してください。 列エディタ 〈列エディタ…〉をクリックすると、列エディタ を開きます。 78 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms スタイルエディタ 〈スタイルエディタ…〉をクリックすると、スタイルエディタ を開きます。 79 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C1FlexGridスタイルエディタを使用してセルの外観をカスタマイズする方法の詳細については、C1FlexGrid スタイルエディ タをご参考ください。 Column タスク 〈Column タスク タスク〉をクリックすると、Column タスク メニューが開きます。 C1FlexGridのバージョン情報 クリックすると、[C1FlexGrid のバージョン情報 のバージョン情報]ダイアログボックスが開きます。ここで、C1FlexGrid のバージョン番号を見る ことができます。 親コンテナにドッキング/ドッキング解除 〈親コンテナにドッキングする 親コンテナにドッキングする〉をクリックすると、C1FlexGrid コントロールの Dock プロパティが Fill に設定されます。 C1FlexGrid が親コンテナにドッキングされると、親コンテナから C1FlexGridをドッキング解除するオプションが使用可能にな ります。〈親コンテナでドッキングを解除する 親コンテナでドッキングを解除する〉をクリックすると、C1FlexGridの Dock プロパティが None に設定されます。 Column タスク Column タスク タスクメニューでは、列のキャプション、データフィールド、データ型、入力マスク、書式文字列、列のコンボリストを設 定し、 AllowSorting、AllowEditing、AllowResizing、AllowDragging、AllowMerging、Visible の各プロパティを設定す ることもできます。 Column タスク タスクメニューにアクセスするには、グリッドの列をクリックするか、C1FlexGrid タスク メニューから[Column タスク タスク] を選択します。 80 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 列キャプション [列キャプション 列キャプション]ボックスにキャプションを入力すると、列の Captionプロパティが設定されます。 データフィールド [データフィールド データフィールド]ボックスのドロップダウン矢印をクリックすると、データソースで使用可能なフィールドのリストが開きます。 データ型 [データ型 データ型]ボックスのドロップダウン矢印をクリックすると、使用可能なデータ型のリストが開きます。 入力マスク [入力マスク 入力マスク]ボックスの〈...〉ボタンをクリックすると、[定型入力 定型入力]ダイアログボックスが開きます。 81 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 書式設定 [書式設定 書式設定]ボックスの〈...〉ボタンをクリックすると、[書式文字列 書式文字列]ダイアログボックスが開きます。 コンボリスト [コンボリスト コンボリスト]ボックスの〈...〉ボタンをクリックすると、[コンボリスト コンボリスト]ダイアログボックスが開きます。 82 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ソートを有効にする [ソートを有効にする ソートを有効にする]チェックボックスを ON にすると、AllowSorting プロパティが True に設定され、列のソートが可能になり ます。デフォルトは、ON となっています。 編集を有効にする [編集を有効にする 編集を有効にする]チェックボックスを ON にすると、AllowEditing プロパティが True に設定され、列の編集が可能になり ます。デフォルトは、ON となっています。 サイズ変更を有効にする [サイズ変更を有効にする サイズ変更を有効にする]チェックボックスを ON にすると、AllowResizing プロパティが True に設定され、列のサイズ変更 が可能になります。デフォルトは、ON となっています。 順序変更を有効にする [順序変更を有効にする 順序変更を有効にする]チェックボックスを ON にすると、AllowDragging プロパティが True に設定され、グリッドの列のド ラッグが可能になります。デフォルトは、ON となっています。 マージを有効にする [マージを有効にする マージを有効にする]チェックボックスを ON にすると、AllowMerging プロパティが True に設定され、列でのマージが可能 になります。デフォルトは、OFF となっています。 表示 [表示 表示]チェックボックスを ON にすると、Visibleプロパティが True に設定され、列はグリッド内で表示状態になります。デフォ ルトは、ON となっています。 キャプションスタイル 〈キャプションスタイル キャプションスタイル…〉をクリックすると、選択した列のキャプション キャプションスタイルエディタが開きます。ここで、配置、背景、罫線を 含む、キャプションテキストの各プロパティを指定できます。 83 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 列スタイル 〈列スタイル 列スタイル…〉をクリックすると、選択した列の列スタイル 列スタイルエディタが開きます。ここで、テキスト、配置、背景、罫線を含む、列 の各プロパティを指定できます。 84 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C1FlexGrid タスク 〈C1FlexGrid タスク タスク〉をクリックすると、C1FlexGrid タスク メニューに戻ります。 親コンテナにドッキング/ドッキング解除 〈親コンテナにドッキングする 親コンテナにドッキングする〉をクリックすると、C1FlexGrid コントロールの Dock プロパティが Fill に設定されま す。C1FlexGrid が親コンテナにドッキングされると、親コンテナから C1FlexGrid をドッキング解除するオプションが使用可能 になります。〈親コンテナでドッキングを解除する 親コンテナでドッキングを解除する〉をクリックすると、C1FlexGrid の Dock プロパティが None に設定されます。 85 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 基本操作 基本操作 C1FlexGridコントロールを使用すると、グリッド形式のデータを表示、編集、グループ化、あるいは集計できます。グリッドは ADO.NETデータソースに連結することも、グリッド独自のデータを管理することもできます。 C1FlexGrid コントロールは、以下の要素で構成された多機能なオブジェクトモデルを用意しています。 86 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 以下の各トピックでは、C1FlexGrid コントロールの主な機能について紹介します。 行と列 グリッドの寸法とレイアウトの設定方法について説明します。 データの取 グリッドへのデータ設定、および取得について説明します。 得と設定 セルの選 87 「カレントセル」と「セル範囲」の概念について説明します。 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 択 セルの範 囲 任意のセルグループを単一の単位として使用する方法について説明します。 セルのイ メージ セル内に画像を表示する方法について説明します。 セルの フォーマッ ト 数値、日付、およびブール値の書式設定、あるいは個々のセルまたは範囲のフォント、色、配置、およびピク チャの変更により、グリッドの外観をカスタマイズする方法について説明します。 セルの編 集 簡単なテキスト編集、ドロップダウンリストおよびコンボリスト、セルボタン、マスク編集、およびデータ検証を実 装する方法について説明します。 セルの マージ グリッドの表示を変更して同じ内容のセルをマージし、データ内での関係をハイライト表示する「グループ化し た」ビューを作成する方法について説明します。 アウトライ ンとデータ の集計 グリッドに小計行を追加し、アウトラインツリーを構築する方法について説明します。 保存とロー グリッドの内容または書式設定を保存し、後で再読み込みしたり、グリッドデータを Microsoft Access および ド、および Excel などの他のアプリケーションと交換する方法について説明します。このセクションでは、グリッドを印刷す 印刷 る方法についても説明します。. プロパティ グループ 主要な C1FlexGridプロパティ一覧。機能別に相互参照可能. 行と列 C1FlexGrid コントロールは、行と列で構成されます。行および列の各コレクションは、Rows プロパティと Colsプロパティに よって提供されます。 グリッドをデータソースに連結する場合、行および列の数はデータソースで使用できるデータ量によって決まります。非連結 モードでは、コレクション内で Count プロパティを使用し、それらを任意の値に設定できます。たとえば、次のコードでは、グ リッドの行数と列数を、500行と10列に設定します。 Visual Basic コードの書き方 Visual Basic _flex.Rows.Count = 500 _flex.Cols.Count = 10 C# コードの書き方 C# _flex.Rows.Count = 500; _flex.Cols.Count = 10; 行と列には、「固定 固定」と「スクロール可能 スクロール可能」の2つの基本タイプがあります(Count プロパティが返すカウントは、固定セルおよび スクロール可能なセルの数を含みます)。固定行は、ユーザーがグリッドを垂直方向にスクロールしても常にグリッドの一番上 に、固定列は、ユーザーがグリッドを水平方向にスクロールしても常にグリッドの左端に表示されます。この他にも、行と列に はスクロールされませんが、編集が可能な「静止」タイプ(Frozen プロパティ)があります。 88 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 固定セルは、行や列のヘッダ情報を表示する場合に便利です。 Rows および Cols コレクションの RowColCollection.Fixed プロパティを使用すると、固定の行および列の数を設定できま す。たとえば、次のコードは固定行および非固定列を持ったグリッドを作成します。 Visual Basic コードの書き方 Visual Basic _flex.Rows.Fixed = 1 _flex.Cols.Fixed = 0 C# コードの書き方 C# _flex.Rows.Fixed = 1; _flex.Cols.Fixed = 0; また、Rows および Cols コレクションには、グリッド上で行や列を挿入、削除、および移動するメソッドも含まれます。 Item プ ロパティ(インデクサ)を使用すると、各コレクションの個々の要素(行と列)にアクセスできます。 コードではなく、設計時に 列エディタ を使用して列に関するさまざまな設定することもできます。列エディタを使用して列の設 定を行う方法の詳細については、「列エディタ」を参照してください. 列のサイズ変更 列の幅は、その Width プロパティで指定します。設計時に、Width プロパティは、グリッド内で直接設定することも、列エディ 列エディ タから設定することもできます。デザイン画面で変更する場合、列ヘッダの右端に表示される水平方向の二重矢印をクリックし てドラッグすると、列のサイズを変更できます。 89 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 点線の垂直線は、グリッドのサイズがどのように変更されるかを示します。ポインタを左にドラッグすると、列のサイズは小さく なり、右にドラッグすると列のサイズは大きくなります。列の Width プロパティは、サイズ変更操作が完了したときに調整され ます。 列エディタまたはコードによって、列の Width プロパティを指定します。列エディタの詳細については、列エディタ を参照してく ださい。次のコードは、列の Width プロパティを 10 に設定します。 Visual Basic コードの書き方 Visual Basic _flex.Cols(1).Width = 10 C# コードの書き方 C# _flex.Cols(1).Width = 10 特定の列のサイズ変更を禁止するには、Column タスク タスクメニュー、列エディタ、コードのいずれかを使用し、列の AllowResizing プロパティを False に設定します。Column タスクメニューの詳細については、Column タスク を参照してくだ さい。次のコードは、Column1 の AllowResizing プロパティを False に設定します。 Visual Basic コードの書き方 Visual Basic _flex.Cols(1).AllowResizing = False C# コードの書き方 C# _flex.Cols(1).AllowResizing = False セルの選択 グリッドはカレントセル カレントセルを持っています。グリッドがアクティブの間、カレントセルの周囲にはフォーカス長方形が表示されます。ユーザーはキーボードやマウスでカー ソルを移動し、グリッドが編集可能であればセルの内容を編集できます。 90 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Office の視覚スタイルが、カーソルセルの位置の行および列ヘッダーをハイライトして、カーソルのロケーションも表します。VisualStyle の設定については、 「VisualStyle を使用して外観を変更する」を参照してください。 Row および Col プロパティを使用して、カレントセルをコードで取得または設定することができます。これらのプロパティのいずれかを –1 に設定すると、カーソルが 非表示になります。 グリッドは、拡張セル選択をサポートしています。これは、2つの対角(カレントセルと、セル選択セル カレントセルと、セル選択セル)によって定義されるセルの長方形範囲です。セル範囲をコード によって取得または設定するには、RowSel と ColSel プロパティを使用します。あるいは、Selection プロパティを使用し、セル範囲を設定することもできます。 注意: 注意:カレントセルを変更すると、セル範囲が自動的にリセットされます。コーディングによって拡張セル範囲を作成するには、RowSel と ColSel の前に Row と Col を設定するか、Select メソッドを使用します。 セル範囲の外観は、次の各プロパティが制御します。 FocusRect カレントセルを表示するために描画されるフォーカス長方形の種類を決定します。 HighLight deセル範囲をハイライト表示するタイミング(常に、コントロールにフォーカスを持つときと、持たないときはハイライト表示しない)を指定します。 HighLight と Focus これは、セル範囲の外観(フォント、色、ボーダー)を指定するセルスタイルです。 使用可能なセル範囲の種類は、SelectionMode プロパティで決定します。デフォルトでは、グリッドは通常のセル範囲をサポートします。この動作を変更して拡張セ ル範囲ができないようにすると、行や列ごと、あるいはリストボックスモードで選択できます(リストボックスモードでは個々の行を選択できます)。 リストボックスモードを使用した場合、Selected プロパティを使用して、個々の行のセル範囲状態を取得または設定できます。あるいは、Selected プロパティを使用 して、選択した行のコレクションを取得することもできます。たとえば、次のコードでは一定の条件を満たすすべての行を選択します。 Visual Basic コードの書き方 Visual Basic ' Sales列が8000以上の行をすべて選択します _flex.SelectionMode = C1.Win.C1FlexGrid.SelectionModeEnum.ListBox Dim index As Integer For index = _flex.Rows.Fixed To _flex.Rows.Count - 1 If Val(_flex(index, "Sales")) > 80000 Then _flex.Rows(index).Selected = True End If Next Console.WriteLine("There are now {0} rows selected", _flex.Rows.Selected.Count) C# コードの書き方 C# // Sales列が8000以上の行をすべて選択します _flex.SelectionMode = SelectionModeEnum.ListBox; for (int index = _flex.Rows.Fixed ; index < _flex.Rows.Count; index++) { if (Microsoft.VisualBasic.Conversion.Val(System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(_flex[index, "Sales"])) > 80000) { _flex.Rows[index].Selected = true; } } 91 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Console.WriteLine("There are now {0} rows selected", _flex.Rows.Selected.Count); セルの範囲 CellRange オブジェクトでは、任意のセルグループを単一の単位として操作できます。たとえば、次のサンプルコードは CellRange オブジェクトを作成し、範囲内のデータをクリアし、それにカスタムスタイルを設定します。 Visual Basic コードの書き方 Visual Basic Dim rg As CellRange = _flex.GetCellRange(3, 3, 10, 10) rg.Data = Nothing rg.Style = _flex.Styles("MyRangeStyle") C# コードの書き方 C# CellRange rg = _flex.GetCellRange(3, 3, 10, 10); rg.Data = null; rg.Style = _flex.Styles["MyRangeStyle"]; CellRange オブジェクトは、StyleNew プロパティを持っています。このプロパティは、既存の範囲スタイルが存在すればそれ を取得します。存在しない場合は、新しい範囲スタイルを作成し、それに範囲を設定して返します。このプロパティは、書式設 定するときにフル装備の制御を必要としない場合に便利です。たとえば、指定範囲に赤い背景色を指定するだけであれば、次 のように記述できます。 Visual Basic コードの書き方 Visual Basic Dim rg As CellRange = _flex.GetCellRange(3, 3, 10, 10) rg.StyleNew.BackColor = Color.Red C# コードの書き方 C# CellRange rg = _flex.GetCellRange(3, 3, 10, 10); rg.StyleNew.BackColor = Color.Red; セルのイメージ 各グリッドセルは、セル内に格納されているデータのほか、画像も表示できます。これは、次の2つの方法で行うことができま す。 SetCellImage メソッドを使用して Image オブジェクトをセルに設定する方法。このメソッドを使用すると、任意のイメー ジを各セルに設定することができるため、イメージがセルのデータに関連付けられていない場合に便利です。たとえ ば、ピクチャをセルのデータが無効である場合のインジケータとして使用できます。 ImageMapプロパティを列に設定する方法。グリッドは、自動的にセルデータを関連付けられているイメージにマッピン グします。このメソッドは、イメージにデータの絵などの表現が含まれている場合に便利です。たとえば、イメージは、製 品の種類を表すアイコンを含むことができます。 セルのフォーマット 92 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C1FlexGrid コントロールの主なパワフルな機能の1つは、グリッド全体と個々のセルの外観のほとんどあらゆる要素をカスタ マイズできる点です。 セルの内容 セルの内容を書式設定する方法を制御するには、Format プロパティを .NET Framework の String.Format メソッドで使用 するのと同じ書式文字列に設定します。たとえば、次のコードは列1に short date (短い日付)、列2に Currency (通貨)の値 を示しています。 Visual Basic コードの書き方 Visual Basic ' Short date (短い日付) _flex.Cols(1).Format = "d" ' Currency (通貨) _flex.Cols(2).Format = "c" C# コードの書き方 C# // Short date (短い日付) _flex.Cols[1].Format = "d"; // Currency (通貨) _flex.Cols[2].Format = "c"; セルの内容の書式設定は、設計時に[書式文字列 書式文字列]ダイアログボックスを使用して設定することもできます。 [書式文字列 書式文字列]ダイアログボックスは、C1FlexGrid タスク メニューまたは列エディタ からアクセスできます。 93 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C1FlexGrid タスク メニューで、[書式設定 書式設定]ボックスの〈...〉ボタンをクリックします。 列エディタ で、左ペインの Format プロパティを探し、その横の〈...〉ボタンをクリックします。 注意: 注意:[書式文字列 書式文字列]ダイアログボックスは列固有で、選択した列の Format プロパティのみを変更します。 Visual Basic の Format 関数で使用するようなカスタム書式("#,###"、など)も使用できます。 セルデータの取得 インデクサまたは GetData メソッドを使用して、グリッドのデータ自体を取得できます。書式設定したデータを取得するに は、GetDataDisplayメソッドを使用します。たとえば、次のようになります。 Visual Basic コードの書き方 Visual Basic ' Short date (短い日付) _flex.Cols(1).Format = "d" ' Currency (通貨) _flex.Cols(2).Format = "c" _flex(1, 2) = 10000 Console.WriteLine("Raw value: {0}", _flex(1, 2)) Console.WriteLine("Display value: {0}", _flex.GetDataDisplay(1, 2)) ' Raw value: 10000 ' Display value: $10,000.00 C# コードの書き方 C# // Short date (短い日付) _flex.Cols[1].Format = "d"; // Currency (通貨) _flex.Cols[2].Format = "c"; _flex[1, 2] = 10000; Console.WriteLine("Raw value: {0}", _flex[1, 2]); Console.WriteLine("Display value: {0}", _flex.GetDataDisplay(1, 2)); // Raw value: 10000 // Display value: $10,000.00 セルの外観 セルの外観(配置、フォント、色、ボーダーなど)は、CellStyle オブジェクトで処理します。グリッドには Stylesプロパティがあ り、このプロパティにグリッドの書式設定に使用するスタイルのコレクションが格納されています。このコレクションは、グリッド 要素(固定セル、スクロール可能セル、セル範囲、フォーカスセルなど)の外観を定義する組み込みメンバを持っています。こ れらのスタイルを変更し、グリッドの外観を変更できます。また、独自のカスタムスタイルを作成し、セル、行、または列に設定 することができます。 グリッドの外観を変更する最も簡単な方法は、組み込みスタイルを変更することです。たとえば、次のサンプルコードは、範囲 指定したセルを赤い背景に緑のボールド文字で表示します。 94 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Dim cs As CellStyle = _flex.Styles.Highlight cs.Font = New Font(_flex.Font, FontStyle.Bold) cs.ForeColor = Color.Green cs.BackColor = Color.Red C# コードの書き方 C# CellStyle cs = _flex.Styles.Highlight; cs.Font = new Font(_flex.Font, FontStyle.Bold); cs.ForeColor = Color.Green; cs.BackColor = Color.Red; あるいは、独自のスタイルを作成して、セル、行、および列に設定することもできます。たとえば、次のサンプルコードは、カスタ ムのセルスタイルを作成して、それを5行ごとに指定します。 Visual Basic コードの書き方 Visual Basic Dim cs As CellStyle = _flex.Styles.Add("Fifth") cs.BackColor = Color.Gray Dim idex% For idex = _flex.Rows.Fixed To _flex.Rows.Count - 1 Step 5 _flex.Rows(idex).Style = cs Next C# コードの書き方 C# CellStyle cs = _flex.Styles.Add("Fifth"); cs.BackColor = Color.Gray; for (int index = _flex.Rows.Fixed ; index <= _flex.Rows.Count - 1; index += 5) { _flex.Rows[index].Style = cs; } カスタムスタイルを作成して、それらを列、行、およびセル範囲に割り当てるには、次のように記述します。 Visual Basic コードの書き方 Visual Basic ' 新しいカスタムスタイルを作成します。 Dim s As CellStyle = _flex.Styles.Add("MyStyle") s.BackColor = Color.Red s.ForeColor = Color.White ' 列に新しいカスタムスタイルを適用します。 _flex.Cols(3).Style = _flex.Styles("MyStyle") 95 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ' 行に新しいカスタムスタイルを適用します。 _flex.Rows(3).Style = _flex.Styles("MyStyle") ' セル範囲に新しいカスタムスタイルを適用します。 Dim rg As CellRange = _flex.GetCellRange(4, 4, 6, 6) rg.Style = _flex.Styles("MyStyle") C# コードの書き方 C# /// 新しいカスタムスタイルを作成します。 CellStyle s = _flex.Styles.Add("MyStyle"); s.BackColor = Color.Red; s.ForeColor = Color.White; /// 列に新しいカスタムスタイルを適用します。 _flex.Cols[3].Style = _flex.Styles["MyStyle"]; // 行に新しいカスタムスタイルを適用します。 _flex.Rows[3].Style = _flex.Styles["MyStyle"]; // セル範囲に新しいカスタムスタイルを適用します。 CellRange rg = _flex.GetCellRange(4,4,6,6); rg.Style = _flex.Styles["MyStyle"]; コードではなく、設計時にスタイルエディタ スタイルエディタを使用してスタイルを設定することもできます。スタイルエディタ スタイルエディタを使用してセルの外 観を設定する方法の詳細については、「スタイルエディタ」を参照してください。 条件付きの書式設定 セルをその内容に基づいて書式設定するには、CellChangedイベントを使用して、内容に基づいたセルスタイルを選択しま す。たとえば、次のサンプルコードは、新しいスタイルを作成し、それをセルの内容に基づいてセルに適用します。 Visual Basic コードの書き方 Visual Basic Dim cs As C1.Win.C1FlexGrid.CellStyle Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 大きな値の場合に設定するカスタムスタイルを作成します cs = _flex.Styles.Add("LargeValue") cs.Font = New Font(Font, FontStyle.Italic) cs.BackColor = Color.Gold End Sub ' 内容によってスタイルを設定します Private Sub _flex_CellChanged(ByVal sender As Object, ByVal e As RowColEventArgs) Handles _flex.CellChanged ' 50,000より大きい場合スタイルを設定します '(それ以外の場合、スタイルには Nothing が設定されます) 96 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Dim cs As CellStyle If _flex(e.Row, e.Col).ToString >= 50000 Then cs = _flex.Styles("LargeValue") _flex.SetCellStyle(e.Row, e.Col, cs) End If End Sub C# コードの書き方 C# CellStyle cs; private void Form1_Load(object sender, EventArgs e) { // 大きな値の場合に設定するカスタムスタイルを作成します cs = _flex.Styles.Add("LargeValue"); cs.Font = new Font(Font, FontStyle.Italic); cs.BackColor = Color.Gold; } // 内容によってスタイルを設定します private void _flex_CellChanged( object sender, RowColEventArgs e) { // 50,000より大きい場合スタイルを設定します '(それ以外の場合、スタイルには Null が設定されます) if (Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(_flex[e.Row, e.Col].ToString()) >= 50000) { cs = _flex.Styles["LargeValue"]; _flex.SetCellStyle(e.Row, e.Col, cs); } } オーナー描画セル CellStyleオブジェクトがセルの外観(背景および前景色、配置、フォント、マージン、ボーダーなど)の多くを制御している場合 でも、それだけでは十分ではないことがあります。グラデーションの背景を使用したり、カスタムグラフィックを直接セルに描画 したい場合があります。こうした場合には、 DrawModeプロパティと OwnerDrawCell イベント使用すると、各セルの描画方 法を完全に制御できます。 DrawMode プロパティは、OwnerDrawCell イベントを発生させるかどうかを決定します。このイベントを使用すると、セルの あらゆる視覚的な外観を変更できます。OwnerDrawCellイベントの引数を使用すると、表示データやデータの表示に使用す るスタイルを変更できます。また、完全に継承したり、希望のものはすべてセルに描画できます。 イベントハンドラ内の e.Text と e.Image の各引数を設定すると、セルに表示するテキストとイメージを変更できます。ま た、e.Style プロパティを設定すると、セルの表示に使用するスタイルも変更できます。 Style 引数のプロパティは変更できないことに注意してください。変更すると他のセルに影響する場合があるからです。代わり に、新しい CellStyle オブジェクトを Style 引数に割り当てます。たとえば、e.Style.ForeColor = Color.Red を設定する代わ りに、e.Style = _flex.Styles["RedStyle"] を使用してまったく新しいスタイルをこの引数に割り当てます。 また、独自の描画コードを使用してセルに描画することも、カスタムコードを e.DrawCell メソッドへの呼び出しと組み合わせる ことさえできます。たとえば、GDI呼び出しを使用してセルの背景を描画して、次に、e.DrawCell を呼び出してセルのボーダー 97 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms や内容を表示できます。 注意: 注意:上級の OwnerDraw コードの例については、製品付属の「RtfGrid サンプル」を参照してください。 次のサンプルコードでその一例を示します。グラデーションブラシを使用して、選択したセルの背景を描画します。まず、コード では次のように DrawMode プロパティの指定と LinearGradientBrush オブジェクトの宣言をし、グリッドがリサイズされるた びにブラシを更新します。 Visual Basic コードの書き方 Visual Basic Dim m_GradientBrush As System.Drawing.Drawing2D.LinearGradientBrush Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' オーナー描画セルで使用するブラシを定義します m_GradientBrush = New System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, Color.SteelBlue, Color.White, 45) ' グラデーションを行うためにオーナー描画を使用します _flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw End Sub Private Sub _flex_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles _flex.Resize ' コントロールのリサイズ時にグラデーションブラシを更新します m_GradientBrush = New System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, Color.SteelBlue, Color.White, 45) End Sub C# コードの書き方 C# System.Drawing.Drawing2D.LinearGradientBrush m_GradientBrush; private void Form1_Load(object sender, EventArgs e) { // オーナー描画セルで使用するブラシを定義します m_GradientBrush = new System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, Color.SteelBlue, Color.White, 45); //グラデーションを行うためにオーナー描画を使用します _flex.DrawMode = DrawModeEnum.OwnerDraw; } private void _flex_Resize( object sender, System.EventArgs e) { 98 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // コントロールのリサイズ時にグラデーションブラシを更新します m_GradientBrush = new System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, Color.SteelBlue, Color.White, 45); } 次に、OwnerDrawCell イベントを処理し、カスタムブラシを使用してセルの背景を描画します。次のサンプルコードでは、前 景はグリッド自身がイベント引数内で DrawCell メソッドを使用して処理します。 Visual Basic コードの書き方 Visual Basic Private Sub _flex_OwnerDrawCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles _flex.OwnerDrawCell ' 選択セルの背景にグラデーションブラシを使用して描画します If _flex.Selection.Contains(e.Row, e.Col) Then ' 背景を描画します e.Graphics.FillRectangle(m_GradientBrush, e.Bounds) ' セルの内容を描画します e.DrawCell(C1.Win.C1FlexGrid.DrawCellFlags.Content) ' セル描画の終了 e.Handled = True End If End Sub C# コードの書き方 C# private void _flex_OwnerDrawCell( object sender, OwnerDrawCellEventArgs e) { // 選択セルの背景にグラデーションブラシを使用して描画します if (_flex.Selection.Contains(e.Row, e.Col)) { // 背景を描画します e.Graphics.FillRectangle(m_GradientBrush, e.Bounds); // セルの内容を描画します e.DrawCell(DrawCellFlags.Content); // セル描画の終了 e.Handled = true; } } セルの編集 デフォルトでは、C1FlexGrid コントロールのセルにユーザーが入力して編集できます。ユーザーがグリッドを編集できないよう 99 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms にするには、AllowEditing プロパティを False に設定します。特定列をユーザーが編集できないようにするに は、AllowEditing プロパティを False に設定します。特定行をユーザーが編集できないようにするには、AllowEditing プロ パティを False に設定します(グリッドがデータソースに連結している場合、どの列が編集可能であるかを検出して自動的に AllowEditing プロパティが設定されます)。 セルの編集を開始するには、次の方法のどれかを使用できます。 セルに直接入力。入力すると、セルの内容は入れ替わります。 [F2]キーまたは[Enter]キーを押す。すると、グリッドは編集モードになり、カレントセルの内容が編集できます。 セルをダブルクリック。これは[F2]キーを押した場合と同じことになりますが、クリックした場所の近くから入力が行われ ます。 基本編集モードを使用すると、ユーザーはセルに値を入力できます。編集中の列に、特定のデータ型が設定されている場合、 ユーザーが入力した値は自動的に適切なデータ型に変換されます。適切なデータ型に変換できない値をユーザーが入力した 場合、グリッドは GridError イベントを発生させてユーザーによる編集は無視します。 多くのアプリケーションでは、基本編集機能で十分間に合いますが、C1FlexGrid では、編集プロセスを制御できるプロパティ やイベントを装備しており、選択範囲リスト、エディットボタン、高度な正当性検査の制御が行えます。Ver.2.0から は、C1FlexGrid には外部エディタのサポートも組み込まれました。これにより、任意のコントロールをグリッドエディタとして使 用できます(たとえば、C1Input コントロールをグリッドエディタとして使用できるようになりした)。これらの機能を以下に説明し ます。 リストボックスとコンボボックス 多くのアプリケーションでは、セルは使用可能な値を定義したリストを持っています。このような場合、ユーザーに値をドロップ ドロップ ダウンリスト ダウンリストから選択させることができます。これを行うには、各選択肢をパイプ文字("|")で区切った文字列 (例:"True|False|Don't know"など)を作成して、それを C1FlexGrid の ComboList プロパティやC1FlexGridBase.Cols (Index).RowCol.ComboList プロパティに設定します。C1FlexGridBase.Cols(Index).RowCol.ComboList プロパティに設定す ると、列ごとに異なるリストを持つことができます。これらの ComboList プロパティを設定すると、セルの横にドロップダウンが 表示されます。リストボックス、コンボボックスをクリックするか、または[F2]キーを押すと、そのセルで使用できる選択肢のリス トが表示されます。 さらに通常、セルは共通値のリストを持っていますが、もちろんユーザーは別の値を入力することもできます。入力は、テキスト ボックスとドロップダウンリスト ドロップダウンリストを組み合わせたドロップダウンコンボボックスを使用して行います。コンボボックスを作成するに は、パイプ文字("|")で区切った選択肢のリスト(例:"|True|False|Don't know")を開き、それを前と同様に C1FlexGridの ComboList プロパティや RowCol.ComboList プロパティに設定します。 たとえば、次のサンプルコードでは、グリッドは列1に色の名前を含むドロップダウンコンボリスト、および列2にドロップダウン コンボボックスを表示します。列1を編集するとき、ユーザーはリストから値を選択する必要があります。列2を編集するとき、 ユーザーは、値を選択することも別の値を入力することもできます。 Visual Basic コードの書き方 Visual Basic ' ドロップダウンリスト _flex.Cols(1).ComboList = "赤|緑|青|黄 ' ドロップダウンコンボ _flex.Cols(2).ComboList = " |赤|緑|青|黄 C# コードの書き方 C# //ドロップダウンリスト flex.Cols[1].ComboList = "赤|緑|青|黄 //ドロップダウンコンボ 100 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms _flex.Cols[2].ComboList = "|赤|緑|青|黄 RowCol.ComboList プロパティは、設計時に[コンボリスト コンボリスト]ダイアログボックスを使用して設定することもできます。[コンボリ スト]ダイアログボックスでは、リストを[ドロップダウンリスト ドロップダウンリスト]、[ドロップダウンコンボ ドロップダウンコンボ]、[セルボタン セルボタン]、[セルボタン(入力可 セルボタン(入力可)] のいずれで表示するかを選択できます。 [コンボリスト コンボリスト]ダイアログボックスは、Column タスク メニューまたは 列エディタ からアクセスできます。 Column タスク タスクメニューで、[コンボリスト コンボリスト]ボックスの〈...〉ボタンをクリックします。 列エディタ 列エディタで、左ペインの RowCol.ComboList プロパティを探し、その横の〈〈...〉〉ボタンをクリックします。 注意: 注意:[コンボリスト]ダイアログボックスは列固有で、選択した列の RowCol.ComboList プロパティのみを変更し ます。 同じ列であっても、セルごとに異なるリストを設定したい場合もあります。たとえば、行1にはプロパティリストを表示し、行2には その値を表示させたい場合です。この場合、行2の値は行1で選択されたプロパティに依存するため、有効な選択肢は行ごと に変わります。このような場合には、BeforeEdit イベントをトラップし、このイベント内で Column オブジェクトの ComboList プロパティをカレントセルの適切なリストに指定する必要があります。C1FlexGrid の ComboList プロパティはグリッド全体に 適用されます。 組み込みコンボボックスは、デフォルトで自動検索機能を提供します。ユーザーが値を入力すると、選択は次に一致するところ へ移動します。EditOptions プロパティを使用してこの機能を無効にし、AutoSearchDelay プロパティを使用してグリッドが 自動検索バッファをリセットするまでの時間を制御できます。 また、組み込みコンボボックスは Visual Studio プロパティウィンドウのエディタのような自動循環機能も備えています。関連付 けられたリストを持つセルをダブルクリックすると、グリッドは自動的に次の値を選択します。EditOptions プロパティを使用し てこの機能を無効にすることもできます。 チェックボックス デフォルトでは、グリッドはブール型の列(列タイプは Column オブジェクトの DataTypeプロパティで指定)の値をチェック ボックスとして表示します。ブール値をチェックボックスとして表示したくない場合、列の Format プロパティを True/False 値 で表示する値を含む文字列に設定します。たとえば、次のようになります。 Visual Basic コードの書き方 Visual Basic 101 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms _flex.Cols["bools"].Format = "Yes;No" C# コードの書き方 C# _flex.Cols["bools"].Format = "Yes;No"; 非連結モードでは、 SetCellCheck メソッド(GetCellCheckメソッド)を使用して、チェックボックスを任意のセルに追加(取得) できます。チェックボックスは、セル内のテキストと並べて表示されます。列の RowCol.ImageAlign プロパティを使用すると、 配置を指定できます。 チェックボックスには、2値式(ブール型)と3値式の2つの種類があります。ブール型のチェックボックスで は、CheckEnum.Checked と CheckEnum.Unchecked 状態が切り替わります。3値式チェックボックスでは、 、 CheckEnum.TSChecked、CheckEnum.TSUnchecked、および CheckEnum.TSGrayed の設定値が順に設定されます(参 照:CheckEnum)。 セルがチェックボックスを持ち、AllowEditing プロパティが True に設定されている場合、チェックボックスの状態を変更する には、マウスでチェックボックスをクリックするか、[スペース]キーまたは[Enter]キーを押します。 デフォルトでは、マウスまたはキーボードでチェックボックスの値を切り替えると、選択されているすべてのチェックボックスの値 が切り替わります。EditOptions プロパティを使用してこの機能を無効にできます。 マップリスト 「リストボックスとコンボボックス」で説明した Combolist プロパティや Column オブジェクトの RowCol.ComboList プロパティ によって、セル値は確実にリストから選択されます。ユーザーが選択した値は、列に適合した型に変換され、あたかもユー ザーが入力したようにグリッドに格納されます。 多くの場合、セルは定義済みリストから値を取得できますが、実際の値に即したユーザーフレンドリな値の表示が要求されま す。たとえば、列に製品コードが含まれている場合、コードは保存しておき、表示は製品名にしたいことがあります。 このようにするには、RowCol.ComboList プロパティを使用します。このプロパティには、IDictionary オブジェクトへの参照を 含みます。IDictionary オブジェクトは、グリッド内に格納したものとユーザー側に表示されるものとの間のマッピングを確立し ます(IDictionary インタフェースは System.Collections 名前空間で定義され、特に Hashtable クラスによって実装されます)。 たとえば、次のサンプルコードは、色の値と名前を含むデータマップを作成します。色の値はグリッドに格納され、ユーザーに は名前が表示されます。 Visual Basic コードの書き方 Visual Basic Dim dtMap As Hashtable = New Hashtable() dtMap.Add(Color.Red, "りんごの赤") dtMap.Add(Color.Green, "森林の緑") dtMap.Add(Color.Blue, "空の青") dtMap.Add(Color.Black, "石炭の黒") dtMap.Add(Color.White, "雪の白") flex.Cols(1).DataType = GetType(Color) flex.Cols(1).DataMap = dtMap C#コードの書き方 コードの書き方 Visual Basic Hashtable Hashtable dtMap = new Hashtable(); dtMap.Add(Color.Red, "りんごの赤"); dtMap.Add(Color.Green, "森林の緑"); 102 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms dtMap.Add(Color.Blue, "空の青"); dtMap.Add(Color.Black, "石炭の黒"); dtMap.Add(Color.White, "雪の白"); flex.Cols[1].DataType = typeof(Color); flex.Cols[1].DataMap = dtMap; IDictionary を実装しているクラスは、DataMap として使用できます。たとえば、Hashtable、ListDictionary、および SortedList です。これらのクラスはすべて、有効なデータマップを提供します。相違点は、それらのクラスが編集可能な列内で 使用されるときドロップダウンリスト内の各項目の順序がクラスによって異なることです。 SortedList クラスは、キーで項目をソートします。Hashtable は、任意の順序を使用します。ListDictionary は、項目がリスト に追加された順序を維持します。このため、ListDictionary が通常、DataMaps の最適な選択肢となります。 データマップ内のキーは、編集対象のセルと同じ型でなければならないことに注意してください。たとえば、列が短整数(Int16) を含む場合、この列に関連付けられているデータマップは短整数型のキーである必要があります。正規の整数(Int32)をキー として使用すると機能しません。 次のサンプルコードはその違いを示します。 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' キーで項目をソート Dim sl As New SortedList() sl.Add("0", "Zero") sl.Add("1", "One") sl.Add("2", "Two") sl.Add("3", "Three") ' リストに追加された順序を維持 Dim ld As New ListDictionary() ld.Add(0, "Zero") ld.Add(1, "One") ld.Add(2, "Two") ld.Add(3, "Three") ' 任意の順序 Dim ht As New Hashtable() ht.Add(0, "Zero") ht.Add(1, "One") ht.Add(2, "Two") ht.Add(3, "Three") flex.Cols(1).DataMap = sl flex.Cols(1).Caption = "SortedList" flex.Cols(2).DataMap = ld flex.Cols(2).Caption = "ListDictionary" flex.Cols(3).DataMap = ht flex.Cols(3).Caption = "HashTable" End Sub C# コードの書き方 C# private void Form1_Load(object sender, System.EventArgs e); { 103 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // キーで項目をソート SortedList sl = new SortedList(); sl.Add("0", "Zero"); sl.Add("1", "One"); sl.Add("2", "Two"); sl.Add("3", "Three"); // リストに追加された順序を維持 ListDictionary ld = new ListDictionary(); ld.Add(0, "Zero"); ld.Add(1, "One"); ld.Add(2, "Two"); ld.Add(3, "Three"); // 任意の順序 Hashtable ht = new Hashtable(); ht.Add(0, "Zero"); ht.Add(1, "One"); ht.Add(2, "Two"); ht.Add(3, "Three"); flex.Cols[1].DataMap = sl; flex.Cols[1].Caption = "SortedList"; flex.Cols[2].DataMap = ld; flex.Cols[2].Caption = "ListDictionary"; flex.Cols[3].DataMap = ht; flex.Cols[3].Caption = "HashTable"; } さらに、列の DataType プロパティに列挙体を設定すると、グリッドは、各列挙値と名前とのデータマップを自動的に構築して 使用します。たとえば、次のサンプルコードは地域から成る列挙を作成します。地域の値はグリッドに格納され、ユーザーには 地域名が表示されます。 Visual Basic コードの書き方 Visual Basic Private Enum Countries NewYork Chicago NewOrleans London Paris End Enum Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex.Cols(1).DataType = GetType(Countries) End Sub C# コードの書き方 C# private enum Countries { NewYork; Chicago; NewOrleans; 104 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms London; Paris; } private void Form1_Load(object sender, EventArgs e) { flex.Cols[1].DataType = typeof(Countries); } セルボタン セルの種類によっては、テキストボックスまたはドロップダウン以外の高機能のエディタが必要な場合もあります。たとえば、列 にファイル名や色が含まれていると、ダイアログボックスを使用して編集する必要があります。 こうした場合、ComboList プロパティに省略符号("…")を設定します。そうすると、コントロールはセルの横にボタンを表示し、 これをユーザーがクリックすると CellButtonClick イベントを発生させます。イベントをトラップしてダイアログを表示させ、ユー ザーが選択した値でセルの内容を更新できます。 また、省略符号("…")の前にパイプ文字(|)を追加すると、ユーザーはボタンが表示されたセルに入力して、セルの内容を編集 できるようになります。 デフォルトでは、セルボタンに省略符号("…")が表示されます。CellButtonImage プロパティを使用すると、セルボタンにピク チャを設定することができます。 次のサンプルコードは、セルボタンを使用して列を編集する方法を示しています。 Visual Basic コードの書き方 Visual Basic ' 列を設定します。 Dim c As C1.Win.C1FlexGrid.Column = _flex.Cols(1) c.DataType = GetType(Color) c.ComboList = "..." ' << セルボタンを表示 c.ComboList = "..." C# コードの書 C# ' 列を設定します。 Column c = _flex.Cols[1]; c.DataType = typeof(Color); c.ComboList = "..."; c.ComboList = "..."; // << セルボタンを表示 そして次のサンプルコードでは、セルボタンのクリックを処理します。ユーザーがセルボタンをクリックし、カラーダイアログボッ クスから色を選択できるようにしています。 Visual Basic コードの書き方 Visual Basic Private Sub _flex_CellButtonClick(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles _flex.CellButtonClick ' カラーダイアログボックスを生成します。 105 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Dim clrDlg As New ColorDialog() ' ダイアログを初期化します。 If _flex(e.Row, e.Col) Is GetType(Color) Then clrDlg.Color = _flex(e.Row, e.Col) End If ' ダイアログから新しい色を取得し、それをセルに割り当てます。 If clrDlg.ShowDialog() = Windows.Forms.DialogResult.OK Then _flex(e.Row, e.Col) = clrDlg.Color End If End Sub C# コードの書き方 C# private void _flex_CellButtonClick( object sender, RowColEventArgs e) { // カラーダイアログボックスを生成します。 ColorDialog clrDlg = new ColorDialog(); // ダイアログを初期化します。 if (_flex[e.Row, e.Col] == typeof(Color)) { clrDlg.Color = (Color)_flex[e.Row, e.Col]; } // ダイアログから新しい色を取得し、それをセルに割り当てます。 if (clrDlg.ShowDialog() == DialogResult.OK) { _flex[e.Row, e.Col] = clrDlg.Color; } } マスク C1FlexGridコントロールは、マスクによる編集をサポートします。マスク編集とは、テンプレートとして入力マスクを使用し、 ユーザーが入力した値の正当性を自動的に検査します。マスクは、EditMask 、または EditMask プロパティで指定します。 このプロパティは、通常のテキストフィールドおよびドロップダウンコンボボックスフィールドに使用できます。 マスク文字列には、次の2種類の文字を使用できます。1つはリテラル文字で、入力の一部を表します。もう1つはテンプレート 文字で、特定のカテゴリ(数値やアルファベットなど)に属する文字のプレースホルダの役割を果たします。たとえば、次のコー ドでは、列1に電話番号を入力させるために"(999) 999-9999"というマスクを設定します。この"9"は、任意の数値を表すプレー スホルダです。 Visual Basic コードの書き方 Visual Basic ' 電話番号を入力するためのマスクを設定します _flex.Cols(1).EditMask = "(999) 999-9999" C# コードの書き方 106 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# // ' 電話番号を入力するためのマスクを設定します _flex.Cols[1].EditMask = "(999) 999-9999"; EditMask プロパティを空以外の文字列に設定すると、列は日付/時刻値を含む(通常これらの列の編集には DateTimePicker コントロールを使用)場合でも組み込みマスクエディタの使用を強制されます。これは特に、(日付を含まず) 時刻のみを含む DateTime 列を持っている場合に便利です。こうした場合、次のプロパティを設定して DateTimePicker コン トロールの代わりにマスクエディタを使用できます。 Visual Basic コードの書き方 Visual Basic _flex.Cols(1).DataType = GetType(DateTime) _flex.Cols(1).Format = "hh:mm tt" _flex.Cols(1).EditMask = "99:99 LL" C# コードの書き方 C# _flex.Cols[1].DataType = typeof(DateTime); _flex.Cols[1].Format = "hh:mm tt"; _flex.Cols[1].EditMask = "99:99 LL"; EditMask プロパティは、設計時に[定型入力 定型入力]ダイアログボックスを使用して設定することもできます。 [定型入力 定型入力]ダイアログボックスは、Column タスクメニューまたは 列エディタ からアクセスできます。 Column タスク タスクメニューで、[入力マスク 入力マスク]ボックスの〈...〉ボタンをクリックします。 107 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 列エディタ 列エディタで、左ペインの RowCol.EditMask プロパティを探し、その横の〈...〉ボタンをクリックします。 注意: 注意:[定型入力]ダイアログボックスは列固有で、選択した列の EditMask プロパティのみを変更します。 マスク文字を設定するための有効な書式についての詳細は、EditMask プロパティの説明を参照してください。 同列内の個々のセルにそれぞれ異なるマスクを設定するには、BeforeEditイベントをトラップして、このイベント内 でEditMask プロパティにカレントセルに対する適切なマスクを設定します。 入力値の正当性検査 多くの場合、マスクを設定するだけではユーザーの入力値に対する十分な正当性検査を行えません。たとえばマスクでは、値 の有効範囲を定義することや、カレントセルの値を他のセル値に基づいて正当性検査することはできません。 このような場合は、ValidateEdit イベントをトラップし、カレントセルのEditor.Textプロパティの値が有効であるかどうかを検査し ます。この時点では、セルにはまだ元の値が保持されています。入力値が不正であれば、Cancel 引数を True に設定します。 そうすることで、ユーザーが有効な値を入力するまでグリッドは編集モードを維持します。 たとえば、次のサンプルコードでは、通貨型の列に入力した値の正当性を検査し、入力値が確実に1,000~10,000の範囲にあ るようにします。 Visual Basic コードの書き方 Visual Basic Private Sub _flex_ValidateEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.ValidateEditEventArgs) Handles _flex.ValidateEdit ' Decimal 型の列のみ正当性検査を行います. If _flex.Cols(e.Col).DataType Is GetType(Decimal) Then Try Dim dec As Decimal = Decimal.Parse(_flex.Editor.Text()) If (dec < 1000) Or (dec > 10000) Then MessageBox.Show("Value must be between 1,000 and 10,000") e.Cancel = True End If Catch MessageBox.Show("数値として認識できません。") e.Cancel = True End Try End If End Sub C# コードの書き方 C# private void _flex_ValidateEdit( object sender, ValidateEditEventArgs e) { //Decimal 型の列のみ正当性検査を行います if (_flex.Cols[e.Col].DataType == typeof(Decimal)) { try { Decimal dec = Decimal.Parse(_flex.Editor.Text); if ( dec < 1000 || dec > 10000 ) 108 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms { MessageBox.Show("Value must be between 1,000 and 10,000"); e.Cancel = true; } } catch { MessageBox.Show("数値として認識できません。"); e.Cancel = true; } } } カスタムエディタ 組み込みエディタでは多種多様な柔軟性と機能を提供していますが、外部コントロールを特定のエディタとして使用したい場 合もあります。たとえば、複数の列リストから選択するためのエディタ、またはビジネスオブジェクトの編集用に記述した特別の コントロールを使用したい場合があります。 Control 基本クラスから派生する任意のコントロールを基本的なグリッドエディタとして使用できます。IC1EmbeddedEditor インタフェースを実装しているコントロールは、グリッドとのより優れた統合を提供し、より高度な機能を提供しま す。IC1EmbeddedEditor インタフェースについては、Editor プロパティも参照してください。 コントロールをカスタムエディタとして使用するには、Editor プロパティを使用してコントロールのインスタンスをグリッド列また はスタイルに関連付けるだけで済みます。設計時(列エディタを使用 列エディタを使用)または実行時にこれを行うことができます。これで、グ リッドでこのコントロールが自動的に使用されるようになります。 設計時にカスタムエディタを定義するには、フォームにエディタコントロールのインスタンスを追加し、C1FlexGrid タスク メ ニューから[列エディタ]を選択して 列エディタ を開きます。カスタムエディタを使用する列を選択し、その Editor プロパティを 新しいエディタコントロールの名前に設定します。 たとえば、NumericUpDown コントロールをグリッドエディタとして使用するには、次の手順に従います。 1. C1FlexGrid コントロールをフォームに追加します。 2. NumericUpDown コントロールをフォームに追加し、そのBorderStyle プロパティを None に設定します. 3. C1FlexGrid タスク メニューから[列エディタ 列エディタ]を選択します。[列エディタ 列エディタ]へのアクセス方法の詳細については、列エ ディタ を参照してください。 4. 列エディタ 列エディタで、最初のスクロール可能なグリッド列を選択し、その Editor プロパティを「numericUpDown1」に設定し ます。 109 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms プロジェクトを実行し、最初の列にある値を編集します。グリッドがどのように NumericUpDown コントロールを配置して初期 化し、ユーザーによるセル値の編集を可能にするかに注意してください。セルの編集が完了したら、別のセルをクリックするか [Enter]キーを押して次のセルに移動します。新しい値がどのようにセルに適用されるかに注意してください。 また、コードを使用してカスタムエディタをグリッドに割り当てることもできます。 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' カスタムエディタを作成します Dim editor as New NumericUpDown() editor.BorderStyle = BorderStyle.None ' カスタムエディタをグリッドに割り当てます _flex.Cols(1).Editor = editor End Sub C# コードの書き方 C# private void Form1_Load(object sender, System.EventArgs e) { // カスタムエディタを作成します NumericUpDown editor = new NumericUpDown(); editor.BorderStyle = BorderStyle.None; // ' カスタムエディタをグリッドに割り当てます _flex.Cols[1].Editor = editor; } 110 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms カスタムエディタの作成 Control 基本クラスから派生する任意のコントロールをグリッドエディタとして使用できます。これが可能となるのは、グリッド が Text や Bounds などの各プロパティと Leave や TextChanged などの各イベントにアクセスできる基本クラスに関する十 分な知識を持っているからです。多くの場合、このレベルのサポートで十分です。 しかし、基本クラスにそれほど厳密に従わないコントロールを使用したい場合があります。たとえば、DateTimePicker コント ロールは、Text の代わりに編集値の取得に使用する Value プロパティを持っています。この場合、IC1EmbeddedEditor イ ンタフェースに1つまたは複数のメソッドを実装してデフォルト動作を変更できます。たとえば、C1Input ライブラリ内のコント ロールはすべて IC1EmbeddedEditor をサポートしているため、C1FlexGrid (およびC1TrueDBGrid)と緊密に統合します。 IC1EmbeddedEditor インタフェースは非常に単純で、グリッドは最近の連結を使用してこのインタフェースに連結するため全 メンバを実装することも必要ありません。エディタコントロールに必要なメンバのみを実装します。 このインタフェースは、非常に柔軟性が高く事実上ほとんどのコントロールをグリッドエディタとして使用できます。 UITypeEditor クラスをグリッドエディタとして使用することも可能です。これを行うには、下記のようなラッパクラスが必要です。 1. Control から派生している(UITypeEditor は派生していない) 2. IC1EmbeddedEditor インタフェースを実装している 3. 適切な UITypeEditor をカプセル化している このようなラッパクラスのソースコードは、製品付属の「CustomEditors」サンプルにあります。 UITypeEditorラッパクラスを使用し、C1FlexGrid で任意の UITypeEditors を使用できます。.NET は、色、フォント、ファイル名 などを編集するためのいくつかの UITypeEditors を提供しています。また、コントロールを記述するより簡単な場合は、独自の UITypeEditors を記述することもできます。 注意: 注意:C1FlexGrid で組み込み、カスタム、UITypeEditor の各エディタを使用する例については、製品付属の 「CustomEditorsサンプル」を参照してください。 編集モードの制御 グリッドが現在編集モードかどうかは、Editor プロパティの値で確認します。このプロパティが null(VBの場合はNothing)を 返す場合、グリッドは編集モードではありません。null 以外であれば、グリッドは編集モードであり、プロパティはセルの編集に 使用中のコントロール(TextBox、ComboBox、またはその他のコントロールタイプが可能)への参照を返します。 プログラムによってグリッドを編集モードに切り替えるには、 StartEditing メソッドを使用します。また、編集を終了するに は、FinishEditingメソッドを使用します。 ナビゲート時にグリッド内の編集モードを保持するために、矢印キーまたはタブキーでPreserveEditModeの設定もできます。 グリッドで発生する編集の各イベントを処理し、さらに編集処理を制御できます。セル編集のプロセスで、次の各イベントが発 生します。 イベント 説明 BeforeEdit このイベントは、編集可能なセルが選択されたときに発生します。このイベントの Cancel 引数を True に設定すると、セルの編集を禁止できます。ま た、ComboListプロパティを変更して、適切なドロップダウンボタンをセル内に描 画することもできます。このイベントの後にユーザーが実際に編集を開始せず に、単に選択を別のセルまたはコントロールに移動できることに注意してくださ い。 StartEdit このイベントは、BeforeEdit と同じですが、ユーザーがキーを実際に入力するか セル内のドロップダウンボタンをクリックして、実際に編集を開始しようとする点が 異なります。この段階では、まだ編集を取り消すことができます。 StartEdit イベント発生時点では、Editor プロパティがまだ未確定な状態である ことに注意してください。これは、使用するエディタタイプをコントロールがまだ決 111 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms イベント 説明 定していないからです。この段階で、カスタムエディタを Editor プロパティに割り 当てることができます。 SetupEditor このイベントは、セル編集のエディタコントロールが作成および設定された後、そ れが表示される前に発生します。この時点で、エディタのプロパティを変更できま す(たとえば、TextBoxエディタ内で使用する最大長またはパスワード文字を設定 します)。また、独自のイベントハンドラをエディタに付加することもできます。 ValidateEdit このイベントは、ユーザーが編集を完了したとき、エディタ値がグリッドにコピーさ れる前に発生します。グリッドから元の値を取得して確認できます(イベントはこ のセルの座標値を提供します)。Editor プロパティ(Editor.Text など)を介して、 グリッドに割り当てようとしている新しい値を確認できます。新しい値がセルに有 効でない場合、Cancel 引数を True に設定するとグリッドは編集モードを維持し ます。 セルを編集モードのままにする代わりに、元の値を復元して編集モードから抜け るには、Cancel を True に設定して FinishEditing メソッドを呼び出します。 AfterEdit このイベントは、新しい値がセルに適用されてエディタが非アクティブ化した後に 発生します。このイベントを使用し、このセル値に依存しているすべて(小計値、 ソートなど)を更新できます。 セルのマージ C1FlexGrid コントロールでは、複数のセルを1つにマージすることで、複数行または列を1つのセルのように扱うことができま す。この機能によって、グリッドに表示されるデータをより見やすく整えることができます。これは、HTMLにおける" <ROWSPAN>"および"<COLSPAN>"タグの機能と似ています。 セルマージを有効にするには、次の2つの操作を行う必要があります。 1. グリッドの AllowMerging プロパティに AllowMergingEnum None 以外の値を設定します(各設定の機能について はリファレンスの項に説明があります)。 2. 列をマージしたい場合、マージしたい各列の AllowMerging プロパティを True に設定します。行をマージしたい場 合、マージしたい各行の RowCol.AllowMerging プロパティを True に設定します。 マージは、隣接するセル内に同一文字列(長さ0の文字列を除く)が格納されていると発生します。2つのセルを強制的にマー ジする手段はありません。セルマージは、セルの内容に応じて自動的に行われます。この機能を使用すると、データをソートし て表示する際、重複する隣接行のデータをマージすることで、同一データの連続を表すことができます。 セルマージには、いくつかの利用方法があります。たとえば、セルマージによってテーブルのヘッダやデータビューを作成した り、または隣接する列にテキストをはみ出して表示させることなどができます。 テーブルヘッダのマージ セルをマージしてテーブルのヘッダを作成するには、まずグリッドの AllowMerging プロパティを FixedOnly に設定します。 次に、マージしたい各列の AllowMerging プロパティと、マージしたい各行の AllowMerging プロパティを設定します。最 後に、マージするセルの内容がすべて同じになるように、ヘッダセルにテキストを設定します。 このサンプルコードを次に示します。 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i% 112 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ' コントロールを初期化します。 _flex.Styles.Normal.WordWrap = True _flex.Cols.Count = 9 _flex.Rows.Fixed = 2 _flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.FixedOnly ' 行ヘッダを作成します。 _flex.Rows(0).AllowMerging = True ' 同一内容の4つのセルをマージします。 Dim rng As C1.Win.C1FlexGrid.CellRange = _flex.GetCellRange(0, 1, 0, 4) rng.Data = "North" ' 同一内容の4つのセルをマージします。 rng = _flex.GetCellRange(0, 5, 0, 8) rng.Data = "北" For i = 1 To 4 _flex(1, i) = "Qtr " & i _flex(1, i + 4) = "Qtr " & i Next ' 列ヘッダを作成します。 _flex.Cols(0).AllowMerging = True ' 同一内容の2つのセルをマージします。 rng = _flex.GetCellRange(0, 0, 1, 0) rng.Data = "Sales by Product" ' セルの配置と自動サイズの調整を行います。 _flex.Styles.Fixed.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter _flex.AutoSizeCols(1, _flex.Cols.Count - 1, 10) End Sub C# コードの書き方 C# private void Form1_Load(System.object sender, System.EventArgs e) { int i; // コントロールを初期化します。 _flex.Styles.Normal.WordWrap = true; _flex.Cols.Count = 9; _flex.Rows.Fixed = 2; _flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.FixedOnly; // 行ヘッダを作成します。 _flex.Rows[0].AllowMerging = true; // 同一内容の4つのセルをマージします。 C1.Win.C1FlexGrid.CellRange rng = _flex.GetCellRange(0, 1, 0, 4); 113 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms rng.Data = "北"; // 同一内容の4つのセルをマージします。 rng = _flex.GetCellRange(0, 5, 0, 8); rng.Data = "南"; for ( i = 1 ; i <= 4; i++) { _flex[1, i] = "Qtr " + i; _flex[1, i + 4] = "Qtr " + i; } // 列ヘッダを作成します。 _flex.Cols[0].AllowMerging = true; // 同一内容の2つのセルをマージします。 rng = _flex.GetCellRange(0, 0, 1, 0); rng.Data = "Sales by Product"; // セルの配置と自動サイズの調整を行います。 _flex.Styles.Fixed.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter; _flex.AutoSizeCols(1, _flex.Cols.Count - 1, 10); } 以下の図のような結果になります: データビューのマージ セルマージは、グリッドをデータソースに連結したときも同じように機能します。次のコードは、設計時にデータソースに連結さ れたグリッドの例を示します。データソースへの連結方法の詳細については、「データソースへの連結」を参照してください。 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i% ' マージ対象のセルを設定します _flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.RestrictCols For i = _flex.Cols.Fixed To _flex.Cols.Count - 1 114 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms _flex.Cols(i).AllowMerging = True Next End Sub C# コードの書き方 C# private void Form1_Load( System.object sender, { int i; System.EventArgs e) // マージ対象のセルを設定します _flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.RestrictCols; for (int i = _flex.Cols.Fixed; i <= _flex.Cols.Count - 1; i++) { _flex.Cols(i).AllowMerging = true; } } このコードの実行結果は次のとおりです。 セルマージによって、データが視覚的にグループ化され、テーブルの情報が非常にわかりやすくなる点に注目してください。 注意: 注意:データを自動マージする例については、製品付属の「CellMerging サンプル」を参照してください。 セルをはみだして表示 AllowMerging プロパティには、他の設定とは異なる特殊な動作を定義する2つの設定値を持っており、この設定値を使用す る場合は、特定の行の AllowMerging プロパティや特定の列の AllowMerging プロパティを設定する必要はありません。 Spill 設定 このプロパティを AllowMergingEnum.Spill に設定すると、1つのセル内に収まらない長いデータが、隣のセル(空白の場合 に限り)にはみ出して表示されます。その結果の動作は Microsoft Excel の場合と同じです。長いデータをセルに入力するとき に隣接するセルが、空白であればデータは、はみ出して必要なだけのスペースを占領します。 たとえば、下の図は、C1FlexGrid.AllowMerging を AllowMergingEnum.Spill に設定した場合、ユーザーがさまざまな長さ 115 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms のデータを入力したときのグリッドの外観を示します。 Nodes 設定 AllowMergingEnum.Nodes 設定は、AllowMergingEnum.Spill と同じですが、アウトラインノードだけに適用されます。こ の設定は、データをグループ化して、ノード行にデータ行とは異なる書式を設定した場合に便利です。 たとえば、下の図は、Subtotal メソッドを使用してデータのグループ化と集計を行い、C1FlexGrid.AllowMerging を AllowMergingEnum.Nodes に設定したときのグリッドの外観を示します。 この図は、トピック: 小計行の作成の場合と同じです。違いは、小計行(ノード)がここでは空白の隣接セルにはみ出して、グ リッドの外観が改善されている点です。 カスタムマージ カスタムマージ これまでの自動マージを行いつつ、デフォルトのマージ動作を次の2つの方法でカスタマイズすることもできます。 カスタムIComparerクラスをCustomComparer プロパティに割り当てます。デフォルトでは、グリッドは同じ Null 以外 の値を含んでいる隣接セルをマージします。文字列の比較は、大文字と小文字を区別し、空白を含めます。大文字と 小文字を区別しない比較を使用し、空白を取り除いてグリッドのセルをマージしたい場合、IComparerを実装しているカ スタムクラスを記述し、それを CustomComparer プロパティに割り当てることができます。 C1FlexGrid から派生する新しいクラスを記述し、GetMergedRange 仮想メソッドを変更して独自のカスタムマージロ ジックを提供します。 注意: 注意:C1FlexGrid を継承したカスタムマージロジックの実装方法の例については、製品付属の「CustomMerge 116 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms サンプル」、「CustomMerge2 サンプル」を参照してください。 アウトラインとデータの集計 C1FlexGrid コントロールには、データを集計して階層表示するためのメソッドとプロパティが用意されています。データを集計 し、小計行を追加するには、Subtotal メソッドを使用します。データを階層表示するには、Tree プロパティを使用します。 小計行の作成 Subtotal メソッドを使用すると、通常(小計以外)のデータ行を集合計算した小計行を追加できます。 Subtotal メソッドは、階層的な集合計算をサポートします。たとえば、グリッドに売上データが含まれる場合、 C1FlexGridBase.Subtotal を呼び出して「製品」「販売地域」および「販売員」ごとの売上計を算出します。これを以下のコードで 示します。 Visual Basic コードの書き方 Visual Basic Private Sub ShowTotals() ' 既存の小計をクリアします _flex.Tree.Column = 0 _flex.Tree.Style = TreeStyleFlags.Simple ' グリッドをソートします _flex.Subtotal(AggregateEnum.Clear) ' 総計(特定の列インデックスの変わりに-1を使用)を算出します. _flex.Subtotal(AggregateEnum.Sum, -1, -1, 3, "Grand Total") ' 列0(製品)ごとの合計を算出します _flex.Subtotal(AggregateEnum.Sum, 0, 0, 3, "Total {0}") ' 列1(地域)ごとの合計を算出します _flex.Subtotal(AggregateEnum.Sum, 1, 1, 3, "Total {0}") ' 内容に合わせて列の幅を調整します _flex.AutoSizeCols() End Sub C# コードの書き方 C# private void ShowTotals() { // 既存の小計をクリアします _flex.Tree.Column = 0; _flex.Tree.Style = TreeStyleFlags.Simple; // グリッドをソートします _flex.Subtotal(AggregateEnum.Clear); // 総計(特定の列インデックスの変わりに-1を使用)を算出します 117 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms _flex.Subtotal(AggregateEnum.Sum, -1, -1, 3, "Grand Total"); // 列0(製品)ごとの合計を算出します _flex.Subtotal(AggregateEnum.Sum, 0, 0, 3, "Total {0}"); // 列1(地域)ごとの合計を算出します _flex.Subtotal(AggregateEnum.Sum, 1, 1, 3, "Total {0}"); // 内容に合わせて列の幅を調整します _flex.AutoSizeCols(); } Subtotal メソッドによって小計行が追加されると、その行には自動的に小計行用のスタイルが割り当てられます(5レベルの 小計行用の組み込みスタイルがあります)。設計時にスタイルエディタ スタイルエディタを使用するか、もしくは実行時にコードを使用してアウト ラインスタイルのプロパティを変更すると、小計行の外観をカスタマイズできます。たとえば、次のようになります。 Visual Basic コードの書き方 Visual Basic ' 小計のスタイルを設定します Dim cs As C1.Win.C1FlexGrid.CellStyle cs = _flex.Styles(C1.Win.C1FlexGrid.CellStyleEnum.GrandTotal) cs.BackColor = Color.Black cs.ForeColor = Color.White cs.Font = New Font(Font, FontStyle.Bold) cs = _flex.Styles(C1.Win.C1FlexGrid.CellStyleEnum.Subtotal0) cs.BackColor = Color.DarkRed cs.ForeColor = Color.White cs.Font = New Font(Font, FontStyle.Bold) cs = _flex.Styles(C1.Win.C1FlexGrid.CellStyleEnum.Subtotal1) cs.BackColor = Color.DarkBlue cs.ForeColor = Color.White C# コードの書き方 C# //小計のスタイルを設定します CellStyle cs; cs = _flex.Styles[CellStyleEnum.GrandTotal]; cs.BackColor = Color.Black; cs.ForeColor = Color.White; cs.Font = new Font(Font, FontStyle.Bold); cs = _flex.Styles[CellStyleEnum.Subtotal0]; cs.BackColor = Color.DarkRed; cs.ForeColor = Color.White; cs.Font = new Font(Font, FontStyle.Bold); cs = _flex.Styles[CellStyleEnum.Subtotal1]; cs.BackColor = Color.DarkBlue; cs.ForeColor = Color.White; 118 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms このコードを実行すると、グリッドの外観は次のようになります。 総計行は、すべての製品、販売地域、および販売員の総売上を含みます。この行は Subtotal メソッドの呼び出し時、 groupOn 引数に -1 を使用することで作成されます。その他の小計行は、製品と販売地域ごとの合計を示します。これらは、 groupOn 引数に 0 または 1 を指定することで作成されます。 また、合計以外の集合計算(平均や百分率など)を算出したり、行ごとに複数の集合計算(総売上、純売上)を算出することも できます。 Subtotal メソッドによって作成された小計行は、次の4点で通常の行と異なります。 1. Subtotal メソッドに AggregateEnum.Clear 引数を指定して呼び出すと、小計行を自動消去できます。これは、データ を動的に表示するための便利な機能です。この機能によって、ユーザーが列の移動やデータの再ソートをしても、小計 行が自動的に再計算されます。 2. 小計行をアウトラインのノードとして使用できます。グリッドをアウトライン表示すると、グループごとの小計行を縮小す ることでデータ全体の概要を把握したり、必要に応じて小計行を展開し、データの詳細を閲覧したりできます。アウトラ インツリーを表示するには、Column および Tree.Style の各プロパティを設定してアウトラインツリーの位置と外観を 定義します。 3. 小計行をツリーのノードとして処理できます。Node プロパティを介して、小計行の Node オブジェクトを取得できます。 4. グリッドをデータソースに連結しているとき、小計行は実際のデータと関連付けられていません。したがって、カーソル をデータソース内で移動すると、グリッドの小計行は無視されます。 アウトラインツリーのノードをクリックすると、グリッドの各セクションを縮小および展開できます。これは、集合計算値だけでな く、さまざまな種類のデータ表示に便利な機能です。次のトピックでは、カスタムアウトラインツリーを作成してディレクトリ情報 を表示する方法を紹介します。 カスタムツリーの作成 Subtotal メソッドを使用せずにアウトラインツリーを作成するには、次の手順に従います。 1. グリッドにデータを供給します。 2. アウトラインノードとして定義したい行の IsNodeプロパティを True に設定します。 3. 各ノード行の Nodeオブジェクトを取得し、そのLevel プロパティを設定して各ノードの階層レベルを定義します。大きい 値ほど、アウトラインツリー上のより深い(よりインデントした)階層レベルを意味します。 たとえば、次のサンプルコードは、ディレクトリツリーを作成します。 Visual Basic コードの書き方 119 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' グリッドレイアウトの初期化を行います fg.Cols.Fixed = 0 fg.Cols.Count = 1 fg.Rows.Count = 1 fg.ExtendLastCol = True fg.Styles.Normal.TextAlign = TextAlignEnum.LeftCenter fg.Styles.Normal.Border.Style = BorderStyleEnum.None ' アウトラインツリーを表示します fg.Tree.Column = 0 fg.Tree.Style = TreeStyleFlags.SimpleLeaf ' グリッドにデータをセットします AddDirectory("c:\", 0) End Sub C# コードの書き方 C# private void Form1_Load(object sender, System.EventArgs e) { // グリッドレイアウトの初期化を行います fg.Cols.Fixed = 0; fg.Cols.Count = 1; fg.Rows.Count = 1; fg.ExtendLastCol = true; fg.Styles.Normal.TextAlign = TextAlignEnum.LeftCenter; fg.Styles.Normal.Border.Style = BorderStyleEnum.None; // アウトラインツリーを表示します fg.Tree.Column = 0; fg.Tree.Style = TreeStyleFlags.SimpleLeaf; // グリッドにデータをセットします AddDirectory("c:\\", 0); } 上記のサンプルではグリッドのレイアウトを初期化してから、AddDirectory ルーチンを呼び出し、グリッドにデータを供給して ツリー構造を設定させます。 Visual Basic コードの書き方 Visual Basic Private Sub AddDirectory(ByVal dir As String, ByVal level As Integer) ' ディレクトリを追加します Dim thisDir As String thisDir = Path.GetFileName(dir) If thisDir.Length = 0 Then thisDir = dir fg.AddItem(thisDir.ToUpper()) ' 新たに行を作成し、ノードとします Dim row As Row row = fg.Rows(fg.Rows.Count - 1) row.IsNode = True 120 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ' ノードレベルを設定します Dim nd As Node nd = row.Node nd.Level = level ' ファイル情報を取得し、ツリーに追加します Dim file As String, cnt As Integer cnt = 1 For Each file In Directory.GetFiles(dir) fg.AddItem(Path.GetFileName(file).ToLower()) cnt = cnt + 1 If cnt > 10 Then Exit Fo ' 最大10個までのファイルを追加します Next ' ディレクトリ情報を取得し、ツリーにサブディレクトリ '(最大4階層まで)を追加します If level < = 4 Then Dim subdir As String cnt = 1 For Each subdir In Directory.GetDirectories(dir) AddDirectory(subdir, level + 1) cnt = cnt + 1 If cnt > 10 Then Exit For ' 最大10個までのサブディレクトリを追加します Next End If End Sub C# コードの書き方 C# private void AddDirectory(string dir, int level) { // ディレクトリを追加します string thisDir; thisDir = Path.GetFileName(dir); if (thisDir.Length == 0) { thisDir = dir; } fg.AddItem(thisDir.ToUpper()); // 新たに行を作成し、ノードとします Row row; row = fg.Rows[fg.Rows.Count - 1]; row.IsNode = true; // ノードレベルを設定します Node nd; nd = row.Node; nd.Level = level; // ファイル情報を取得し、ツリーに追加します int cnt; cnt = 1; foreach (string file in Directory.GetFiles(dir)) 121 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms { // // // // fg.AddItem(Path.GetFileName(file).ToLower()); cnt = cnt + 1; 最大10個までのファイルを追加します if (cnt > 10) { break; } } ディレクトリ情報を取得し、ツリーにサブディレクトリ (最大4階層まで)を追加します if (level <= 4) { cnt = 1; foreach (string subdir in Directory.GetDirectories(dir)) { AddDirectory(subdir, level + 1); cnt = cnt + 1; 最大10個までのサブディレクトリを追加します if (cnt > 10) { break; } } } } AddDirectory は、カレントディレクトリおよびすべてのサブディレクトリをトラバースする再帰ルーチンです。このサンプルで は、時間の節約のため、ツリーサイズを4つのディレクトリレベルに制限しています。実際のアプリケーションでは、展開したと きにのみ、ツリーの分枝を読み込むようにルーチンを変更する必要があります(後述の 「チュートリアル」を参照してください)。 このコードは次のような外観のグリッドを作成します。 122 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms コントロールによるアウトラインとツリーの作成 C1FlexGrid コントロールのユニークで定評のある機能の1つは、階層的なグループ化を通常の非構造化データに追加する 能力です。 これを達成するために、C1FlexGrid は Node 行の概念を導入しています。 Node 行は、通常のデータを格納しません。代わ りに、これらは、通常の TreeView コントロールのノードとまったく同様に、類似のデータをグループ化するヘッダーとして機能 します。 TreeView コントロールのノードと同様に、ノード行は縮小/展開したり、格納しているデータを非表示/表示にしたり できます。また、TreeView コントロールと同様に、ノード行もノード階層を定義する Level プロパティを持っています。下位レベ ルノードは上位レベルノードを格納します。 たとえば、顧客名、国、都市、および売上高を表示するグリッドがあるとします。この標準的なグリッドは通常、次のような表示 になります。 A情報はすべてそこにありますが、国や顧客ごとの総売上額が見てあまり明瞭ではありません。 C1FlexGrid のアウトライン 機能を使用すると、データを国(レベル0)別にグループ化してから、各国の都市(レベル1)別にグループ化した後、各都市の 顧客(レベル2)別にグループ化できます。以下に、アウトラインを追加した後の同じグリッドを示します。 このグリッドは、前と同じ情報を表示(同じデータソースにバインド)していますが、各ノードがその下にデータの概要を格納す るツリーを追加します。ノードは、縮小して概要のみを表示したり、展開して詳細を表示したりできます。各ノード行は、複数の 列の概要(この場合は販売合計数と合計金額)を表示できることに注意してください。 この項では、通常のグリッドをより機能豊富なアウトライングリッドに変える手順をガイドします。 データのロード アウトライングリッドへのデータのロードは、通常のグリッドへのロードとまったく同じです。データソースがデザイン時に使用可 能な場合、Visual Studio のプロパティウィンドウを使用し、1行のコードを記述せずに、グリッドの DataSource プロパティを設 定して、グリッドをデータにバインドできます。 データソースがデザイン時に使用可能でない場合、コードでグリッドの DataSource プロパティを設定できます。一般に、デー タバインディングコードは次のようになります。 123 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# public Form1() { InitializeComponent(); //データを取得します。 var fields = @" Country, City, SalesPerson, Quantity, ExtendedPrice"; var sql = string.Format("SELECT {0} FROM Invoices ORDER BY {0}", fields); var da = new OleDbDataAdapter(sql, GetConnectionString()); da.Fill(_dt); //グリッドをデータにバインドします。 this._flex.DataSource = _dt; // ExtendedPrice 列をフォーマットします。 _flex.Cols["ExtendedPrice"].Format = "n2"; } このコードは、OleDbDataAdapter を使用して、DataTable にデータを入力した後、この DataTable をグリッドの DataSource プロパティに割り当てます。 このコードを実行すると、最初の画像に示した「通常のグリッド」が得られます。この通常のグリッドを2番目の画像に示したア ウトライングリッドに変えるには、アウトラインを構成するノード行を挿入する必要があります。 ノード行の作成 ノード行は、以下の点を除き、通常行とほぼ同じです。 ノード行はデータバインドされません。グリッドがデータソースにバインドされると、各通常行はデータソース内の項目に 対応します。ノード行は対応しません。代わりに、ノード行は類似データを格納する通常行をグループ化します。 ノード行は縮小または展開できます。ノード行が縮小すると、すべてのデータと子ノードは非表示になります。アウトライ ンツリーが表示されている場合、ユーザーはマウスやキーボードを使用してノードを縮小および展開できます。アウトラ インツリーが表示されていない場合、ノードはコードによってのみ展開または縮小できます。 行がノードかどうかを決定するには、次のように IsNode プロパティを使用できます。 C# コードの書き方 C# var row = _flex.Rows[rowIndex]; if (row.IsNode) { //行はノードです。 var node = row.Node; DoSomethingWithTheNode(node); } else { //この行はノードではありません。 } 124 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ノード行は次の3つの方法で作成できます。 1. Rows.InsertNodeメソッドを使用します。これにより、新しいノード行が指定したインデックスに挿入されます。ノード行 が作成されたら、それを他の任意の行と同様に使用できます(列ごとのデータの設定やスタイルの適用など)。これは、 合計を挿入してアウトラインを構築するための「低レベル」の方法です。この方法は、最大の制御と柔軟性を提供し、以 下に示されています。 2. Subtotalメソッドを使用します。このメソッドは、グリッド全体をスキャンし、グリッドデータが変化する位置にオプションの 小計を持つノード行を自動的に挿入します。これは、合計を挿入してアウトラインを構築するための「高レベル」の方法 です。この方法は、コードがほとんど不要ですが、グリッド上でデータを構造化する方法とアウトラインの外観について いくつかのことを前提しています。 3. グリッドが非バインドの場合、IsNode を true に設定することで、通常行をノード行に変えることができます。これはグ リッドが非バインドの場合にのみ機能することに注意してください。通常のデータバインド行をノードに変えようとする と、グリッドは例外をスローします。 下のコードに、指定の列の同じ値をグループ化するノード行を挿入する GroupBy メソッドを実装する方法を示します。 C# コードの書き方 C# //指定レベルのノードを挿入する指定の列をグループ化します。 void GroupBy(string columnName, int level) { object current = null; for (int r = _flex.Rows.Fixed; r < _flex.Rows.Count; r++) { if (!_flex.Rows[r].IsNode) { var value = _flex[r, columnName]; if (!object.Equals(value, current)) { // value changed: ノードを挿入します。 _flex.Rows.InsertNode(r, level); //最初のスクロール可能な列にグループ名を表示します。 _flex[r, _flex.Cols.Fixed] = value; //現在の値を更新します。 現在の値。 } } } } このコードは、すべての列をスキャンし、既存のノード行をスキップして(これにより複数レベルのノードを追加するためにコード を呼び出すことが可能)、グループ化されている列の現在の値のトラッキングを維持します。 現在の値が変更されると、最初 のスクロール可能な列に新しいグループ名を表示するノード行が挿入されます。 例に戻り、このメソッドを使用し、次を呼び出すことで、2レベルのアウトラインを作成できます。 C# コードの書き方 C# void _btnGroupCountryCity_Click(object sender, EventArgs e) { GroupBy("Country", 0); GroupBy("City", 1); } 125 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 非常に単純ですが、いくつかの注意点があります。最初に、このメソッドは、データがアウトライン構造に従ってソートされること を前提としています。この例では、[国]ではなく、[販売員 販売員]によってソートされた場合、アウトラインは、おそらく不必要な国ごと の複数のレベル0ノードを含むことになります。 また、GroupBy メソッドは、多くの行を挿入できますが、グリッドのちらつきの原因にもなります。これを回避するには、通常 は、更新を実行する前に Redrawプロパティを false に設定して、更新が完了した後に設定を true に戻します。 これらの問題を処理するには、アウトラインを作成するコードを次のように記述し直す必要があります。 C# コードの書き方 C# void _btnGroupCountryCity_Click(object sender, EventArgs e) { //更新中の再描画を中断します。 using (new DeferRefresh(_flex)) { //元のソート(国、都市別など)を復元します ResetBinding(); //国、都市によってグループ化します。 GroupBy("Country", 0); GroupBy("City", 1); } } DeferRefresh クラスは、グリッドの Redraw プロパティを false に設定し、それが破棄されたときに元の値を復元する単純な ユーティリティです。これにより、更新中に例外が発生しても Redraw が正しく復元されるようになります。以下 に、DeferRefresh クラスの実装を示します。 C# コードの書き方 C# /// Redraw ブロック内のグリッドの長い演算をカプセル化するために使用される Utility クラス。 ///これにより、ちらつきが回避され、万一の場合に Redraw プロパティが正しくリセットされるようになります。 ///演算中に例外がスローされます。 class DeferRefresh : IDisposable { C1FlexGrid _grid; bool _redraw; public DeferRefresh(C1FlexGrid grid) { _grid = grid; _redraw = grid.Redraw; grid.Redraw = false; } public void Dispose() { _grid.Redraw = _redraw; } } BindGrid メソッドは、グリッドがアウトライン構造で要求された順序でソートされるようにします。例では、ソート順は[国 国]、[都 都 市]、[販売員 販売員]別の順となります。コードは次のようになります。 126 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# // グリッドのバインドを解除して再バインドし、すべてをリセットします。 void ResetBinding() { //グリッドのバインドを解除します。 _flex.DataSource = null; //任意のカスタムソートをリセットします。 _dt.DefaultView.Sort = string.Empty; //グリッドを再バインドします。 _flex.DataSource = _dt; // ExtendedPrice 列をフォーマットします。 _flex.Cols["ExtendedPrice"].Format = "n2"; //コンテンツの大きさに合わせて列のサイズを自動調整します。 _flex.AutoSizeCols(); } この時点でこのコードを実行すると、ノード行が予想どおりに作成されますが、アウトラインツリーが表示されていないため、 ノードを展開したり縮小できないことが分かります。アウトラインツリーは次のセクションで説明します。 アウトラインツリー アウトラインツリーは、通常の TreeView コントロールで目にするものと非常に類似しています。アウトラインツリーは、インデ ントした構造を表示し、各ノード行の横には縮小/展開アイコンがあるため、ユーザーはアウトラインを展開および縮小して希 望レベルの詳細を表示できます。 アウトラインツリーは、Tree.Column プロパティで定義された任意の列に表示できます。デフォルトでは、このプロパティは-1 に設定され、ツリーはまったく表示されません。上記の例でアウトラインツリーを表示するには、次のコードを使用します。 C# コードの書き方 C# void _btnTreeCountryCity_Click(object sender, EventArgs e) { using (new DeferRefresh(_flex)) { //前と同様に国と都市別にグループ化します。 _btnGroupCountryCity_Click(this, EventArgs.Empty); //アウトラインツリーを表示します。 _flex.Tree.Column = 0; //ツリーに合わせてサイズを自動調整します。 _flex.AutoSizeCol(_flex.Tree.Column); //詳細ノードを縮小します。 127 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms _flex.Tree.Show(1); } } このコードは、前のメソッドを呼び出してアウトラインを構築した後、Tree.Column プロパティをゼロに設定して、最初の列にア ウトラインツリーを表示させます。また、C1FlexGrid.AutoSizeColメソッドも呼び出して、列がアウトラインツリーを収めるのに 十分な広さになるようにします。最後に、Tree.Show メソッドを呼び出して、すべてのレベル0ノード(この場合は都市)を表示 してすべての詳細を隠します。 Treeプロパティは、アウトラインツリーのカスタマイズに使用するいくつかのメソッドとプロパティを公開する GridTree オブジェ クトへの参照を返します。主なメソッドとプロパティは以下のとおりです。 Column: アウトラインツリーを格納する列のインデックスを取得または設定します。このプロパティを -1に設定すると、 アウトラインツリーはユーザーから非表示になります。 Indent: 隣接するノードレベル間のインデントをピクセル単位で取得または設定します。インデントレベルが高いほど、 ツリーは広くなります。 Style: 表示するアウトラインツリーのタイプを取得または設定します。このプロパティを使用し、ツリーが上部にボタン バーを含めてユーザーがツリー全体を縮小/展開できるようにするかどうか、線および/または記号を表示するかどう か、およびツリーをデータ行やノード行と結ぶ線を表示するかどうかを決定します。 LineColor: ツリーの結合線の色を取得または設定します。 LineStyle: ツリーの結合線のスタイルを取得または設定します。 たとえば、上のコードを変更することで、これらの2行を含めます。 C# コードの書き方 C# //アウトラインツリーを表示します。 _flex.Tree.Column = 0; _flex.Tree.Style = TreeStyleFlags.CompleteLeaf; _flex.Tree.LineColor = Color.White; _flex.Tree.Indent = 30; アウトラインツリーは次のように変わります。 左上セルのラベル「1」、「2」、および「*」というラベルのボタンに注意してください。これらのボタンをクリックすると、ツリー全体 が対応するレベルに縮小または展開します。また、大幅に広くなったインデントや、ツリーを通常行(「Anne Dodsworth」)や ノード行と結ぶ線にも注意してください。 小計の追加 ここまで、ノード行とアウトラインツリーの作成をカバーしました。しかし、アウトラインを本当に有益なものにするには、ノード行 128 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms は格納しているデータの概要情報を含める必要があります。 Subtotal メソッドを使用してアウトラインツリーを作成すると、小計が自動的に追加されます。これは後述のセクションで説明 されます。 上述した Rows.InsertNode メソッドを使用してアウトラインツリーを作成した場合、Aggregate メソッドを使用し、各行グルー プの小計を計算して、その結果をノードに直接挿入する必要があります。 以下の Subtotal メソッドはこれを行う方法を示します。 C# コードの書き方 C# //小計を指定レベルの各ノードに追加します。 void AddSubtotals(int level, string colName) { //合計する列を取得します。 int colIndex = _flex.Cols.IndexOf(colName); //行をスキャンして該当レベルのノードを探します。 for (int r = _flex.Rows.Fixed; r < _flex.Rows.Count; r++) { if (_flex.Rows[r].IsNode) { var node = _flex.Rows[r].Node; if (node.Level == level) { //ノードを見つけて、明細金額の合計を計算します。 var range = node.GetCellRange(); var sum = _flex.Aggregate(AggregateEnum.Sum, range.r1, colIndex, range.r2, colIndex, AggregateFlags.ExcludeNodes); //グリッドに合計を表示します。 //(自動的に列形式を使用します。) _flex[r, colIndex] = sum; } } } } AddSubtotals メソッドは、グリッド行をスキャンしてノード行を探します。 希望レベルのノード行が見つかると、メソッドは GetCellRangeメソッドを使用してノードの子行を取得します。次に、Aggregate メソッドを使用し、範囲全体のターゲット列の 値の合計を計算します。 Aggregate への呼び出しには、既存のノードの二重計算を回避するために ExcludeNodes フラグ が組み込まれます。小計が計算されると、小計は通常の _flex[row, col] インデクサでノード行のセルに割り当てられます。 ノード行がデータにバインドしていないため、これがデータソースにまったく影響しないことに注意してください。 また、このメソッドを使用して、複数の合計を各ノード行に追加できることにも注意してください。この例では、[数量 数量]および[明 明 細金額 細金額]列に合計を追加します。合計に加えて、平均、最大、最小など、他の集計も追加できます。 これで、このメソッドを使用して、ノード行、アウトラインツリー、および小計を持つ完全なアウトラインを作成できるようになりま した。 C# コードの書き方 C# 129 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms void _btnTreeCountryCity_Click(object sender, EventArgs e) { using (new DeferRefresh(_flex)) { //元のソート(国、都市、販売員別など)を復元します。 ResetBinding(); //国、都市によってグループ化します。 GroupBy("Country", 0); //国(レベル0)によってグループ化します。 GroupBy("City", 1); //都市(レベル1)によってグループ化します。 //国、都市ごとの合計を追加します。 AddSubtotals(0, AddSubtotals(0, AddSubtotals(1, AddSubtotals(1, "ExtendedPrice"); "Quantity"); "ExtendedPrice"); "Quantity"); //国(レベル0)ごとの明細金額 //国(レベル0)ごとの数量 //都市(レベル1)ごとの明細金額 //都市(レベル1)ごとの数量 //アウトラインツリーを表示します。 _flex.Tree.Column = 0; _flex.AutoSizeCol(_flex.Tree.Column); _flex.Tree.Show(1); } } この時点でプロジェクトを実行すると、国と都市ごとの販売した合計数と合計金額を表示するノード行を持つツリーが表示され ます。これは非常に洗練されていますが、小さな問題があります。ノード行のどれかを展開すると、多数の重複した値が表示さ れます。指定の都市の下のすべての行が同じ国と都市を持っています。 これは正確ですが、画面サイズの浪費にもなります。これらの重複した値を消去するのは簡単で、グループ化されている列の Width をゼロに設定するだけで済みます。ただし、これを行う際は、グリッドの AllowMerging プロパティを Nodes に設定 することも忘れないようにする必要があります。これにより、ノード行に割り当てられたテキストが表示列にはみ出して表示され 130 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ます。(別のオプションは、ノードテキストを最初の表示列に割り当てる方法ですが、通常、マージの方が、より長いテキストを ノード行に使用できるため、より良いソリューションです) 以下に、修正したコードと最終結果を示します。 C# コードの書き方 C# void _btnTreeCountryCity_Click(object sender, EventArgs e) { using (new DeferRefresh(_flex)) { //元のソート(国、都市、販売員別など)を復元します。 ResetBinding(); //国、都市によってグループ化します。 GroupBy("Country", 0); //国(レベル0)によってグループ化します。 GroupBy("City", 1); //都市(レベル1)によってグループ化します。 //グループ化した列を隠します。 //(これらはツリーノードに既に表示されている重複した値のみ持っています。) //(ただし、これらを非表示にはできません。非表示にするとノードテキストも非表示になります。) _flex.Cols["Country"].Width = 0; _flex.Cols["City"].Width = 0; //ノードのコンテンツを次のセルにはみ出して表示できるようにします。 _flex.AllowMerging = AllowMergingEnum.Nodes; //国、都市ごとの合計を追加します。 AddTotals(0, "ExtendedPrice"); AddTotals(0, "Quantity"); AddTotals(1, "ExtendedPrice"); AddTotals(1, "Quantity"); //国(レベル0)ごとの明細金額 //国(レベル0)ごとの数量 //都市(レベル1)ごとの明細金額 //都市(レベル1)ごとの数量 //アウトラインツリーを表示します。 _flex.Tree.Column = 0; _flex.AutoSizeCol(_flex.Tree.Column); _flex.Tree.Show(1); } } 131 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 今、[国]と[都市 国]と[都市]列は非表示になっていますが、それらの値はまだノード行に表示されています。ツリーを縮小すると、国と都 市ごとの合計が表示されます。 Subtotal メソッドの使用 C1FlexGrid の Subtotal メソッドを使用しても、ツリーを作成できることを前に説明しました。Subtotal メソッドは、上述した GroupBy および AddSubtotals メソッドと同じタスクを実行します。ただし、1つの手順で両方の作業を実行するため、効率 が少し向上します。 下のコードに、 、Subtotal メソッドを使用して前に行ったのと同じことを実行できることを示します。処理が少しスピードアップし、 どのヘルパーメソッドも使用されていないだけです。 C# コードの書き方 C# void _btnTreeCountryCity_Click(object sender, EventArgs e) { using (new DeferRefresh(_flex)) { //元のソート(国、都市、販売員別など)を復元します。 ResetBinding(); //国と都市ごとにグループ化し、合計します。 _flex.Subtotal(AggregateEnum.Sum, _flex.Subtotal(AggregateEnum.Sum, _flex.Subtotal(AggregateEnum.Sum, _flex.Subtotal(AggregateEnum.Sum, 0, 0, 1, 1, "Country", "ExtendedPrice"); "Country", "Quantity"); "City", "ExtendedPrice"); "City", "Quantity"); //グループ化した列を隠します。 //(これらはツリーノードに既に表示されている重複した値のみ持っています。) //(ただし、これらを非表示にはできません。非表示にするとノードテキストも非表示になります。) _flex.Cols["Country"].Width = 0; _flex.Cols["City"].Width = 0; _flex.AllowMerging = AllowMergingEnum.Nodes; 132 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms //アウトラインツリーを表示します。 _flex.Tree.Column = 0; _flex.AutoSizeCol(_flex.Tree.Column); _flex.Tree.Show(1); } } Subtotal メソッドは非常に便利で柔軟です。このメソッドは、数多くのオーバーロードを持つため、インデックスや名前別にグ ループ化して合計する列を指定したり、挿入するノード行にキャプションを組み込むかどうかや、グループ化の実行方法などを 指定したりできます。以下の要約で、使用可能なオーバーロードを説明します。 1. Subtotal(AggregateEnum aggType) メソッドのこのバージョンは、集計タイプをパラメータとしてのみ受け取ります。新しい小計を挿入する前に既存の小計 を削除する場合にのみ役立ちます。この場合、 aggType パラメータは AggregateEnum.Clear に設定されます。 2. Subtotal(AggregateEnum aggType, int groupBy, int totalOn) Subtotal(AggregateEnum aggType, string groupBy, string totalOn) これらは最も一般に使用されるオーバーロードです。パラメータは、挿入する集計のタイプ、およびグループ化して合計 する列です。列は、インデックスまたは名前によって参照できます。後者は上の例で使用されたものです。 3. Subtotal(AggregateEnum aggType, int groupBy, int totalOn, string caption) Subtotal(AggregateEnum aggType, string groupBy, string totalOn, string caption) これらのオーバーロードは、特別な caption パラメータです。 caption パラメータは、グループ化する値を識別するた めに新しいノード行に追加されたテキストを決定します。デフォルトでは、グループ化する値が表示されるため、国に よってグループした場合、ノード行は「アルゼンチン」、「ブラジル」などを表示します。 caption パラメータを「国:{0}」な どの文字列に設定した場合、ノード行は代わりに「国:アルゼンチン」を表示します。 4. Subtotal(AggregateEnum aggType, int groupFrom, int groupTo, int totalOn, string caption) Subtotal(AggregateEnum aggType, string groupFrom, string groupTo, string totalOn, string caption) これらのオーバーロードは、groupBy パラメータを groupFrom と groupTo の2つに分けます。デフォルトでは、 Subtotal メソッドは、groupBy または任意の前の列の値が変更されると必ずノード行を挿入します。 たとえば、行が「都市」列には前の行と同じ値を持ち、「国」列には異なる値を持っている場合、Subtotal メソッドはこれ らの行が異なるグループにあると見なして、groupBy 列の値が同じ場合でも新しいノード行を挿入します。これらの集 計により、その動作をオーバーライドして、グループを識別するときに考慮される列範囲を指定できます。 アウトラインの保守 これまで、高レベルの Subtotal メソッドと、低レベルの Rows.InsertNode や Aggregate メソッドを使用して、ツリーと合計 を持つアウトラインを作成する方法について説明しました。 この時点で、アウトラインツリーはデータに基づいて作成されていても、決してデータにバインドされていないことや、グリッドま たはデータへの変更があるときに自動的に維持されないことを覚えておくことは重要です。 ユーザーがたとえば、「ExtendedPrice」列の値を変更した場合、小計は自動的に更新されません。ユーザーがグリッドをソート した場合、データは更新され小計が非表示になります。 アウトラインを維持するには、次の2つの一般的な方法があります。 1. ユーザーにアウトラインを無効にするような変更を行わせないようにします。これが最も簡単なオプションです。グリッド の AllowEditing、AllowDragging、および AllowSorting プロパティを false に設定し、アウトラインに影響するよう な任意の変更を防止します。 2. データまたはグリッドへの変更があるときにアウトラインを更新します。ハンドラをグリッドの AfterDataRefresh, AfterSort、および AfterEdit イベントにアタッチして、アウトラインを適切に再生成します。 133 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms オプション2は通常、動的データ分析の速くてシンプルなツールを提供するため、より興味深い方法です。この方法は、 C1FlexGrid で提供されている Analyze サンプルに示されています。サンプルでは、初期アウトラインを作成し、ユーザーに 列の並べ替えを許可します。列順が変更されると、サンプルは自動的にデータを再ソートして、アウトラインを再作成します。 ユーザーは、国、製品、販売員ごとに売上を表示するシンプルなレポートを簡単に作成できます。 Node クラスの使用 Nodeクラスは、アウトラインツリーの作成と管理に使用できる数多くのメソッドとプロパティを提供します。これらのメソッドやプ ロパティの多くは、標準の TreeView オブジェクトモデルをベースとしているため、ほとんどの開発者が精通しているはずで す。 Node オブジェクトを取得するには、次のいずれかを使用できます。 次のように、Rows.InsertNode メソッドの戻り値を使用します。 C# var node = _flex.Rows.InsertNode(index, level); あるいは、次のように、行の Node プロパティを使用して既存の行のノードを取得できます。 C# var node = _flex.Rows[index].IsNode ? _flex.Rows[index].Node : null; どちらの場合も、Node オブジェクトを取得したら、次のプロパティとメソッドを使用してそれを操作できます。 Level: アウトラインツリーのノードレベルを取得または設定します。 Data: Node.Row と Tree.Column によって定義されたセルの値を取得または設定します。 Image: Node.Row と Tree.Column によって定義されたセルの値を取得または設定します。 Checked: Node.Row と Tree.Column によって定義されたセルのオン/オフ状態を取得または設定します。 Collapsed/Expanded: ノードの縮小/展開状態を取得または設定します。 また、次のメソッドを使用してアウトライン構造を探索することもできます。 GetCellRange(): このノードに属する行の範囲を記述した CellRange オブジェクトを取得します。 Children: このノードの下にある子ノードの数を取得します。 Nodes: このノードの子ノードを格納するノード配列を取得します。 GetNode: このノードと指定の関係(親、最初の子、次の兄弟など)を持つノードを取得します。 上の考察では、グリッドがデータの提供元のデータソースにアタッチされているバインドシナリオに焦点を当てました。非バイン ドシナリオでもツリーとアウトラインを作成できます。この場合は、IsNode プロパティを true に設定することで任意の行をノー ド行に変えることができるため、実質的に、いくらかシンプルになります。 グリッドは、バインドされていない場合は表示されるすべてのデータを所有し、データソースがデータを所有するときにはできな いことを実行できます。たとえば、C1FlexGridで提供されている TreeNode サンプルに示すように、 Move メソッドを使用して ツリーのノードをあちこち移動できます。 非バインドグリッドのノードの使用方法は、通常の TreeView コントロールのノードの使用方法と非常に類似しています。 保存とロード、および印刷 C1FlexGrid コントロールでは、グリッドを保存、ロード、および印刷できるメソッドを用意しています。 テキストファイルの保存とロード SaveGrid メソッドは、グリッドの内容をテキストファイルに保存します。このメソッドの引数には、使用する区切り文字の種類 134 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms (コンマ(,)、タブなど任意の区切り文字)、固定セルを保存するかどうか、あるいはスクロール可能なセルのみを保存するか、 使用するエンコードの種類(ASCII または Unicode など)を指定します。保存されたテキストファイルは、後でコントロールやコ ンマ(,)やタブ区切りされたファイルをサポートする他のアプリケーション(Microsoft Excel など)に再ロードできます。 LoadGridメソッドは、データをテキストファイルからロードします。SaveGrid メソッドまたは他のアプリケーションで作成したテ キストファイルもロードできます。 テキストファイルの形式は非常に単純です。ファイルには、画面に表示されているとおりの書式付きの文字列として保存されま す。セルテキストに引用符号またはセルセパレータ文字が含まれる場合、セルテキストは引用符号で囲まれます。セルテキス トの引用符号文字は二重引用符号のみです。これは、Microsoft Excel テキストファイルでの規則と同じです。 テキストファイルはピクチャや書式情報を含みません。 SaveGrid メソッドは、グリッド全体を保存するか、(スクロール可能な、表示されている、または選択されている)特定の部分の みを保存するかを指定できる flags 引数を持っています。 Microsoft Excel ファイルの保存とロード Ver.2.0からは、SaveGrid と LoadGrid メソッドを使用し、テキストファイルはもちろん、Microsoft Excel ファイル(xls)、および テキストファイルも保存したりロードしたりできるようになりました。これによって、データと共に書式情報も保存できます。 C1FlexGridBase.SaveGrid と C1FlexGridBase.LoadGrid の各メソッドを使用して Excel ファイルを保存およびロードするには、 書式引数を FileFormatEnum.Excel に設定し、これらのメソッドを通常どおり呼び出すだけです。コンピュータに Microsoft Excel がインストールされている必要はありません。 Excel ファイルは、「ワークシート」から成る「ワークブック」を含んでいます。SaveGrid と LoadGrid の各メソッドは常に、1枚の シートから成るブックを保存し、既存のブックの最初のシートをロードします。ロードまたは保存する複数のシートをさらに制御 したい場合、代わりに SaveExcel、LoadExcel、 LoadExcelSheetNames の各メソッドを使用します。Excel ファイルの保存と ロード処理は、行と列のサイズ、フォント、色、書式、およびセル配置など、ほとんどのデータ型と書式情報を変換します。ただ し、すべての書式要素を変換できるわけではありません。たとえば、グリッドは Excel セル内の値をロードしますが、基となる式 はロードしません。イメージやデータマップ、およびセルボーダーなどのその他の特性も変換されません。 データベースからのグリッドのロード データベースからグリッドをロードすることもできます。これは、1つまたは複数のコントロールと基になるデータソースとの間の ライブ接続を維持するデータ連結と異なります。データベースからデータをロードするには、DataReader オブジェクトを次のよ うに使用できます。 Visual Basic コードの書き方 Visual Basic Private Sub _btnData_Click(ByVal sender As Object, ByVal e As System.EventArgs) ' DataReaderを準備します Dim strConn As String = "data source=MYMACHINE;initial catalog=Northwind;" Dim myConn As New SqlConnection(strConn) Dim myCMD As New SqlCommand("SELECT * FROM Employees", myConn) myConn.Open() Dim myReader As SqlDataReader = myCMD.ExecuteReader() ' データベースのスキーマからグリッドの構造を構築します Dim dt As DataTable = myReader.GetSchemaTable() _flex.Cols.Count = 1 Dim dr As DataRow For Each dr In dt.Rows Dim c As Column = _flex.Cols.Add() c.Caption =(c.Name <<= CStr(dr("ColumnName"))) c.DataType = CType(dr("DataType"), Type) Next dr ' グリッドを配置します 135 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms _flex.Rows.Count = 1 Dim row As Integer = 1 Dim cols As Integer = dt.Columns.Count Dim v As Object() = CType(Array.CreateInstance(GetType(Object), cols), Object()) While myReader.Read() myReader.GetValues(v) _flex.AddItem(v, row ++, 1) End While ' クリーンアップ _flex.AutoSizeCols() myReader.Close() myConn.Close() End Sub C# コードの書き方 C# private void _btnData_Click(object sender, System.EventArgs e) { // DataReaderを準備します string strConn = "data source=MYMACHINE;initial catalog=Northwind;"; SqlConnection myConn = new SqlConnection(strConn); SqlCommand myCMD = new SqlCommand("SELECT * FROM Employees", myConn); myConn.Open(); SqlDataReader myReader = myCMD.ExecuteReader(); // データベースのスキーマからグリッドの構造を構築します DataTable dt = myReader.GetSchemaTable(); _flex.Cols.Count = 1; foreach (DataRow dr in dt.Rows) { Column c = _flex.Cols.Add(); c.Caption = c.Name = (string)dr["ColumnName"]; c.DataType = (Type)dr["DataType"]; } // グリッドを配置します _flex.Rows.Count = 1; int row = 1; int cols = dt.Columns.Count; object[] v = (object[])Array.CreateInstance(typeof(object), cols); while (myReader.Read()) { myReader.GetValues(v); _flex.AddItem(v, row++, 1); } // クリーンアップ _flex.AutoSizeCols(); myReader.Close(); myConn.Close(); } グリッドの印刷 136 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms PrintGrid メソッドを使用して、グリッドの内容を印刷します。このメソッドには、拡大縮小(scaling)モード、印刷/印刷プレ ビューダイアログを表示するかどうか、ヘッダやフッタの設定などを選択できる引数があります。 コントロールは、さらにヘッダやフッタに使用するフォントなどの追加の印刷プロパティを提供するPrintParameters プロパ ティ、およびプリンタ、用紙サイズ、用紙方向、余白などを選択するために使用できる .NET Framework の PrintDocument オブジェクトを用いることができます。 次のサンプルコードは、PrintParameters プロパティを使用して用紙方向、マージン、ヘッダおよびフッタのフォントを設定しま す。次に、PrintGrid メソッドを呼び出して、印刷プレビューダイアログを表示します。 Visual Basic コードの書き方 Visual Basic ' グリッドの PrintDocumentオブジェクトを取得します Dim pd As Printing.PrintDocument pd = flex.PrintParameters.PrintDocument() ' ページ設定を行います(用紙方向:横向き 左余白:150) With pd.DefaultPageSettings .Landscape = True .Margins.Left = 150 End With ' ヘッダとフッタのフォントを設定します flex.PrintParameters.HeaderFont = New Font("Arial Black", 14, FontStyle.Bold) flex.PrintParameters.FooterFont = New Font("Arial Narrow", 8, FontStyle.Italic) ' グリッドをプレビューします flex.PrintGrid("VB Tutorial", _ PrintGridFlags.FitToPageWidth + _ PrintGridFlags.ShowPreviewDialog, _ "VB Tutorial" + _ Chr(9) + Chr(9) + Format(DateTime. C# コードの書き方 C# // グリッドの PrintDocumentオブジェクトを取得します System.Drawing.Printing.PrintDocument pd; pd = flex.PrintParameters.PrintDocument; // ページ設定を行います(用紙方向:横向き 左余白:150) pd.DefaultPageSettings.Landscape = true; pd.DefaultPageSettings.Margins.Left = 150; // ヘッダとフッタのフォントを設定します flex.PrintParameters.HeaderFont = new Font("Arial Black", 14, FontStyle.Bold); flex.PrintParameters.FooterFont = new Font("Arial Narrow", 8, FontStyle.Italic); // グリッドをプレビューします flex.PrintGrid("C# Tutorial", PrintGridFlags.FitToPageWidth | PrintGridFlags.ShowPreviewDialog, "C# Tutorial" + (char)(9) + (char)(9) + string.Format("{0:yyyy/MM/dd}", DateTime.Now), (char)(9) + (char)(9) + "Page {0} of {1}"); フィルタリング グリッドにおけるデータのフィルタリングは、通常2つの形式で提供されます。 137 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ヘッダベース ヘッダベース: フィルタが適用された各列上にフィルタアイコンが表示されます。ユーザーはフィルタアイコンのクリック により、フィルタを確認、編集できます。 これは Windows 7/Vista および C1FlexGrid コントロールで使用されているメ カニズムです。このタイプのフィルタの主な利点には、(1)ユーザーが、どの列がフィルタリングされているかがわかるこ と、 (2)フィルタリングが画面上に余分な領域を必要としないこと、(3)より使いやすいフィルタエディタを利用でき、カスタ マイズもより簡単なこと、があります。 行フィルタ: 行フィルタ:行フィルタは常に表示されており、ユーザーがその行に値や式を入力することができます。このタイプのフィ ルタの主な利点は、フィルタリングされている列および現在のフィルタ条件を、ユーザーが常に見ることができる点で す。主な欠点は、フィルタ用のための領域が必要なことと、通常のグリッド操作の邪魔になる可能性があることです。 フィルタ行はC1FlexGrid コントロールには組み込まれていませんが、実装は比較的簡単です。実装方法 は、FilterRow サンプル サンプルで紹介しています。 以下で示すコード例は、製品付属の ColumnFilters サンプル サンプル、および CustomFilters サンプル サンプルから抜粋したものがほとんど です。これらの機能を実行する完全なプロジェクトについては、各サンプルを参照してください。 AllowFilteringプロパティ ヘッダベースのフィルタを実装するために、C1FlexGrid コントロールは、列の移動とサイズ調整の実装に使用されているもの と同じパターンを採用しています。グリッドは、コントロールレベルでフィルタリングを制御する新しいAllowFiltering プロパティ を持ち、グリッドの Column オブジェクトもまた、列レベルでフィルタリングを制御するAllowFiltering プロパティを持っていま す。 簡単なフィルタリングのシナリオを実現するには、ユーザーはグリッドのプロパティを True に設定します。後は、列 のAllowFiltering プロパティの値を変更することで、特定の列に対して、フィルタリングの動作を無効にしたり、カスタマイズし たりできます。列のAllowFiltering プロパティに設定可能な値は以下のとおりです。 Default: グリッドはColumnFilter 型のフィルタを自動的に作成します。このフィルタは後述する ValueFilter と ConditionFilter を合わせたものです。 ByValue: グリッドはValueFilter 型のフィルタを自動的に作成します。このフィルタは、表示すべき値のリストを保持し ます。リスト上にない値は、エンドユーザーには表示されません。 ByCondition: グリッドはConditionFilter 型のフィルタを自動的に作成します。このフィルタでは、”指定の値より大き い”、”指定の値を含む”などといった条件を1つまたは2つ指定します。2つの条件を、AND、ORオペレータで結合する ことも可能です。 Custom: グリッドはフィルタを自動的に作成しません。開発者が、フィルタのインスタンスを作成し、列の Filter プロパ ティに明示的に割り当てる必要があります。 None: 列はフィルタリングされません。. デフォルトでは、C1FlexGrid コントロールは列フィルタエディタをローカライズして、CurrentUICulture 設定で指定された言 語を使用します。しかし、Language プロパティを使用し、デフォルトをオーバーライドして、グリッドが列フィルタエディタを表示 するときに使用される言語を指定できます。 フィルタが適用された列には、マウスポインタを置かなくてもヘッダー上にフィルタアイコンが表示されます。これは ProductName と Quantity 列ヘッダーがフィルタアイコンを表示している画像内に表示されます。 組み込みフィルタが自動ローカライズをサポートする言語は、英語、スペイン語、フランス語、イタリア語、ポルトガル語、ドイツ 語、オランダ語、ロシア語、日本語、ギリシャ語、デンマーク語、フィンランド語、ノルウェー語、スウェーデン語、アラビア語、 ポーランド語、中国語、トルコ語、ペルシア語(ファルシ語)、韓国語、およびヘブライ語です。ローカライズは内蔵されているた め、サテライト dll は不要です。 Value Filter ValueFilter は概念的に非常にシンプルです。値のリストを持ち、リストにあげられた値だけがグリッド上に表示されます。リス トに null が設定されると、フィルタは無効化され、すべての値が表示されます。このタイプのフィルタは、名前や列挙型のよう に別々の値を持つ列のフィルタリングに向いています。 ValueFilter エディタはチェックボックスが付いた値のリストで構成されています。ユーザーは、1度にすべての値をチェックし たり、あるいはチェックをはずしたりすることもできます。長いリストの操作も、高度な組み込みのキーボードナビゲーションを使 138 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms えば簡単です。エディタは、フレキシブルな検索バッファを実装しており、ユーザーが値の一部を入力することで値に位置づけ ることが可能です。たとえば、”Hilton”と入力すると、"New York Hilton"、"Prince Edward Hilton"、 あるいは"Paris Hilton"な ど、"Hilton"を含む次の値が選択されます。また、[Ctrl]+[Up]キーまたは[Ctrl]+[Down]キーを押すと、次のまたは前の チェックされた要素へと移動します。 値は、現在、列に割り当てられた Format を使ってリスト上に表示されます。 注意: 注意:グリッドでフィルタを1つ以上の列に設定する場合、ValueFilterエディタで表示されるフィルタリング値が、前回のフィ ルタが設定された後だけ表示されます この画像は、ValueFilter エディタを表しています。 Condition Filter ConditionFilter はよりフレキシブルです。ユーザーは特定の値を選択する代わりに、“指定の値より大きい”、”指定の値で始 まる”、または”指定の値を含む”といったオペレータを使って、条件を2つまで指定することができます。 このタイプのフィルタは数値や日付/時刻の値のように”連続的な”値を含む列のフィルタリングに向いています。 この画像は、ConditionFilter エディタを表しています。 139 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Custom Filters カスタムフィルタは特殊な値を扱うために作成されます。たとえば、色や地理データ、あるいは独自のデータ型などをフィルタリ ングするのに向いています。 カスタムフィルタを作成するには、開発者は2つのクラスを作成しなくてはなりません。 Filter: このクラスはIC1ColumnFilter インタフェースを実装する必要があり、これにより、特定の値にフィルタを適用 したり、フィルタをリセットしたり、フィルタのパラメータの確認・編集に使用されるエディタを返したりするために使用され るメソッドを指定します。 Filter Editor: このクラスは必ず Control から継承され、 IC1ColumnFilterEditor インタフェースを実装する必要が あり、これにより、エディタを初期化したり、フィルタへの変更を適用したりするために使用されるメソッドを指定します。 製品付属のCustomFilters サンプルでは、Color型、DateTime型、およびString型の値のフィルタリングに使用される3つの カスタムフィルタを実装しています。 プログラムによるフィルタの管理 前述のように、すべての列で列のフィルタリングを有効にするには、グリッドのAllowFiltering プロパティを True に設定する だけで充分です。しかしながら、多くの場合、フィルタリングに対してより細かな制御が必要になることもあります。それは、 個々の列において、AllowFilteringプロパティと Filter プロパティを変更することで実現できます。 たとえば、以下のコードではフィルタリングを有効にしていますが、String 型の列でのフィルタリングは禁止しています。 Visual Basic コードの書き方 VisualBasic ' グリッドのフィルタリングを有効にします。 _flex.AllowFiltering = True ' string 型の列はフィルタリングを禁止します。 140 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms For Each c As Column In _flex.Cols If c.DataType Is GetType(String) Then c.AllowFiltering = AllowFiltering.None Else c.AllowFiltering = AllowFiltering.Default End If Next C# コードの書き方 C# // グリッドのフィルタリングを有効にします。 _flex.AllowFiltering = true; // string 型の列はフィルタリングを禁止します。 foreach (Column c in _flex.Cols) { c.AllowFiltering = c.DataType == typeof(string) ? AllowFiltering.Default : AllowFiltering.None; } フィルタを作成して列に割り当てるか、または既存のフィルタを取得して各種プロパティを変更することにより、フィルタリングの 処理をさらにカスタマイズすることができます。たとえば、以下のコードでは、 ConditionFilterを作成して”C”の文字で始まる すべての要素を選択するように構成し、その後で新しいフィルタを ProductName 列に割り当てています。 Visual Basic コードの書き方 VisualBasi ' グリッドのフィルタリングを有効にします。 __flex.AllowFiltering = True ' 新しいConditionFilterを作成します。 Dim Filter = New ConditionFilter() ' "C"で始まる要素を選択するフィルタを構成します。 Filter.Condition1.Operator = ConditionOperator.BeginsWith Filter.Condition1.Parameter = "C" ' 新しいフィルタを"ProductName"列に割り当てます。 _flex.Cols("ProductName").Filter = Filter C# コードの書き方 C# // グリッドのフィルタリングを有効にします。 _flex.AllowFiltering = True ' 新しいConditionFilterを作成します。 ConditionFilter filter = new ConditionFilter(); // "C"で始まる要素を選択するフィルタを構成します。 filter.Condition1.Operator = ConditionOperator.BeginsWith; filter.Condition1.Parameter = "C"; 141 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // 新しいフィルタを"ProductName"列に割り当てます。 _flexCustom.Cols["ProductName"].Filter = filter; プログラムによるフィルタの適用 フィルタは、ユーザーがフィルタを編集したときに適用されます。データが変更された時点では、フィルタは自動的に適用されま せん。フィルタを現在グリッドにロードされているデータに適用するには、グリッドの ApplyFilters メソッドを呼び出します。 たとえば、以下のコードでは、ユーザーがグリッド上のデータを編集するときに、<適用>ボタンを有効にしています。<適用>ボ タンをクリックすることで、フィルタを適用し、次の変更までボタンを無効にします。 Visual Basic コードの書き方 Visual Basic public Sub New() { InitializeComponent() ' データを取得します。 Dim da = New OleDbDataAdapter("select * from products", GetConnectionString()) Dim dtProducts = New DataTable() da.Fill(dtProducts) ' グリッドにデータを連結します。 _flex.DataSource = dtProducts ' グリッドのフィルタリングを有効にします。 _flex.AllowFiltering = true ' <適用>ボタンを有効にするために、変更を監視します。 AddHandler _flex.AfterEdit, AddressOf _flex_AfterEdit AddHandler _btnApplyFilters.Click, AddressOf _btnApplyFilters_Click End sub C# コードの書き方 C# public Form1() { InitializeComponent(); // データを取得します。 var da = new OleDbDataAdapter("select * from products", GetConnectionString()); var dtProducts = new DataTable(); da.Fill(dtProducts); // グリッドにデータを連結します. _flex.DataSource = dtProducts; // グリッドのフィルタリングを有効にします。 _flex.AllowFiltering = true; // <適用>ボタンを有効にするために、変更を監視します。 _flex.AfterEdit += _flex_AfterEdit; } 142 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 上記のコードでは、グリッドをデータソースに連結し、 AllowFiltering プロパティを True に設定することでフィルタリングを有 効にし、AfterEditイベントにイベントハンドラを関連付けています。このイベントハンドラの実装は下記のようになります。 Visual Basic コードの書き方 Visual Basic Private Sub _flex_AfterEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Dim c As C1.Win.C1FlexGrid.Column For Each c In _flex.Cols If Not (c.ActiveFilter Is Nothing) Then _btnApplyFilters.Enabled = True End If Next c End Sub C# コードの書き方 C# void _flex_AfterEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { foreach (C1.Win.C1FlexGrid.Column c in _flex.Cols) { if (c.ActiveFilter != null) { _btnApplyFilters.Enabled = true; break; } } } このコードは、すべての列をスキャンして、列にフィルタが定義されているかどうかを判断します。アクティブなフィルタが捕捉さ れると、コードが現在のデータに対してフィルタを適用するボタンを有効にします。ボタンがクリックされると、以下のイベントラ を実行します。 Visual Basic コードの書き方 Visual Basic Private Sub _btnApplyFilters_Click(ByVal sender As Object, ByVal e As System.EventArgs) _flex.ApplyFilters() _btnApplyFilters.Enabled = False End sub C# コードの書き方 C# private void _btnApplyFilters_Click(object sender, EventArgs e) { _flex.ApplyFilters(); _btnApplyFilters.Enabled = false; } 143 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms コードは単純に、すべてのアクティブなフィルタを適用し、次の変更までボタンを無効にします。ボタンのクリックを取得する代 わりに編集後に毎回、フィルタを適用したい場合、以下のようにAfterEdit イベントハンドラから直接ApplyFilter を呼び出す こともできます。 Visual Basic コードの書き方 Visual Basic Pivate Sub _flex_AfterEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) 'フィルタを適用します。 _flex.ApplyFilters() End Sub C# コードの書き方 C# private void _flex_AfterEdit(object sender, RowColEventArgs e) { // フィルタを適用します。 _flex.ApplyFilters(); } フィルタ動作のカスタマイズ フィルタが適用されると、グリッドは行の Visible プロパティを False に設定して行を非表示にします。しかし、フィルタリング動 作をカスタマイズできるように、グリッドは、BeforeFilter イベントとAfterFilterイベントを発生させます。たとえば、行を表示/非 表示する代わりに、どの行がフィルタを通過したか、あるいは通過しなかったかを示す個別のスタイルを適用したいとします。 これは、コードにより簡単に実現できます。 Visual Basic コードの書き方 Visual Basic Public Sub New() InitializeComponent() ' グリッドを設定します。 _flex.AllowFiltering = True _flex.DataSource = dtInvoices ' フィルタで除外された行のスタイルを作成します。 Dim cs = _flex.Styles.Add("filteredOut") cs.BackColor = Color.LightSalmon cs.ForeColor = Color.DarkOrange ' イベントハンドラを関連付けます。 AddHandler _flex.BeforeFilter, AddressOf _flex_BeforeFilter AddHandler _flex.AfterFilter, AddressOf _flex_AfterFilter End Sub C# コードの書き方 C# public Form1() { 144 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms InitializeComponent(); // グリッドを設定します。 _flex.AllowFiltering = true; _flex.DataSource = dtInvoices; // フィルタで除外された行のスタイルを作成します。 var cs = _flexStyles.Styles.Add("filteredOut"); cs.BackColor = Color.LightSalmon; cs.ForeColor = Color.DarkOrange; // イベントハンドラを関連付けます。 _flex.BeforeFilter += _flex_BeforeFilter; _flex.AfterFilter += _flex_AfterFilter; } このコードは、フィルタを通過しなかった行を表すのに(それらを非表示にする代わりに)使用されるカスタムスタイルを作成し ます。次に、BeforeFilter イベントとAfterFilterイベントにイベントハンドラをアタッチします。イベントハンドラのコードは以下の ようになります。 Visual Basic コードの書き方 Visual Basic ' フィルタが適用される前に描画を保留します。 Private Sub _flex_BeforeFilter(ByVal sender As Object, ByVal e As CancelEventArgs) _flex.BeginUpdate() End Sub ' フィルタの適用後にスタイルを適用します。 Private Sub _flex_AfterFilter(ByVal sender As Object, ByVal e As EventArgs) ' フィルタで除外された行を表すスタイルを取得します。 Dim cs = _flexStyles.Styles("filteredOut") ' すべての行にスタイルを適用します。 Dim r As Integer For r = _flex.Rows.Fixed To _flex.Rows.Count - 1 Dim Row = _flex.Rows(r) If (Row.Visible) Then ' 通常の行:スタイルをリセット Row.Style = Nothing Else ' フィルタで除外された行:表示してスタイルを設定 Row.Visible = True Row.Style = cs End If Next ' 更新を再開します。 _flex.EndUpdate() End Sub C# コードの書き方 C# // フィルタが適用される前に描画を保留します。 private void _flex_BeforeFilter(object sender, CancelEventArgs e) 145 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms { _flexStyles.BeginUpdate(); } // フィルタの適用後にスタイルを適用します。 private void _flexStyles_AfterFilter(object sender, EventArgs e) { // フィルタで除外された行を表すスタイルを取得します。 var cs = _flex.Styles["filteredOut"]; // すべての行にスタイルを適用します for (int r = _flexStyles.Rows.Fixed; r < _flexStyles.Rows.Count; r++) { var row = _flexStyles.Rows[r]; if (row.Visible) { // 通常の行:スタイルをリセット row.Style = null; } else { // フィルタで除外された行:表示してスタイルを設定 row.Visible = true; row.Style = cs; } } // 更新を再開します。 _flexStyles.EndUpdate(); } BeforeFilterイベントハンドラは、本バージョンで追加されたBeginUpdate メソッドを呼び出し、フィルタで除外された行にカスタ ムスタイルが適用されるまで、グリッド自身が再描画されるのを抑制します。 AfterFilter イベントハンドラははじめに、フィルタで除外された行を表すために作成したスタイルを取得します。それからグリッ ドの行をスキャンして、Visible プロパティが False に設定されているすべての行に対して新しいスタイルを適用します。これら が、フィルタによって非表示にされていた行です。この処理が終わると、コードはEndUpdateメソッドを呼び出し、グリッドの更 新を再開します。 フィルタリングUIのカスタマイズ デフォルトのフィルタリングの動作とUIは、列のフィルタリングに関わる大多数のシナリオに対応していると思いますが、列フィ ルタのクラスを独立的に使用し、独自のユーザーインタフェースを実装することも可能です。 たとえば、以下のコードは、ConditionFilter クラスを使用して iTunes スタイルのサーチボックスをC1FlexGrid に実装する方 法を示しています。このタイプの検索では、ユーザーはある値を入力すると、自動的にグリッドの行をフィルタリングして、いず れかの列に検索文字列を含む行を表示します。 iTunesスタイルの検索の実装は、フィルタのパラメータとして使用されるテキストを含むテキストボックスからはじめます。ユー ザーがテキストボックスでタイピングをやめた1/2ミリ秒後にフィルタが適用されるように、Timer コントロールも定義します。 Visual Basic コードの書き方 Visual Basic 146 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms public Sub New() InitializeComponent() ' ユーザーがサーチボックスへのタイピングをやめた1/2秒後に ' フィルタを適用するようタイマーを構成します。 _timer.Interval = 500 AddHandler _timer.Tick, AddressOf t_Tick ' サーチボックスの変更を監視します。 AddHandler _txtSearch.TextChanged, AddressOf _txtSearch_TextChanged End Sub ' サーチボックスのテキストの変更時、タイマーを再開します。 Private Sub _txtSearch_TextChanged(ByVal sender As Object, ByVal e As EventArgs) _timer.Stop() _timer.Start() End Sub C# コードの書き方 C# public Form1() { InitializeComponent(); // ユーザーがサーチボックスへのタイピングをやめた1/2秒後に // フィルタを適用するようタイマーを構成します。 _timer.Interval = 500; _timer.Tick += t_Tick; // サーチボックスの変更を監視します。 _txtSearch.TextChanged += _txtSearch_TextChanged; } // サーチボックスのテキストの変更時、タイマーを再開します。 void _txtSearch_TextChanged(object sender, EventArgs e) { _timer.Stop(); _timer.Start(); } これでタイマーは構成できたので、あとは、タイマー作動時にフィルタを作成して適用するだけです。 Visual Basic コードの書き方 Visual Basic ' タイマー作動時にフィルタを適用します。 Private Sub _t_Tick(ByVal sender As Object, ByVal e As EventArgs) ' ひとまず終了... _timer.Stop() ' フィルタを構成します。 filter As New ConditionFilter() filter.Condition1.Operator = C1.Win.C1FlexGrid.ConditionOperator.Contains filter.Condition1.Parameter = _txtSearch.Text ' フィルタを適用します。 _flex.BeginUpdate() 147 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms For r As Integer = _flexSearch.Rows.Fixed To _flexSearch.Rows.Count - 1 Dim visible As Boolean = False For c As Integer = _flexSearch.Cols.Fixed To _flexSearch.Cols.Count - 1 If _searchFilter.Apply(_flexSearch(r, c)) Then visible = True count += 1 Exit For End If Next _flex.Rows(r).Visible = visible Next _flex.EndUpdate() End Sub C# コードの書き方 C# // タイマー作動時にフィルタを適用します。 void t_Tick(object sender, EventArgs e) { // ひとまず終了... _timer.Stop(); // フィルタを構成します。 var filter = new C1.Win.C1FlexGrid.ConditionFilter(); filter.Condition1.Operator = C1.Win.C1FlexGrid.ConditionOperator.Contains; filter.Condition1.Parameter = _txtSearch.Text; // フィルタを適用します。 _flex.BeginUpdate(); for (int r = _flex.Rows.Fixed; r < _flex.Rows.Count; r++) { bool visible = false; for (int c = _flex.Cols.Fixed; c < _flex.Cols.Count; c++) { if (filter.Apply(_flex[r, c])) { visible = true; break; } } _flex.Rows[r].Visible = visible; } _flex.EndUpdate(); } プロパティグループ C1FlexGrid コントロールには、数多くのプロパティ、メソッド、およびイベントが用意されています。コントロールを効率的に使 用するために、これらのすべてを把握しておく必要はありません。 ここでは、これらのうち最も重要なプロパティ、メソッド、およびイベントを用途別にまとめます。複数のグループに重複してリス トされている要素もあります。それぞれの詳細については、リファレンスの項を参照してください。 1. グリッドのレイアウト 148 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Rows, Cols, AutoSizeCols, ScrollBars, ScrollBarsVisible, ScrollOptions 2. カーソルとセル範囲の選 SelectionMode, Select, ShowCell, Row, Col, RowSel, ColSel, Selection, MouseRow, MouseCol, BeforeRowColChange, AfterRowColChange, BeforeSelChange, AfterSelChange, KeyActionTab, KeyActionEnter 3. 編集 AllowEditing, ComboList, EditMask, BeforeEdit, StartEdit, ValidateEdit, AfterEdit, StartEditing, FinishEditing, Editor, CellButtonClick, KeyDownEdit, KeyPressEdit, KeyUpEdit, ChangeEdit 4. セル値の設定と参照 Item (インデクサ), GetData, GetDataDisplay, SetData, GetCellRange, GetCellImage, SetCellImage, Clip, FindRow, Aggregate, CellChanged 5. ユーザーインタフェース AllowEditing, AllowMerging, AllowResizing, AllowDragging, AllowFiltering, AllowSorting, BeforeSort, AfterSort, AutoSearch, AutoSearchDelay, BeforeDragColumn, AfterDragColumn, BeforeDragRow, AfterDragRow, BeforeResizeColumn, AfterResizeColumn, BeforeResizeRow, AfterResizeRow, ShowScrollTip 6. アウトラインとデータのグループ化 Subtotal, Tree, IsNode, Level, Collapsed, BeforeCollapse, AfterCollapse 7. セルのマージ AllowMerging 8. データ連結 DataSource, DataMember, AfterDataRefresh, AutoResize, GridError 9. グリッドの保存、ロード、印刷 LoadGrid, SaveGrid, LoadExcel, SaveExcel, ClipSeparators, PrintGrid 10. ドラッグ&ドロップ DragMode, DropMode, BeforeMouseDown 11. フィルタリング 149 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms データ連結 データ連結のプロセスによって、1人または複数のデータユーザーが単一のデータプロバイダに同時接続することが可能にな ります。データ連結したグリッド上でカーソルを動かすと、同じデータソースに接続されている他のコントロールも変更されて新 しいカレントレコードを反映します。データ連結したグリッドの値を編集すると、同じデータソースに接続されている他のコント ロールも変更されて新しい値を反映します。 C1FlexGridは、ADO.NET データソースオブジェクト(DataTable、 、DataView、 、DataSet、 、DataViewManagerなど)へのデー タ連結をサポートします。 グリッドをデータソースに連結するには、データソースオブジェクトをグリッドの DataSource プロパティに設定します。データ ソースオブジェクトが複数のテーブルを持っている場合は、使用テーブルを指定する文字列を DataMember プロパティに設 定する必要があります。 あるいは、SetDataBinding メソッドを1回呼び出せば両方のプロパティを同時に設定することもできます。 新しいデータソースをグリッドに割り当てると、グリッドは自動的にその列を更新してデータソース内で使用可能な列に連結し ます。次に、移動、表示/非表示、削除などの各操作を行って列をカスタマイズできます。また、Width、EditMask、Format などの各列プロパティを設定することもできます。 注意: 注意:データソースへの連結後にグリッド列を並べ替える例については、製品付属の「ColumnOrder サンプル」を参照し てください。 データソースオブジェクトの作成の詳細については、.NET Framework のマニュアルを参照してください。 データソースへの連結 コード行を記述しなくても、Visual Studio のデータソース構成ウィザード データソース構成ウィザード を使用すると C1FlexGrid をデータソースに簡単に連 データソースに簡単に連 結できます。ウィザードにアクセスする方法には2つあり、プロパティウィンドウの DataSource プロパティを使用する か、C1FlexGrid タスク メニューの[データソースの選択]ボックスを使用します。C1FlexGrid タスク タスクメニューの詳細について は、「C1FlexGrid タスク」を参照してください。 プロパティウィンドウの DataSource プロパティの横のドロップダウン矢印、またはC1FlexGrid タスク タスクメニューの[データソース データソース の選択 の選択]ボックスをクリックすると、使用可能なデータソースのリストから選択したりプロジェクトにデータソースを追加したりでき ます。プロジェクトにデータソースを追加するには、〈プロジェクトにデータソースを追加 プロジェクトにデータソースを追加〉をクリックし、[データソース構成ウィ データソース構成ウィ ザード ザード]を開きます。 150 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms データソース構成ウィザード データソース構成ウィザードでは、手順に従ってデータソースの追加を体験します。[データソースの種類を選択 データソースの種類を選択]ページでは、 情報の収集元となるアプリケーションの種類を選択できます。デフォルト選択は[データベース データベース]です。 151 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms [データ接続の選択]ページで、データベースの場所を指定できます。まだデータベースに接続していない場合、〈新しい接続 新しい接続〉 ボタンをクリックして新しい接続を指定できます。〈新しい接続 新しい接続〉ボタンをクリックすると、[接続の追加 接続の追加]ダイアログボックスが開 きます。ここで、データベースの場所を参照して接続をテストできます。 152 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms このウィザードは、[接続文字列をアプリケーション構成ファイルに保存する 接続文字列をアプリケーション構成ファイルに保存する]ページで、接続を保存して名前を付けます。この ページで、名前を指定するか、ウィザードで提供されるデフォルトを使用できます。 153 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms [データベースオブジェクトの選択 データベースオブジェクトの選択]ページで、データセットに含めるテーブルとフィールドを指定できます。また、データセットの 名前を提供するか、ウィザードで提供されるデフォルトを使用することもできます。 154 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ウィザードは、DataSet、BindingSource、TableAdapter を作成し、それらをプロジェクトに追加します。フォームをダブルクリッ クすると、Form_Load イベントにデータベースを記述するコードが自動的に生成されていることもわかります。 データの取得と設定 C1FlexGrid は、連結モードと非連結モードのどちらの方法も使用できます。連結モードでは、グリッドはデータソースに接続さ れ、グリッドに表示されるすべてのデータはデータソースから取得します。このモードでは、グリッド上のデータを変更すると元 のデータソースのデータも変更されます。非連結モードでは、グリッドはグリッド独自のデータソースを管理します。 連結モードと非連結モードのどちらの場合も、C1FlexGrid 内のデータに最も簡単にアクセスするために、Row と Columnの 各インデクサを使用します。このインデクサで、取得または設定対象のデータが格納されている行または列内のセルを指定で きます。たとえば、次のサンプルコードは、グリッドの2行目のデータを選択します。 Visual Basic コードの書き方 Visual Basic flex.Rows(2).Selected = True C# コードの書き方 C# 155 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.Rows[2].Selected = true; 連結モードと非連結モードのどちらの場合も、C1FlexGrid のデータに最も簡単にアクセスするには、 Item プロパティを使用 します。このプロパティは行および列インデックスを取り込み、セルに格納されているデータを取得または設定するインデクサ として使用できます(列名をインデックスとして使用することもできます)。たとえば、次のサンプルコードは、グリッドの最初の列 に行番号を格納します。 Visual Basic コードの書き方 Visual Basic For r As Integer= flex.Rows.Fixed To flex.Rows.Count - 1 flex(r, 0) = r Next C# コードの書き方 C# for (int r = flex.Rows.Fixed; r <= flex.Rows.Count r++) { flex[r, 0] = r; } 値をセルに格納すると、グリッドはその値を列に指定されている DataType に変換しようとします。変換できない場合、グリッド は GridError イベントを発生させてセルを変更しません。SetData メソッドを使用して coerce 引数を False に設定すると、こ の動作を変更できます。 インデックスを使用してデータを取得するとき、グリッドはセルに格納されている実データを返します。書式付きのデータ(グリッ ドがユーザーが見えるように表示しているデータ)を含む文字列を取得するには、GetDataDisplay メソッドを使用します。 また、Clip プロパティを使用して、セル範囲の内容を設定または取得することもできます。このプロパティは特に、クリップボー ドやドラッグ&ドロップ操作を処理する場合に便利です。デフォルトでは Clip プロパティは、セル間をタブ文字(Chr(9))で区 切った文字列を返し、行と行の間には復帰文字(Chr(13))を返します。別の区切り文字を使用するには、ClipSeparatorsプロ パティを変更します。 CellRange オブジェクトでは、任意のセル範囲の内容を設定したり取得することができます。 156 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms チュートリアル 以下の各チュートリアルでは、C1FlexGrid コントロールのいくつかの主要機能を説明します。チュートリアルごとに、いくつか の簡単なプロジェクトの作成を通して各手順を詳しく説明します。また、製品には、より複雑なサンプルプログラムが収録され ており、参考として使用できます。 各チュートリアルの内容は次のとおりです。 チュートリアル 説明 Edit チュートリアル 基本的なデータ入力グリッドからスタートし、このチュートリアルでは、データの書式設定、チェック ボックス、ドロップダウンリスト、入力マスク、データの正当性検査、およびクリップボードへの対応 を実装します。 Outline チュートリアル C1FlexGrid をアウトライナとして使用し、構造化(階層)データを表示します。 Data Analysis チュート リアル さまざまな製品、地域、販売員の売上データを含むグリッドからスタートし、このチュートリアルでは 動的なレイアウト(列の順序)、自動ソート、セルマージ、自動小計行、アウトラインを実装します。 Edit チュートリアル このチュートリアルでは、基本的なデータ入力グリッドから始め、次のような機能を追加します。 1. 2. 3. 4. 5. 6. データの書式設定 チェックボックス ドロップダウンリスト 複雑なデータの正当性検査 クリップボードへの対応 カスタムエディタ これらの機能を追加した最終的なアプリケーションの外観は次のようになります。 手順1: コントロールの作成 新規にプロジェクトを作成します。ツールボックスの C1FlexGrid アイコンをクリックしてからフォーム上をクリックし、オブジェク トが適切なサイズになるまで C1FlexGrid コントロールをドラッグしてフォームに追加してください。 1. Visual Studio のプロパティウィンドウを使用し、C1FlexGrid コントロールのプロパティを下記のように設定します。 157 プロパティ 設定 (Name) fg Dock Fill Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms プロパティ 設定 Cols.Count 5 Cols.Fixed 0 2. フォームのキャプション部分をダブルクリックし、コードウィンドウを開きます。ファイルの一番上に、次のステートメントを 追加します。 Visual Basic コードの書き方 Visual Basic Imports C1.Win.C1FlexGrid C# コードの書き方 C# using C1.Win.C1FlexGrid; これによって、C1FlexGrid アセンブリで定義されているオブジェクトを、名前空間の一部だけを使ってプロジェクト内で 参照でき、入力の手間を省くことができます。 3. [Column タスク タスク]メニューまたは[FlexGrid 列エディタ 列エディタ]からデザイナを使用するか、コードによって以下のコードを入 力(またはコピー またはコピー)し、列を設定します。 デザイナの場合 グリッドの1番目の列を選択します。列の[Column タスク タスク]メニューが開きます。 [列キャプション]と[データフィールド]の各ボックスに「製品」と入力します。 残りの列の[列キャプション 列キャプション]と[データフィールド データフィールド]の各ボックスを以下のように設定します。 Column1 Column 地域 列キャプション データフィール ド 地域 Column 2 Column 販売員 列キャプション データフィール ド 販売員 Column 3 Column 売上 列キャプション データフィール ド 売上 Column 4 Column 158 ボーナス Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Column1 列キャプション データフィール ド ボーナス また、列は、以下のように[FlexGrid 列エディタ 列エディタ]から設定することもできます。 [C1FlexGrid タスク タスク]メニューの〈列エディタ 列エディタ〉をクリックし、[FlexGrid 列エディタ 列エディタ]を開きます。[FlexGrid 列エディタ 列エディタ]へ のアクセス方法の詳細については、18:28 2012/12/17列エディタにアクセス を参照してください。 右ペインで、列0を選択します。 左ペインで、Caption と Name の各プロパティを「製品 製品」に設定します。 残りの列の Caption と Name の各プロパティを以下のように設定します。 Column 1 Name 地域 Caption 地域 Column 2 Name 販売員 Caption 販売員 Column 3 Name 売上 Caption 売上 Column 4 159 Name ボーナス Caption ボーナス Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 設定が終わったら〈OK〉をクリックしてエディタを閉じます。 コードの場合 Form_Load イベントに次のコードを追加します。 Visual Basic コードの書き方 Visual Basic ' 列を設定します。 Dim cols As String = "製品|地域|販売員|売上 Dim colNames As String() = cols.Split("|") Dim i%For i = 0 To fg.Cols.Count - 1 fg(0, i) = colNames(i) fg.Cols(i).Name = colNames(i)Next C# コードの書き方 C# // 列を設定します。 string cols = "Product|Region|Salesperson|Sales|Bonus"; string[] colNames = cols.Split(new char[] { '|' }); for (int i = 0; i <= this.fg.Cols.Count - 1; i++) { fg[0, i] = colNames[i]; fg.Cols[i].Name = colNames[i]; } プログラムの実行と検証: 第1段階はこれで完了です。[F5]キーを押してプロジェクトを実行すると、コントロールにデータを入力できます。直接文字を入 力することも、[F2]キーまたは[Space]キーを押して既存の項目を修正することもできます。 手順2: 列タイプとデータの書式設定 数値やデータ値をグリッドに表示するときは通常、それらの値を一定の書式にしたがって整然と表示する必要がありま す。C1FlexGrid コントロールでは、各列の DataType および Format の各プロパティを指定することでこれらを実現できま す。これらのプロパティは、デザイナでもコードでも設定できます。 デザイナの場合 160 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 1. 2. 3. 4. グリッドの「売上」列を選択します。「売上」列の[Column タスク タスク]メニューが開きます。 [データ型 データ型]ボックスを Decimal に設定します。 [書式設定 書式設定]ボックスの〈...〉ボタンをクリックし、[書式文字列 書式文字列]ダイアログボックスを開きます。 [形式の種類 形式の種類]で通貨を選択し、[小数点以下表示桁数 小数点以下表示桁数] を 0 にします。 5. 〈OK〉をクリックし、[書式文字列 書式文字列]ダイアログを閉じます。 6. グリッドの「ボーナス」列を選択します。「ボーナス」列の[Column タスク タスク]メニューが開きます。 7. [データ型 データ型]ボックスを Boolean に設定します。 また、DataType と Format の各プロパティは、以下のように[FlexGrid 列エディタ 列エディタ]から設定することもできます。 1. [C1FlexGrid タスク タスク]メニューの〈列エディタ 列エディタ〉を選択し、[FlexGrid 列エディタ 列エディタ]を開きます。[FlexGrid 列エディタ 列エディタ]への アクセス方法の詳細については、列エディタ を参照してください。 2. 右ペインの「売上」列を選択します。 3. DataType プロパティを Decimal に設定します。 4. Format プロパティの横の〈...〉ボタンをクリックします。[書式文字列 書式文字列]ダイアログボックスが開きます。 161 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 5. 6. 7. 8. [形式の種類]で通貨を選択し、[小数点以下表示桁数 小数点以下表示桁数] を 0 にします。 〈OK〉をクリックし、[書式文字列 書式文字列]ダイアログを閉じます。 右ペインの「ボーナス」列を選択します。 DataType プロパティを Boolean に設定します。 9. 〈OK〉をクリックし、エディタを閉じます。 コードの場合 列の DataType と Format を指定するには、Edit チュートリアルの 手順1:コントロールの作成 で追加されたコードの後ろ に、以下のコードを追加します。 162 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic ' 列のDataTypeとFormatプロパティを指定します。 Dim c As Column = fg.Cols("売上") c.DataType = GetType(Decimal) c.Format = "c"' << currency(通貨) c = fg.Cols("ボーナス") c.DataType = GetType(Boolean) c.ImageAlign = ImageAlignEnum.CenterCenter C# コードの書き方 C# // 列のDataTypeとFormatプロパティを指定します。 Column c = fg.Cols["売上"]; c.DataType = typeof(Decimal); c.Format = "c"; // << currency(通貨) c = fg.Cols["ボーナス"]; c.DataType = typeof(bool); c.ImageAlign = ImageAlignEnum.CenterCenter; プログラムの実行と検証: 追加したコードは、「売上」列に通貨型の値の格納と表示、「ボーナス」列にブール値が入力できるように書式設定します。 この段階でプロジェクトを実行すると、グリッドが「売上」列で数値以外の入力を受け付けないことがわかります。「ボーナス」列 は、チェックボックスで値を表示し、マウスまたはキーボードでON/OFFを切り替えることができます。これは、ブール値の列 のデフォルトの動作です。 注意: 注意:Format プロパティは、データには決して影響せず、表示方法に影響するだけであることに注意してください。 手順3: ドロップダウンリスト データの入力は、冗長で誤りの生じやすい操作です。その点ドロップダウンリストを使うと、入力は最小限で済み、間違いの生 じる可能性も減らすことができます。さらにデータの整合性も増します。 説明をわかりやすくするために、このサンプルプロジェクトでは3つの製品(テレビ、冷蔵庫、洗濯機)、4つの地区(北、南、西、 163 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 東)、3人の常勤販売員(鈴木、佐藤、田中)の情報だけを扱うことにします。 C1FlexGrid 内で、これらのリストをドロップダウンとして使用するには、リストごとに各項目を含む文字列(パイプ文字(|)で区 切る)を作成し、それらを各列の ComboList に設定するだけです。このプロパティは、デザイナでもコードでも設定できます。 デザイナの場合 1. 「製品」列を選択します。「製品」列の[Column タスク タスク]メニューが開きます。 2. [コンボリスト ンボリスト]ボックスの〈...〉ボタンをクリックし、[コンボリスト コンボリスト]ダイアログボックスを開きます。 3. 以下のように、テレビ テレビ、冷蔵庫 冷蔵庫、洗濯機 洗濯機と入力します。 4. 5. 6. 7. 8. 9. 10. 11. 164 〈OK〉をクリックし、[コンボリスト コンボリスト]ダイアログを閉じます。 「地域」列を選択します。 [コンボリスト コンボリスト]ボックスの〈...〉ボタンをクリックします。 以下のように、北、南、東、西 北、南、東、西と入力します。 〈OK〉をクリックします。 「販売員」列を選択します。 [コンボリスト コンボリスト]ボックスの〈...〉ボタンをクリックします。 以下のように、鈴木、田中、佐藤 鈴木、田中、佐藤と入力し、[ドロップダウンコンボ ドロップダウンコンボ]オプションを選択します。 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 12. 〈OK〉をクリックします。 また、ComboList プロパティは、以下のように[FlexGrid 列エディタ 列エディタ]を使用して設定することもできます。 1. [C1FlexGrid タスク タスク]メニューの〈列エディタ 列エディタ〉を選択し、[FlexGrid 列エディタ 列エディタ]を開きます。[FlexGrid 列エディタ]への アクセス方法の詳細については、列エディタ を参照してください。 2. 右ペインの「製品」列を選択します。 3. 左ペインで、ComboList プロパティを テレビ|冷蔵庫 蔵庫|洗濯機 洗濯機に設定します。 4. 5. 6. 7. 8. 165 右ペインの「地域」列を選択します。 左ペインで、ComboList プロパティを北 北|南 南|東 東|西 西に設定します。 右ペインの「販売員」列を選択します。 左ペインで、ComboList プロパティを |鈴木 鈴木|佐藤 佐藤|田中 田中に設定します。 〈OK〉をクリックし、エディタを閉じます。 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms コードの場合 コンボリストを追加するには、手順2:列タイプとデータの書式設定 で追加されたコードの後ろに、以下のコードを追加します。 Visual Basic コードの書き方 Visual Basic ' ドロップダウンリストを設定します。 fg.Cols("製品").ComboList = "テレビ|冷蔵庫|洗濯機" fg.Cols("地域").ComboList = "北|南|東|西" fg.Cols("販売員").ComboList = "|鈴木|佐藤|田中" C# コードの書き C# // ドロップダウンリストを設定します。 fg.Cols["製品"].ComboList = "テレビ|冷蔵庫|洗濯機"; fg.Cols["地域"].ComboList = "北|南|東|西"; fg.Cols["販売員"].ComboList = "|鈴木|佐藤|田中"; プログラムの実行と検証: 最後の ComboList 文字列だけがパイプで始まっていることに注目してください。これによって、ユーザーはリストにない名前 を入力することができます。別の言い方をすれば、単純なドロップダウンリストと異なり、これらの値はドロップダウンコンボボッ クスを使って編集できるということです。 [F5]キーを押してプロジェクトを再実行し、カーソルを動かしてみてください。コンボリストが設定されているセル上にカーソル を置くと、ドロップダウンボタンが現れます。そのボタンをクリックするとリストが表示され、項目の頭文字を入力するとリスト内 でその項目がハイライト表示されます。 手順4: データの正当性検査 データ型をグリッド列に設定すると、グリッドは確実に適切な型のデータだけをその列に格納します。これによってエラーの発 生を防げますが、入力したデータが正しいことを確実にするために、さらに厳密な正当性検査が必要になる場合がよくありま す。その場合、ValidateEdit を使用する必要があります。 たとえば、独占禁止法によって北地区でのテレビの販売が禁止されている場合について考えてください。データ入力ミスと費 用のかさむ訴訟を避けるために、ユーザーがこの組み合わせをコントロールに入力できないようにする必要があります。 次のサンプルコードは、セルの編集のたびにデータを調べて、無効な入力がないようにします。 166 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub fg_ValidateEdit(ByVal sender As Object, ByVal e As C1FlexGrid.ValidateEditEventArgs) Handles fg.ValidateEdit Dim rgn As String = "" Dim prd As String = "" ' 正当性検査に必要なデータを取得します。 Select Case e.Col Case 0 prd = fg.Editor.Text rgn = fg(e.Row, "地域") Case 1 prd = fg(e.Row, "製品") rgn = fg.Editor.Text End Select ' 北地区でのテレビの販売は行えません。 If prd = "テレビ" And rgn = "北" Then MsgBox("警告: 規制 #12333AS/SDA-23 " & _ prd & "を" & rgn & "地区で販売できません。") e.Cancel = True End If End Sub C# コードの書き C# private void fg_ValidateEdit( object sender, C1.Win.C1FlexGrid.ValidateEditEventArgs e) { object rgn = null; object prd = null; // 正当性検査に必要なデータを取得します。 switch (e.Col) { case 0: prd = fg.Editor.Text; rgn = fg.GetData(e.Row, "地域"); break; case 1: prd = fg.GetData(e.Row, "製品"); rgn = fg.Editor.Text; break; } // 北地区でのテレビの販売は行えません。 If(((string) prd == "テレビ") && ((string)rgn == "北" )) { MessageBox.Show("警告: 規制 #12333AS/SDA-23 " + 167 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms prd + "を" + rgn + "地区で販売できません。"); e.Cancel = true; } } プログラムの実行と検証: このルーチンはまず、正当性検査をする必要がある入力データを集めます。検査する値は、Editor.Text プロパティを使用し て取得することに注目してください。この処理が必要なのは、各編集値がまだコントロールに反映されていないためです。検査 が失敗した場合、関数は警告を表示して Cancel 引数を True に設定します。これによって、編集値が取り消されてセルは編 集モードに戻り、ユーザーは入力し直しことができます。 [F5]キーを押して再びプロジェクトを実行して、無効な値を入力してみてください。コントロールがそれらの値を受け付けないの がわかります。 手順5: クリップボードへの対応 Windows のクリップボードは、アプリケーション間で情報のやりとりをするときに非常に便利なデバイスです。 FlexGrid プロジェクト プロジェクトをクリップボード対応にするのは非常に簡単です。AutoClipboard プロパティを True に設定するだけ で、グリッドはクリップボードに関連する標準のキーボードコマンド([Ctrl+X]または[Shift+Delete]で切り取り、[Ctrl+C]また は[Ctrl+Insert]でコピー、[Ctrl+V]または[Sift+Insert]で貼り付け)のすべてを自動的に処理します。 デザイナの場合 プロパティウィンドウで AutoClipboard プロパティを探し、それを True に設定します。 コードの場合 手順3:ドロップダウンリスト で追加されたコードの後ろに、以下のコードを追加します。 Visual Basic コードの書き方 Visual Basic fg.AutoClipboard = True 168 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き C# fg.AutoClipboard = true; クリップボードの操作に非常に関連の深い、Windows の優れたもう1つの機能といえば OLE ドラッグ&ドロップで す。C1FlexGrid コントロールは、この機能を組み込むために DragMode と DropMode の各プロパティを提供します。この 2つのプロパティを「自動」に設定するだけで、ドラッグ&ドロップによって、Microsoft Excel などの他のアプリケーションにデー タを移動したり、Excel スプレッドシートから C1FlexGrid コントロールにデータを移動したりできます。 デザイナの場合 DragMode と DropMode の各プロパティを探し、どちらも Automatic に設定します。 コードの場合 AutoClipboard プロパティを設定したコードの後ろに、以下のコードを追加します。 Visual Basic コードの書き方 Visual Basic fg.DragMode = DragModeEnum.Automatic fg.DropMode = DropModeEnum.Automatic C# コードの書き C# fg.DragMode = DragModeEnum.Automatic; fg.DropMode = DropModeEnum.Automatic; プログラムの実行と検証: [F5]キーを押して再度プロジェクトを実行し、適当なデータのコピーや貼り付けを試してみてください。不正なデータでも貼り付 けが可能なことがわかります。これは、貼り付けコードがデータの正当性の検査を行っていないためです。正当性検査を行う には、独自のコードを追加する必要があります。 手順6: カスタムエディタの組み込み C1FlexGrid は、テキスト入力、マスクテキスト、リストからの選択、チェックボックスなどに使用するためのパワフルな組み込 みエディタを提供します。しかし、カスタムエディタ、自分で記述したコントロールを代わりに使用したい場合があります。 FlexGrid では簡単にカスタムエディタをプラグインできます。 カスタムエディタをサンプルコードの「売上」列に付加するには、まず NumericUpDown コントロールをフォームに追加しま す。 169 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 1. .NETプロパティウィンドウを使って次の各プロパティを指定した新しいコントロールを設定します。 プロパティ 設定 BorderStyle None DecimalPlaces 2 Maximum 5000000 ThousandsSeparator True Visible False 2. [C1FlexGrid タスク タスク]メニューから〈列エディタ 列エディタ〉を選択し、グリッドの列エディタを表示させます。 3. 3番目の列(売上の数値を格納)を選択し、次のように Editor プロパティを NumericUpDown1 に設定します. プログラムの実行と検証: この段階で、プロジェクトを実行して「売上」列の適当な値を編集してみてください。グリッドは、組み込みエディタの代わりに NumericUpDown コントロールを使用していることがわかります。コントロールは正しく配置、初期化、管理されています。 フォーカスを別のセルに移動すると、その値がグリッドに格納されます。 170 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ただし、カスタムエディタは組み込みエディタとまったく同じようには動作しません。たとえば、次のようになります。 1. 数値を入力して編集を開始した場合、古い値はクリアされません。 2. エディタのサイズは厳密に正確ではありません(小さめになります)。 3. [Enter]キーを押して編集を終了すると、警告音が鳴ります。 これらの問題は2つの方法で解決できます。1つの方法では、エディタのイベントを使用しますが、この場合、他のプロジェクト でそのコントロールを再使用することは難しくなります。もう1つの方法では、派生クラスを作成してIC1EmbeddedEditor イン タフェースに適切なメソッドを実装します。 Visual Basic コードの書き方 Visual Basic Dim myup As New MyUpDown fg.Cols(3).Editor = myup Public Class MyUpDown Inherits NumericUpDown ' 初期値を設定します。 Public Sub C1EditorInitialize(ByVal value As Object, _ ByVal editorAttributes As IDictionary) value = Convert.ChangeType(value, GetType(Decimal)) ' 入力全体を選択します。 MyBase.Select(0, Int32.MaxValue) End Sub ' FontHeightを設定し、コントロールに長方形の高さを維持させます。 Public Sub C1EditorUpdateBounds(ByVal rc As Rectangle) MyBase.FontHeight = rc.Height Bounds = rc End Sub ' ユーザーが入力したときに警告音を鳴らさないようにします。 Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean If (keyData = Keys.Enter) Then Parent.Focus() If (Parent.Focused) Then SendKeys.Send("{Down}") Return True End If Return MyBase.ProcessDialogKey(keyData) End Function End Class 171 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き C# MyUpDown myup = new MyUpDown(); fg.Cols[3].Editor = myup; internal class MyUpDown : NumericUpDown { // 初期値を設定します。 public void C1EditorInitialize(object value, IDictionary editorAttributes) { if (value != null) { Value = (decimal)Convert.ChangeType(value, typeof(decimal)); } // 入力全体を選択します。 Select(0, int.MaxValue); } // FontHeightを設定して、コントロールに長方形の高さを維持させます。 public void C1EditorUpdateBounds(Rectangle rc) { base.FontHeight = rc.Height; Bounds = rc; } // ユーザーが入力したときに警告音を鳴らさないようにします。 override protected bool ProcessDialogKey(Keys keyData) { if (keyData == Keys.Enter) { Parent.Focus(); if (Parent.Focused) SendKeys.Send ("{Down}"); return true; } return base.ProcessDialogKey(keyData); } } たとえば、次のコードは3つのメソッドを実装します。 C1EditorInitialize を 呼び 出して エディタを初期化します。初期値 が 設定され入力全体が選択されます。これによっ て、最初の問題が解決します。入力全体が選択されているため、この段階で最初の文字を入力すると現在の内容が希 望どおりに置き換えられます。 C1EditorUpdateBounds を 呼び 出して、編集対象のセル上にエディタを配置します。ただし、NumericUpDown コ ントロールの高さはフォントサイズに基づいて自動的に設定されます(このためセルには低めになります)。コードは、エ ディタの FontHeight プロパティを設定し、エディタをセル上に正しく配置します。 ProcessDialogKey メソッドを変更して、ユーザーが[Enter]キーを押したとき警告音が鳴らないようにします。 Outline チュートリアル Outline チュートリアルは、チュートリアルの「Tut_XMLTree」に収録されています。XML文書は、プロジェクトフォルダ内の NWindEmbedPics.xml を使用します。 このチュートリアルでは、C1FlexGrid をアウトライナとして使用し構造化(階層)データを表示する方法を示します。アウトライ ナとして使用する場合、C1FlexGrid コントロールは Tree コントロールと同じように動作してノードを表示します。ノードは、縮 172 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 小または展開して従属データを含む分枝を表示できます。 サンプルでは、XML 文書をグリッドにロードしてツリー表示します。これらの機能を追加した最終的なアプリケーションの外観 は次のようになります。 手順1: コントロールの作成 まず新規にプロジェクトを作成し、次の2つのコントロールを追加します。 コマンドボタンをフォームの一番上に追加 C1FlexGrid コントロールをコマンドボタンの下に追加 1. Visual Studio のプロパティウィンドウを使用し、各プロパティを下記のように設定します。 コマンドボタン プロパティ 設定 Dock Top Text "XMLファイルを 開く... C1FlexGrid プロパティ 設定 Name fg Dock Fill 2. フォームのキャプション部分をダブルクリックし、コードウィンドウを開きます。ファイルの一番上に、次のステートメントを追加しま す。 Visual Basic コードの書き方 Visual Basic Imports C1.Win.C1FlexGrid C# コードの書き C# using C1.Win.C1FlexGrid; これによって、C1FlexGrid アセンブリで定義されているオブジェクトを、名前空間の一部だけを使ってプロジェクト内で参照でき、 173 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 入力の手間を省くことができます。 3. プロパティウィンドウやエディタのデザイナを使用するか、以下のコードを入力(コピー)し、グリッドを設定します。 デザイナの場合 プロパティウィンドウで、C1FlexGrid コントロールの以下のプロパティを設定します。 プロパテ 設定 Cols.Count 2 Cols.Fixed 0 ExtendLastCol True Rows.Count 1 Tree.Column 0 Tree.Style SimpleLeaf グリッドのスタイルを設定します。 [C1FlexGrid タスク タスク]メニューの〈スタイルエディタ スタイルエディタ〉を選択し、[FlexGrid スタイルエディタ スタイルエディタ]を開きます。[FlexGrid スタイル エディタ エディタ]へのアクセス方法の詳細については、スタイルエディタ を参照してください。 [組み込みスタイル 組み込みスタイル]のリストで Normal を選択します。 Border.Style プロパティを None、TextAlign プロパティを LeftCenter、および WordWrap プロパティを False に設定 します。 〈追加 追加〉ボタンをクリックします。 CustomStyle1 の名前を Data に変更します。 BackColor プロパティを Control に設定します。 174 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 〈OK〉〉をクリックし、エディタを閉じます。 グリッドの列を設定します。 グリッドの列0を選択します。列0の[Column タスク タスク]メニューが開きます。 [列キャプション 列キャプション]を「要素 要素」に設定します。 [編集を有効にする 編集を有効にする]チェックボックスを OFF にします。 175 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 列1を選択します。 [列キャプション 列キャプション]を「テキスト テキスト」に設定します。 また、列は以下のように[FlexGrid 列エディタ 列エディタ]から設定することもできます。 [C1FlexGrid タスク]メニューの〈列エディタ 列エディタ〉を選択し、[FlexGrid 列エディタ 列エディタ]を開きます。[FlexGrid 列エディタ 列エディタ]へのアク セス方法の詳細については、列エディタ を参照してください。 右ペインの列0を選択します。 左ペインで、AllowEditing プロパティを False に設定し、Caption プロパティを「要素 要素」に設定します。 176 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms コードの場合 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' グリッドを初期化します。 fg.Rows.Count = 1 fg.Cols.Count = 2 fg.Cols.Fixed = 0 fg.ExtendLastCol = True fg(0, 0) = "要素" fg(0, 1) = "テキスト" ' アウトラインツリーを初期化します。 fg.Tree.Column = 0 fg.Tree.Style = TreeStyleFlags.SimpleLeaf fg.Cols(0).AllowEditing = False ' スタイルを初期化します。 fg.Styles.Normal.Border.Style = BorderStyleEnum.None fg.Styles.Normal.TextAlign = TextAlignEnum.LeftCenter fg.Styles.Normal.WordWrap = False Dim cs As CellStyle = fg.Styles.Add("Data") cs.BackColor = SystemColors.Control End Sub C# コードの書き C# private void Form1_Load(object sender, System.EventArgs e) { // グリッドを初期化します。 fg.Rows.Count = 1; fg.Cols.Count = 2; fg.Cols.Fixed = 0; fg.ExtendLastCol = true; fg[0, 0] = "要素"; fg[0, 1] = "テキスト"; // アウトラインツリーを初期化します。 fg.Tree.Column = 0; fg.Tree.Style = TreeStyleFlags.SimpleLeaf; fg.Cols[0].AllowEditing = false; // スタイルを初期化します。 fg.Styles.Normal.Border.Style = BorderStyleEnum.None; fg.Styles.Normal.TextAlign = TextAlignEnum.LeftCenter; fg.Styles.Normal.WordWrap = false; CellStyle cs = fg.Styles.Add("Data"); cs.BackColor = SystemColors.Control; } プログラムの実行と検証: コードはまず、グリッドのレイアウトと列見出しテキストを設定します。 177 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 次に、 Treeプロパティを使用してアウトラインツリーを初期化し、最初の列のAllowEditing プロパティを False に設定することによって XML ノードの編集ができないようにします。ユーザーが、2番目の列データを編集できることに注目してください。2番目の列には各 XML ノードのデータが含まれています。 これでコントロールが用意できました。これにコードを追加していきます。 手順2: データの読み込みとアウトラインの構築 データを読み込んで、アウトラインを構築するには、Button1_Click イベントにコードを追加して GetXMLData ルーチンを追 加します。 1. コマンドボタンをダブルクリックして、次のコードを Button1_Click イベントに追加します。 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' ファイル名を取得します。 Dim fo As OpenFileDialog = New OpenFileDialog() fo.DefaultExt = "xml" fo.Filter = "XML Files (*.xml)|*.xml" If fo.ShowDialog() <> Windows.Forms.DialogResult.OK Then Exit Sub ' XMLファイルをロードします。 Dim xdoc As Xml.XmlDocument = New Xml.XmlDocument() xdoc.Load(fo.FileName) ' スピードを向上させるために再描画しないようにします。 fg.BeginUpdate() ' グリッドにデータを格納します。 fg.Rows.Count = 1 GetXMLData(xdoc.ChildNodes(1), 0) ' ツリーを表示する列の幅を自動的に調整します。 fg.AutoSizeCol(0) ' レベル0、1、2を展開します。 fg.Tree.Show(2) ' 再描画を行うようにします。 fg.EndUpdate() End Sub 178 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き C# private void Button1_Click(object sender, System.EventArgs e) { // ファイル名を取得します。 OpenFileDialog fo = new OpenFileDialog(); fo.DefaultExt = "xml"; fo.Filter = "XML Files (*.xml)|*.xml"; if (fo.ShowDialog() != DialogResult.OK) { return; } // XMLファイルをロードします。 System.Xml.XmlDocument xdoc = new System.Xml.XmlDocument(); xdoc.Load(fo.FileName); // スピードを向上させるために再描画しないようにします。 fg.BeginUpdate(); // グリッドにデータを格納します。 fg.Rows.Count = 1; GetXMLData(xdoc.ChildNodes[1], 0); // ツリーを表示する列の幅を自動的に調整します。 fg.AutoSizeCol(0); // レベル0、1、2を展開します。 fg.Tree.Show(2); // 再描画を行うようにします。 fg.EndUpdate(); } このルーチンはまず、OpenFileDialog を表示させ、ユーザーがXMLファイルを選択してグリッドにロードできるように します。ファイルが選択されると、ルーチンはそれを XmlDocument オブジェクトにロードし、XmlDocument オブジェ クトはファイルの内容を解析してメモリに格納します。 その後、グリッドの BeginUpdate メソッド を 呼び出し、コントロールがデータを読み込んでいる間は再描画しないよう にします。この方法を使用するとパフォーマンスが非常に向上します。したがって、大容量のデータを C1FlexGrid に 追加するときは常にこれを使用してください。 次に、ルーチンは、Count = 1 を設定してすべてのデータをクリアし、GetXMLData ルーチンを呼び出して XmlDocument オブジェクトの内容をコントロールに読み込みます。GetXMLData ルーチンは、このサンプルの主要 ルーチンで以下に示します。 グリッドにデータを読み込んだ後、AutoSizeCol を使用して最初の列幅を内容に合わせて調整し、Show メソッドでア ウトラインを展開してレベル0、1、2を表示させます。次に、EndUpdate メソッドを呼び出すと、グリッドは通常どおり再 描画を始めます。 2. このチュートリアルで一番興味深いのが、GetXMLData ルーチンです。このルーチンは、XMLDocument オブジェク トをトラバースして、アウトラインツリーを構築します。コードは次のとおりです。 Visual Basic コードの書き方 Visual Basic Private Sub GetXMLData(ByVal node As Xml.XmlNode, ByVal level As Integer) ' コメントノードを無視します。 If node.NodeType = Xml.XmlNodeType.Comment Then 179 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Exit Sub End If ' このノードのための新しい行を追加します。 Dim row As Integer = fg.Rows.Count fg.Rows.Add() ' 追加した行にデータを追加します。 fg(row, 0) = node.Name If node.ChildNodes.Count = 1 Then fg(row, 1) = node.InnerText fg.SetCellStyle(row, 1, fg.Styles("Data")) End If ' ノードが"Name"というサブノードを持つなら、その値を ' ツールチップとして使用するために保存します。 Dim ndName As Xml.XmlNode = node.SelectSingleNode("Name") If Not (ndName Is Nothing) Then fg.Rows(row).UserData = ndName.InnerText End If ' ノードに子ノードがあるなら、それらも取得します。 If node.ChildNodes.Count > 1 Then ' ノードに子ノードがあるなら、それらも取得します。 fg.Rows(row).IsNode = True fg.Rows(row).Node.Level = level ' 子ノードがある場合、子ノードもグリッドに追加します。 Dim child As Xml.XmlNode For Each child In node.ChildNodes GetXMLData(child, level + 1) Next End If End Sub C# コードの書き C# private void GetXMLData(System.Xml.XmlNode node, int level) { // コメントノードを無視します。 if (node.NodeType == System.Xml.XmlNodeType.Comment) { return; } // このノードのための新しい行を追加します。 int row = fg.Rows.Count; fg.Rows.Add(); // 追加した行にデータを追加します。 fg[row, 0] = node.Name; if (node.ChildNodes.Count == 1) { fg[row, 1] = node.InnerText; fg.SetCellStyle(row, 1, fg.Styles["Data"]); } // ノードが"Name"というサブノードを持つなら、その値を // ツールチップとして使用するために保存します。 180 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms System.Xml.XmlNode ndName = node.SelectSingleNode("Name"); if (ndName != null) { fg.Rows[row].UserData = ndName.InnerText; } // ノードに子ノードがあるなら、それらも取得します。 if (node.ChildNodes.Count > 1) { // ノードに子ノードがあるなら、それらも取得します。 fg.Rows[row].IsNode = true; fg.Rows[row].Node.Level = level; // 子ノードがある場合、子ノードもグリッドに追加します。 foreach (System.Xml.XmlNode child in node.ChildNodes) { GetXMLData(child, level + 1); } } } ルーチンはまず、XML コメントノードを無視します。その後、RowCollection.Add メソッドを使用し、新しい行をグリッドに追加 します。次に、ルーチンはノード名を設定します。そして、ノードの子ノードが1つだけであることを確認します。子ノードが1つだ けの場合、ノードはデータノードとして解釈でき、ノードの InnerText プロパティの値を追加した行の2番目の列にコピーしま す。また、データノードのセルスタイルを、フォームのロード時に作成したカスタムスタイル"Data"に設定します。次のコードブ ロックでは、このノードが"Name"というサブノードを持っているかどうかを調べます。持っていれば、"Name"ノードの内容を追 加した行の RowCol.UserData プロパティに設定します。この値は後で、ツールチップの実装に使用され、ノードが縮小されて いるときでもノード名がユーザーに表示されるようにします。最後に、ノードに子ノードがある場合、GetXMLData ルーチン自 身を呼び出して子ノードもグリッドに追加します。 プログラムの実行と検証: この段階でプロジェクトを実行すると、すでに XML ファイルのロードや表示を行うことができ、ユーザーがクリックすると縮小や 展開ができることがわかります。次の手順では、いくつか修正を行いアプリケーションを使いやすくします。 手順3: マウスおよびキーボードのカスタム設定 C1FlexGrid コントロールは、ユーザーがノードを展開したり縮小する機能を提供していますが、この動作を拡張し、カスタマイ ズすることもできます。ツリーのノードが展開したり縮小するたびにBeforeCollapse イベントと AfterCollapseイベントが発生 181 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms するため、これに呼応する形でアクションを設定することができます。さらに、Collapsed プロパティを使うと、各ノードの縮小し た状態をコーディングによって取得および設定できます。 このサンプルでは、DoubleClick イベントと KeyPress イベントをトラップし、ユーザーがダブルクリックするか、[Enter]キーを 押したときにノードを展開または縮小します。コードは次のとおりです。 Visual Basic コードの書き方 Visual Basic Private Sub fg_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles fg.DoubleClick If fg.MouseCol = 0 Then ToggleNodeState() End If End Sub Private Sub fg_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles fg.KeyPress If e.KeyChar = vbCr Then ToggleNodeState() End If End Sub Private Sub ToggleNodeState() ' ノードが選択されていない場合は、実行しません。 If (fg.Row < 0) Then Exit Sub ' カレント行がノード以外の場合は、処理を行いません。 Dim r As Row = fg.Rows(fg.Row) If Not r.IsNode Then Exit Sub ' ノードを展開または縮小します。 r.Node.Collapsed = Not r.Node.Collapsed End Sub C# コードの書き C# private void fg_DoubleClick(object sender, System.EventArgs e) { if (fg.MouseCol == 0) { ToggleNodeState(); } } private void fg_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) { if (e.KeyChar == (char)13) { ToggleNodeState(); } } private void ToggleNodeState() { // ノードが選択されていない場合は、実行しません。 if (fg.Row < 0) { 182 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms return; } // カレント行がノード以外の場合は、処理を行いません。 Row r = fg.Rows[fg.Row]; if (r.IsNode == false) { return; } // ノードを展開または縮小します。 r.Node.Collapsed = !(r.Node.Collapsed); } プログラムの実行と検証: イベントハンドラ、ユーザーが最初の列をダブルクリックしたかどうか、あるいは[Enter]キーを押したかどうかを確認 し、ToggleNodeState ルーチンを呼び出します。ToggleNodeState は、カレント行がノード行であることを確認し、ノード行 であれば Collapsed プロパティの値を切り替えます。 手順4: 編集の許可と禁止 最初の列の AllowEditing プロパティを False に設定したことを思い出してください。これによって、ユーザーは最初の列のセ ルすべてを編集できなくなります。ノード行の2列目もデータを入力できないようにしましょう。これを行うには、次のコードを追 加して BeforeEdit イベントを処理します。 Visual Basic コードの書き方 Visual Basic Private Sub fg_BeforeEdit(ByVal sender As Object, ByVal e As RowColEventArgs) Handles fg.BeforeEdit ' カレント列がノードの場合、編集を行いません。 Dim r As Row = fg.Rows(fg.Row) If r.IsNode Then e.Cancel = True End Sub C# コードの書き C# private void fg_BeforeEdit( object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { // カレント列がノードの場合、編集を行いません。 Row r = fg.Rows[fg.Row]; if (r.IsNode == true) { e.Cancel = true; } } 手順5: ツールチップの実装 このチュートリアルの最後に、ツールチップをアウトラインに追加します。ツールチップには、前述の GetXMLData ルーチンで 各行の UserData プロパティに格納したテキストを表示します。ユーザーが "Name" ノードの親ノードにマウスを移動すると、 183 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms "Name"ノードの内容が表示されます。これは、親ノードが縮小していて"Name"ノードの内容が表示されていないときに便利で す。 1. ToolTip コントロールをフォームに追加します。 2. 次のコードを追加してグリッドの MouseMove イベントを処理します。 Visual Basic コードの書き方 Visual Basic Private Sub fg_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles fg.MouseMove ' マウスが置かれたセルのツールチップをチェックします。 Dim tip As String = "" If fg.MouseCol = 0 And fg.MouseRow > 0 Then tip = fg.Rows(fg.MouseRow).UserData End If ' 現在のツールチップと異なる場合に新たに設定します。 If tip <> ToolTip1.GetToolTip(fg) Then ToolTip1.SetToolTip(fg, tip) End If End Sub C# コードの書き方 C# private void fg_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { // マウスが置かれたセルのツールチップをチェックします。 object tip = null; if ((fg.MouseCol == 0) && (fg.MouseRow > 0)) { tip = fg.Rows[fg.MouseRow].UserData; } // 現在のツールチップと異なる場合に新たに設定します。 if (tip != (object)toolTip1.GetToolTip(fg)) { toolTip1.SetToolTip(fg, (string)tip); } } プログラムの実行と検証: コードはまず、MouseRow と MouseCol の各プロパティを使用し、マウスが置かれたセルをチェックします。ツールチップの テキストが入った行の最初の列上にマウスが置かれた場合、テキストを取得します。それ以外は、ツールチップのテキストは 「Nothing」に設定されます。 184 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 次に、ルーチンは新しいツールチップと現在のツールチップとを比較し、必要であれば Tooltip コントロールの SetToolTip メ ソッドを呼び出してテキストを更新します。 これで、チュートリアルを終了します。上記のプロジェクトは多様に拡張できます。たとえば、編集データを XML 文書に保存し たり、ノードの追加、削除、移動を行ったり、さまざまな種類のデータをいろいろなスタイルで使用できます。 Data Analysis チュートリアル このチュートリアルでは、C1FlexGrid コントロールで最も便利な機能のいくつかを組み合わせ、データテーブルの動的ビュー を実現します。このアプリケーションは、Microsoft Visual Studio に付属の NorthWind データベースから、販売売上を含む単 純なデータをグリッドに連結することからスタートし、次の機能を追加します。 動的なレイアウト(列の順序) 自動ソート セルのマージ 自動小計行 アウトライン 最終的なアプリケーションの外観は次のようになります。ユーザーは、最初の3列をドラッグし、LastName、ShipCountry、 CategoryName ごとにデータをグループ化できます。列をドラッグすると、各合計行が自動的に再計算され、アウトラインツ リーが再構築されます。 185 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 手順1:コントロールの作成 新規にプロジェクトを作成します。ツールボックスの C1FlexGrid アイコンをクリックしてからフォーム上をクリックし、オブジェクト が適切なサイズになるまで C1FlexGrid コントロールをドラッグしてフォームに追加します。 1. Visual Studio のプロパティウィンドウを使用し、C1FlexGrid コントロールのプロパティを下記のように設定します。 プロパティ 設定 Name fg Dock Fill 2. フォームのキャプション部分をダブルクリックし、コードウィンドウを開きます。ファイルの一番上に、次のステートメントを 追加します。 Visual Basic コードの書き方 Visual Basic Imports System.Data.OleDb Imports System.ComponentModel Imports C1.Win.C1FlexGrid C# コードの書き C# using System.Data.OleDb; using System.ComponentModel; using C1.Win.C1FlexGrid; これによって、C1FlexGrid および OleDb アセンブリで定義されているオブジェクトを、名前空間の一部だけを使ってプ ロジェクト内で参照でき、入力の手間を省くことができます。 手順2:グリッドの初期化とデータ表示 186 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms グリッドを設定し、解析する売上データをグリッドに読み込むには、デザイナかコードでレイアウトプロパティとスタイルを設定し て、GetDataSource メソッドを使用してグリッドにデータを読み込みます。 1. デザイナまたはコードで、グリッドのレイアウトとスタイルを設定します。 デザイナの場合 プロパティウィンドウで、以下のプロパティを設定します。 プロパティ 設定 AllowEditing False AllowSorting None AllowMerging Nodes ExtendLastCol True SelectionMode Cell Tree.Style Simple Tree.Column 1 [C1FlexGrid タスク タスク]メニューの〈列エディタ〉を選択し、[FlexGrid 列エディタ 列エディタ]を開きます。[FlexGrid 列エディ タ]へのアクセス方法の詳細については、列エディタ を参照してください。 右ペインの列0を選択します。 左ペインで、Width プロパティを 20 に設定します。 〈OK〉をクリックし、列エディタを閉じます。 [C1FlexGrid タスク タスク]メニューの〈スタイルエディタ スタイルエディタ〉を選択し、[FlexGrid スタイルエディタ スタイルエディタ]を開きます。 [FlexGrid スタイルエディタ スタイルエディタ]へのアクセス方法の詳細については、スタイルエディタ を参照してください。 [組み込みスタイル 組み込みスタイル]のリストから Normal を選択します。 Border.Style プロパティを None に、および Trimming プロパティを EllipsisCharacter に設定します。 [組み込みスタイル 組み込みスタイル]のリストから Subtotal0 を選択します BackColor プロパティを Gold、および ForeColor プロパティを Black に設定します。 187 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Subtotal1 と Subtotal2 の各プロパティを以下のように設定します。 Subtotal1 BackColor Khaki ForeColor Black Subtotal2 BackColor LightGoldenrodYellow ForeColor Black 〈OK〉〉をクリックし、スタイルエディタを閉じます。 コードの場合 Form_Load イベントに以下のコードを追加し、グリッドのレイアウトとスタイルを設定します。 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' グリッドのレイアウトと動作を設定します。 fg.AllowEditing = False fg.AllowSorting = AllowSortingEnum.None fg.AllowMerging = AllowMergingEnum.Nodes fg.SelectionMode = SelectionModeEnum.Cell 188 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms fg.ExtendLastCol = True fg.Cols(0).Width = fg.Cols.DefaultSize / 4 fg.Tree.Style = TreeStyleFlags.Simple fg.Tree.Column = 1 ' グリッドのスタイルを設定します。 fg.Styles.Normal.Border.Style = BorderStyleEnum.None fg.Styles.Normal.Trimming = StringTrimming.EllipsisCharacter Dim s As CellStyle s = fg.Styles(CellStyleEnum.Subtotal0) s.BackColor = Color.Gold s.ForeColor = Color.Black s = fg.Styles(CellStyleEnum.Subtotal1) s.BackColor = Color.Khaki s.ForeColor = Color.Black s = fg.Styles(CellStyleEnum.Subtotal2) s.BackColor = Color.LightGoldenrodYellow s.ForeColor = Color.Black End Sub C# コードの書き C# private void Form1_Load(object sender, System.EventArgs e) { // グリッドのレイアウトと動作を設定します。 fg.AllowEditing = false; fg.AllowSorting = AllowSortingEnum.None; fg.AllowMerging = AllowMergingEnum.Nodes; fg.SelectionMode = SelectionModeEnum.Cell; fg.ExtendLastCol = true; fg.Cols[0].Width = fg.Cols.DefaultSize / 4; fg.Tree.Style = TreeStyleFlags.Simple; fg.Tree.Column = 1; // グリッドのスタイルを設定します。 fg.Styles.Normal.Border.Style = BorderStyleEnum.None; fg.Styles.Normal.Trimming = StringTrimming.EllipsisCharacter; CellStyle s; s = fg.Styles[CellStyleEnum.Subtotal0]; s.BackColor = Color.Gold; s.ForeColor = Color.Black; s = fg.Styles[CellStyleEnum.Subtotal1]; s.BackColor = Color.Khaki; s.ForeColor = Color.Black; s = fg.Styles[CellStyleEnum.Subtotal2]; s.BackColor = Color.LightGoldenrodYellow; s.ForeColor = Color.Black; } ルーチンはまず、グリッドのレイアウトといくつかのスタイルを設定します。 2. Form_Load イベントに以下のコードを追加し、C1FlexGrid をデータソースに連結します。 Visual Basic コードの書き方 189 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic ' グリッドとデータソースを連結します。 fg.DataSource = GetDataSource() C# コードの書き C# // グリッドとデータソースを連結します。 fg.DataSource = GetDataSource(); このルーチンではGetDataSourceメソッド(後述のコードを参照)で作成されたデータソースに連結します。 3. それぞれの RowCol.AllowDragging プロパティを False に設定し、最後の3列をドラッグできないようにロックします。 これは、ユーザーがこれらの列のデータをグループ化できないようにするためです。最後の3列のデータは行ごとに異 なります。このプロパティは、デザイナでもコードでも設定できます。 デザイナの場合 グリッドの列4を選択します。列4の[Column タスク タスク]メニューが開きます。 [順序変更を有効にする 順序変更を有効にする]チェックボックスを OFF にします。 列5と列6に手順を繰り返します。 また、RowCol.AllowDragging プロパティは、以下のように[FlexGrid 列エディタ 列エディタ]を使用して設定することもできます。 [C1FlexGrid タスク タスク]メニューの〈列エディタ 列エディタ〉を選択し、[FlexGrid 列エディタ 列エディタ]を開きます。[FlexGrid 列エディ タ]へのアクセス方法の詳細については、列エディタ を参照してください。 右ペインの列4を選択します。 左ペインで、AllowDragging プロパティを False に設定します。 190 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 列5と列6の AllowDragging プロパティを False に設定します。 エディタは閉じません。 コードの場合 Form_Load イベントに次のコードを追加します。 Visual Basic コードの書き方 Visual Basic ' ユーザーによる列のドラッグを禁止します(最後の3列のみ)。 fg.Cols(4).AllowDragging = False fg.Cols(5).AllowDragging = False fg.Cols(6).AllowDragging = False C# コードの書き C# // ユーザーによる列のドラッグを禁止します(最後の3列のみ)。 fg.Cols[4].AllowDragging = false; fg.Cols[5].AllowDragging = false; fg.Cols[6].AllowDragging = false; 4. Sales Amount 列の Format プロパティを設定し、金額を通貨値で表示させます。これは、デザイナでもコードでも設定 できます。 デザイナの場合 グリッドの列6を選択します。 [書式設定 書式設定]ボックスの〈...〉ボタンをクリックし、[書式文字列 書式文字列]ダイアログボックスを開きます。 [形式の種類]で、通貨を選択します。 191 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 〈OK〉をクリックし、[書式文字列]ダイアログを閉じます。 また、Format プロパティは、以下のように[FlexGrid 列エディタ 列エディタ]を使用して設定することもできます。 [FlexGrid 列エディタ 列エディタ]で、右ペインの列6を選択します。 左ペインで、Format プロパティの横の〈...〉ボタンをクリックし、[書式文字列 書式文字列]ダイアログボックスを開きます。 [形式の種類]で、通貨を選択します。 〈OK〉をクリックし、[書式文字列 書式文字列]ダイアログを閉じます。 〈OK〉をクリックし、列エディタを閉じます。 コードの場合 Visual Basic コードの書き方 Visual Basic fg.Cols(6).Format = "C" C# コードの書き C# fg.Cols[6].Format = "C"; 5. GetDataSource メソッドは、グリッドが表示するデータテーブルを作成します。このルーチンは、データを取得する SQL 文を除いて非常に単純です。多くのユーザーの場合、これらの SQL 文は手動ではなく、Visual Studio や Microsoft Access などに実装されているようなビジュアルデザイナを使用して記述します。接続文字列は、NorthWind データ ベースを参照しています。ご使用のシステムでは、このファイルが別のフォルダにある場合があります。その場合に は、コード内のこの文字列を変更する必要がある点に注意してください。 Visual Basic コードの書き方 Visual Basic Prvate Function GetDataSource() As DataTable 192 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ' 接続文字列を設定します。 Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\Program Files\ComponentOne Studio.NET 2.0\Common\Nwind.mdb" ' 接続文字列を設定します。 Dim rs As String = _ "SELECT Employees.LastName,Orders.ShipCountry," & _ "Categories.CategoryName,Products.ProductName,Orders.OrderDate," & _ "[Quantity]*[Products].[UnitPrice] AS [Sale Amount] " & _ "FROM (Categories INNER JOIN Products " & _ "ON Categories.CategoryID = Products.CategoryID) " & _ "INNER JOIN ((Employees INNER JOIN Orders " & _ "ON Employees.EmployeeID = Orders.EmployeeID) " & _ "INNER JOIN [Order Details] " & _ "ON Orders.OrderID = [Order Details].OrderID) " & _ "ON Products.ProductID = [Order Details].ProductID " & _ "ORDER BY Employees.LastName,Orders.ShipCountry," & _ "Categories.CategoryName;" ' DataSetへデータを取り出します。 Dim da As OleDbDataAdapter = New OleDbDataAdapter(rs, conn) Dim ds As DataSet = New DataSet() da.Fill(ds) ' データテーブルを返します。 GetDataSource = ds.Tables(0) End Function C# コードの書き C# private DataTable GetDataSource() { // 接続文字列を設定します。 string conn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=C:\\Program Files\\ComponentOne Studio.NET 2.0\\Common\\Nwind.mdb"; // Set up the SQL statement. string rs = "SELECT Employees.LastName,Orders.ShipCountry," + "Categories.CategoryName,Products.ProductName,Orders.OrderDate," + "[Quantity]*[Products].[UnitPrice] AS [Sale Amount] " + "FROM (Categories INNER JOIN Products " + "ON Categories.CategoryID = Products.CategoryID) " + "INNER JOIN ((Employees INNER JOIN Orders " + "ON Employees.EmployeeID = Orders.EmployeeID) " + "INNER JOIN [Order Details] " + "ON Orders.OrderID = [Order Details].OrderID) " + "ON Products.ProductID = [Order Details].ProductID " + "ORDER BY Employees.LastName,Orders.ShipCountry," + 193 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms "Categories.CategoryName;"; // DataSetへデータを取り出します。 OleDbDataAdapter da = new OleDbDataAdapter(rs, conn); DataSet ds = new DataSet(); da.Fill(ds); // データテーブルを返します。 return ds.Tables[0]; } プログラムの実行と検証: この段階でプロジェクトを実行すると、列を移動したりデータを参照できる簡単なグリッドが表示されます。ただし、データは明 確な方法で構造化されていません。このテーブルには数千のレコードが含まれます。データ全体が表すのものの概要を把握 するのはかなり難しくなります。 手順3:自動ソート データを系統立てて整理するための第1歩は、データのソートです。ユーザーが列を並べ替えるたびに、データが自動的に ソートされるようにします。 ユーザーが列を並べ替えると、C1FlexGrid コントロールは AfterDragColumn イベントを発生させます。イベントハンドラを 追加し、グリッド上のデータテーブルのデータをソートします(グリッドが非連結モードで使用されている場合は、Sort メソッドで 行います)。 フォームに以下のコードを追加し、ユーザーが列をドラッグしたときにレコードセットをソートして小計を再構築します。 Visual Basic コードの書き方 Visual Basic Private Sub fg_AfterDragColumn(ByVal sender As System.Object, ByVal e As C1.Win.C1FlexGrid.DragRowColEventArgs) Handles fg.AfterDragColumn ' ユーザーが列をドラッグしたとき、レコードセットをソートします。 ' これはデータをリフレッシュさせ、全ての小計を削除し、AfterDataRefresh 194 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ' イベントを発生させます。そして、小計が再計算されます。 Dim sort As String = fg.Cols(1).Name & ", " & fg.Cols(2).Name & ", " & fg.Cols(3).Name Dim dt As DataTable = fg.DataSource dt.DefaultView.Sort = sort End Sub C# コードの書き C# private void fg_AfterDragColumn(object sender, C1.Win.C1FlexGrid.DragRowColEventArgs e) { // ユーザーが列をドラッグしたとき、レコードセットをソートします。 // これはデータをリフレッシュさせ、全ての小計を削除し、AfterDataRefresh _ // イベントを発生させます。そして、小計が再計算されます。 string sort = fg.Cols[1].Name + ", " + fg.Cols[2].Name + ", " + fg.Cols[3].Name; DataTable dt = (DataTable)fg.DataSource; dt.DefaultView.Sort = sort; } プログラムの実行と検証: プロジェクトを実行し、最初の3列の見出しをドラッグして列を並べ替えてみてください。列を移動させるたびに、データは自動 的にソートされ、データが解釈しやすくなります。 次の手順では、小計行とアウトラインツリーを追加します。 手順4:小計行とアウトラインツリー グリッドを連結モードで使用しているとき、データソースに変更を加えると、グリッドは AfterDataRefresh イベントを発生させ ます。このイベントは、小計行の挿入およびグリッドのアウトラインツリーを構築するためのコードを追加するのに理想的です。 AfterDataRefresh イベントハンドラは次のようになります。 195 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub fg_AfterDataRefresh(ByVal sender As System.Object, ByVal e As System.ComponentModel.ListChangedEventArgs) Handles fg.AfterDataRefresh Dim totalOn As Integer = fg.Cols("Sale Amount").SafeIndex Dim caption As String = "{0} の合計" ' 3つのレベルのそれぞれの合計を算出します。 fg.Subtotal(AggregateEnum.Sum, 0, 1, totalOn, caption) fg.Subtotal(AggregateEnum.Sum, 1, 2, totalOn, caption) fg.Subtotal(AggregateEnum.Sum, 2, 3, totalOn, caption) ' レベル2までのアウトラインを展開します。 fg.Tree.Show(2) ' サイズを変更します。 fg.AutoSizeCols(1, 1, 1000, 3, 30, AutoSizeFlags.IgnoreHidden) End Sub C# コードの書き C# private void fg_AfterDataRefresh(object sender, System.ComponentModel.ListChangedEventArgs e) { int totalOn = fg.Cols["Sale Amount"].SafeIndex; string caption = "{0} の合計"; // 3つのレベルのそれぞれの合計を算出します。 fg.Subtotal(AggregateEnum.Sum, 0, 1, totalOn, caption); fg.Subtotal(AggregateEnum.Sum, 1, 2, totalOn, caption); fg.Subtotal(AggregateEnum.Sum, 2, 3, totalOn, caption); // レベル2までのアウトラインを展開します。 fg.Tree.Show(2); // サイズを変更します。 fg.AutoSizeCols(1, 1, 1000, 3, 30, AutoSizeFlags.IgnoreHidden); } プログラムの実行と検証: コードは、非常に簡単です。まず、"Sale Amount"列のインデックスを取得します。このサンプルでは、インデックスは常に特定 の列を指します。インデックスは通常、その都度取得するほうが固定値にするより良い方法です。これは、誰かがいくつかの フィールドを SQL 文に追加するとインデックスが変更されるためです。 その後、コードは Subtotal メソッドを呼び出してデータをグループ化し、新しい小計行を挿入します。新しい小計行は、自動的 にアウトラインノードに設定(各行の Row. IsNode プロパティが True に設定)されるため、縮小することができます。 196 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms もう一度、プロジェクトを実行し、列をドラッグしてみてください。Country ごと、ProductCategory ごと、Salesperson ごとの合 計を簡単に見ることができます。詳細を見たい場合は、ツリーを展開してデータをドリルダウンすることもできます。 注意: 注意:グリッドが編集可能で、[売上高]列の一部の値を変更すると AfterDataRefresh イベントが再び発生して、合計が 自動的に更新されることにも注意してください。 これで、チュートリアルを終了します。 197 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms タスク別ヘルプ タスク別ヘルプは、Visual Studio でのプログラミングに精通し、コントロールのバインド/バインド解除を行う一般的な方法を 理解していることが前提となります。FlexGrid for WinForms 製品の初心者の場合は、「チュートリアル」を先にお読みくださ い。 各トピックでは、FlexGrid for WinForms 製品を使用した特定のタスクのソリューションが提供されます。ヘルプで概説されて いる手順に従うことによって、さまざまな C1FlexGrid 機能を利用したプロジェクトを作成できるようになります。 タスク別ヘルプの各トピックでは、読者が新しい .NET プロジェクトを作成した経験を持っていることも前提となります。 グリッド C1FlexGrid コントロール本体の基本的なタスクや、グリッド全体のデザインに関する機能を紹介します。 FlexGridの各部名称について 関連項目 「行と列」 エディタにアクセスする C1FlexGrid の各エディタは、C1FlexGrid タスク タスクメニュー、コンテキストメニュー、またはプロパティウィンドウからアクセスでき ます。また、C1FlexGrid のエディタ のエディタには、列エディタ と スタイルエディタ の2つがあり、設計時にそれらを使用して C1FlexGrid のレイアウトと外観を制御できます。列の並べ替え、列幅の調整、列のプロパティの設定、列の挿入/削除を実行 するには、列エディタ 列エディタを使用します。既存のスタイルを変更し、カスタムスタイルを追加して後でセル、行、列に指定できるよう にするには、スタイルエディタ スタイルエディタを使用します。 列エディタにアクセス 列エディタ 列エディタにアクセスするには、C1FlexGrid タスク メニュー、コンテキストメニュー、またはプロパティウィンドウを使用します。 [列エディタ 列エディタ]を使用した列の編集の詳細については、「列エディタ」を参照してください。 [C1FlexGrid タスク]メニュー 198 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C1FlexGrid の右上隅のスマートタグ()をクリックし、[C1FlexGrid タスク タスク]メニューを開いて〈列エディタ 列エディタ〉を選択します。 コンテキストメニュー コンテキストメニュー] フォームを右クリックし、コンテキストメニューから〈列エディタ 列エディタ〉を選択します。 プロパティウィンドウ プロパティウィンドウで、Cols プロパティの横の〈...〉ボタンをクリックします。 199 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms スタイルエディタにアクセス スタイルエディタ スタイルエディタにアクセスするには、C1FlexGrid タスク メニュー、コンテキストメニュー、またはプロパティウィンドウを使用し ます。[スタイルエディタ]を使用したセルの外観のカスタマイズ方法の詳細については、「 スタイルエディタ」を参照してくださ い。 [C1FlexGrid タスク]メニュー タスク]メニュー] C1FlexGrid の右上隅のスマートタグ () をクリックし、[C1FlexGrid タスク タスク]メニューを開き、〈スタイルエディタ スタイルエディタ〉を選択します。 コンテキストメニュー コンテキストメニュー] フォームを右クリックし、コンテキストメニューから〈スタイルエディタ〉を選択します。 200 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms プロパティウィンドウ プロパティウィンドウで、Styles プロパティの横の〈...〉ボタンをクリックします。 VisualStyle を使用して外観を変更する VisualStyle を使用して C1FlexGrid の外観をカスタマイズするには、VisualStyle プロパティを Custom、 、Office2007Black、 、 Office2007Blue、 、Office2007Silver、または System に設定します。このプロパティは、デザイナまたはコードのいずれかで 設定できます。下図に個々の VisualStyle を示します。 Visual Style 説明 Custom VisualStyle なし(通常のスタイルと外観のプロパティを使用します)。 Office2007Black Doスタイルは Office2007 Black カラースキームに一致します。 Office2007Blue スタイルは Office2007 Blue カラースキームに一致します。 Office2007Silver スタイルは Office2007 Silver カラースキームに一致します。 System スタイルは現在のシステム設定に一致します。 Office2010Black 現在のシステム設定に基づく外観を持つコントロールをレンダリングします。 Office2010Silver Office 2010 Silver カラースキームに基づく外観を持つコントロールをレンダリング します。 Office2010Blue Office 2010 Blue カラースキームに基づく外観を持つコントロールをレンダリングし ます。 201 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms デザイナの場合 プロパティウィンドウで、VisualStyle プロパティを指定し、Custom、 、Office2007Black、 、Office2007Blue、 、 Office2007Silver、 、Office2010Blue、 、Office2010Black、 、Office2010Silver、または System に設定します。この例では、 VisualStyle プロパティは Office2007Blue に設定されます。 コードの場合 コードを Form_Load イベントに追加し、VisualStyle プロパティを Custom、 、Office2007Black、 、Office2007Blue、 、 Office2007Silver、 、Office2010Blue、 、Office2010Black、 、Office2010Silver、または System に設定します。次のコードは、 VisualStyle プロパティを Office2007Blue に設定します。 Visual Basic コードの書き方 Visual Basic Me.C1FlexGrid1.VisualStyle = C1.Win.C1FlexGrid.VisualStyle.Office2007Blue C# コードの書き方 C# this.c1FlexGrid1.VisualStyle = C1.Win.C1FlexGrid.VisualStyle.Office2007Blue; 【実行例】 カスタム視覚スタイル 視覚スタイルの適用なし: Office2007Black 視覚スタイル Office 2007 Black カラースキーム: Office2007Blue 視覚スタイル Office 2007 Blue カラースキーム: 202 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Office2007Silver 視覚スタイル Office 2007 Silver カラースキーム: Office2010Blue 視覚スタイル Office 2010 Blue カラースキーム: Office2010Silver 視覚スタイル Office 2010 Silver カラースキーム: Office2010Black 視覚スタイル Office 2010 Black カラースキーム: 203 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms システム視覚スタイル 現在のシステム設定: XP のテーマで表示する BorderStyle プロパティを BorderStyleEnum.XpThemes 列挙体 に設定し、ShowThemedHeaders プロパティを変更しま す。 【実行例】 Visual Basic コードの書き方 Visual Basic flex.BorderStyle = C1.Win.C1FlexGrid.Util.BaseControls.BorderStyleEnum.XpThemes flex.ShowThemedHeaders = C1.Win.C1FlexGrid.ShowThemedHeadersEnum.Both C# コードの書き方 204 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# flex.BorderStyle = C1.Win.C1FlexGrid.Util.BaseControls.BorderStyleEnum.XpThemes; flex.ShowThemedHeaders = C1.Win.C1FlexGrid.ShowThemedHeadersEnum.Both; 注意: 注意:XP のテーマで表示するには、VisualStyle プロパティが VisualStyle.Custom に設定されている必要がありま す。 関連項目 「Excel スタイルのヘッダを使用する」 「VisualStyle を使用して外観を変更する」 「コントロールの境界線スタイルを変更する」 グリッド領域の背景色をを変更する グリッド領域(すべてのセルより下および右にある範囲)は、EmptyArea 組み込みスタイルの BackColor プロパティを設定す ることで変更できます。(デフォルトはシステムの AppWorkspace 色) 【実行例】 Visual Basic コードの書き方 Visual Basic flex.Cols.Count = 5 flex.Rows.Count = 10 flex.Styles.EmptyArea.BackColor = Color.LightSalmon C# コードの書き方 C# flex.Cols.Count = 5; flex.Rows.Count = 10; flex.Styles.EmptyArea.BackColor = Color.LightSalmon; 205 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 注意: 注意:表示されるグリッド領域は、コントロールのサイズや行数/列数に依存します。 最後の列を広げてグリッド領域を埋める ググリッドがコントロールいっぱいに収まるように最後の列を広げて表示するには、ExtendLastCol プロパティを True に設定 します。(デフォルトは False) 【実行例】 Visual Basic コードの書き方 Visual Basic fflex.Cols.Count = 4 flex.Rows.Count = 10 ' 最後の列を広げてグリッド領域を埋める flex.ExtendLastCol = True C# コードの書き方 C# flex.Cols.Count = 4; flex.Rows.Count = 10; // 最後の列を広げてグリッド領域を埋める flex.ExtendLastCol = true; 注意: 注意:注意:最後の行を広げるような機能は実装されていません。また、印刷(プレビュー)時に同様の表示を行う場合 は、PrintGrid メソッドの印刷オプションで PrintGridFlags.ExtendLastCol を指定する必要があります。 グリッドの背景画像を設定する BackgroundImage プロパティに画像イメージを設定することができます。画像の配置方法は、BackgroundImageLayout プロパティで指定します。 【実行例】 206 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic flex.BackgroundImage = Image.FromFile("C:\back.jpg") flex.BackgroundImageLayout = ImageLayout.Stretch C# コードの書き方 C# flex.BackgroundImage = Image.FromFile("C:\back.jpg"); flex.BackgroundImageLayout = ImageLayout.Stretch; 透明度を指定して背景画像を設定する Color.FromArgb メソッド(System.Drawing)を使用して色とアルファ値を指定し、Normal 組み込みスタイルの BackColor プ ロパティに設定します。 【実行例】 207 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic ' 背景画像を設定 flex.BackgroundImage = Image.FromFile("C:\back.jpg") flex.BackgroundImageLayout = ImageLayout.Stretch ' 背景色:白、アルファ値:200 flex.Styles.Normal.BackColor = Color.FromArgb(200, _ Color.White.R, _ Color.White.G, _ Color.White.B) C# コードの書き方 C# // 背景画像を設定 flex.BackgroundImage = Image.FromFile(@"C:\back.jpg"); flex.BackgroundImageLayout = ImageLayout.Stretch; // 背景色:白、アルファ値:200 flex.Styles.Normal.BackColor = Color.FromArgb(200, Color.White.R, Color.White.G, Color.White.B); 注意: 注意:.NET Framework 機能の詳細については MSDN ライブラリ等を参照してください。 レイアウトを保存/ロードする レイアウトの保存/ロードには、WriteXml /ReadXml メソッドを使用します。 ReadXml/ /WriteXml メソッドによる XML ドキュメントの入出力では、データ以外にもプロパティやスタイルなどのグリッド設 定も対象になるため、レイアウトの保存やロードに使用できます。具体的には、片方のグリッドにスタイルなどの設定を行った 後、WriteXmlメソッドにて設定を XML ドキュメントに保存した上で、もう一方のグリッドで ReadXml メソッドを使用して設定を 読み込むといった方法になります。 208 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 209 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Handles MyBase.Load ' 片方のグリッドにスタイルやプロパティを設定 flex.Rows.Count = 4 flex.Cols.Count = 3 flex.Styles.Normal.BackColor = Color.YellowGreen flex.Styles.Fixed.ForeColor = Color.Red flex.Styles.Normal.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter flex.Styles.Fixed.BackColor = Color.Yellow flex.Cols(2).Width = 200 flex.Rows(3).Height = 50 flex(3, 2) = "Cell 3, 2" flex(0, 1) = "Fixed Cell" End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' レイアウトを保存/ロード Dim ms As System.IO.MemoryStream = New System.IO.MemoryStream() ' Xml に保存 flex.WriteXml(ms) ms.Position = 0 ' もう一つのグリッドで Xml を読み込む flex2.ReadXml(ms) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 片方のグリッドにスタイルやプロパティを設定 flex.Rows.Count = 4; flex.Cols.Count = 3; flex.Styles.Normal.BackColor = Color.YellowGreen; flex.Styles.Fixed.ForeColor = Color.Red; flex.Styles.Normal.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter; flex.Styles.Fixed.BackColor = Color.Yellow; flex.Cols[2].Width = 200; flex.Rows[3].Height = 50; flex[3, 2] = "Cell 3, 2"; flex[0, 1] = "Fixed Cell"; } private void button1_Click(object sender, EventArgs e) { // レイアウトを保存/ロード System.IO.MemoryStream ms = new System.IO.MemoryStream(); // Xml に保存 flex.WriteXml(ms); ms.Position = 0; // もう一つのグリッドで Xml を読み込む flex2.ReadXml(ms); } 210 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms パフォーマンスを改善する AutoResize プロパティを使用してパフォーマンスを向上させる 連結されたグリッドがデータソースからデータを取得する場合、グリッドはすべてのセルを計測し、すべてのデータが収まるよう に列幅を設定します。この結果、データソースのデータを表示するためにグリッドレイアウトが最適化されます。ただし、データ ソースが大規模の場合(たとえば、数千行以上ある場合)、時間がかかる可能性があります。 このような場合は、AutoResize プロパティを False(デフォルト)に設定し、列幅をコードで設定することを検討する必要があり ます。データソースと接続後に、AutoSizeCol (AutoSizeCols) メソッドや、列の Width プロパティを利用して列幅を調節して ください。 Visual Basic コードの書き方 Visual Basic ' データの取得 OleDbDataAdapter.Fill(DataSet) ' 列幅の自動調節機能 OFF flex.AutoResize = False ' データソースとの接続 flex.DataSource = DataSet.Tables(0) ' 列幅調節 ' ~ C# コードの書き方 C# // データの取得 OleDbDataAdapter.Fill(DataSet); // 列幅の自動調節機能 OFF flex.AutoResize = false; // データソースとの接続 flex.DataSource = DataSet.Tables[0]; // 列幅調節 // ~ BeginUpdate/ /EndUpdate メソッドを使用してパフォーマンスを向上させる セル値が変更されるか、行や列がグリッドに追加されたり、グリッドから削除されるたびに、グリッドレイアウトを再計算し、表示 を更新するために、いくつかの計算が実行されます。グリッドコンテンツの更新を開始する前に BeginUpdate メソッドをコー ルして再描画を中断し、変更が完了したら EndUpdate メソッドにより描画を再開することにより、パフォーマンスを大幅に向 上させることができます。 下記のコードでは、Try/Finally ブロックの使用により、更新コードが失敗して例外がスローされた場合でも、EndUpdate メ ソッドが必ずコールされるようにしています。 Visual Basic コードの書き方 Visual Basic ' グリッドを更新する前に再描画を中断します flex.BeginUpdate() ' 変更処理 Try Dim r As Integer = 0 Do While (r < flex.Rows.Count) 211 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Dim c As Integer = 0 Do While (c < flex.Cols.Count) flex(r, c) = (r + c) c += 1 Loop r += 1 Loop Finally ' 終了した際に必ず描画を再開します flex.EndUpdate() End Try C#コードの書き方 コードの書き方 Visual Basic // グリッドを更新する前に再描画を中断します flex.BeginUpdate(); //変更処理 try { for (int r = 0; r < flex.Rows.Count; r++) { for (int c = 0; c < flex.Cols.Count; c++) { flex[r, c] = r + c; } } } finally { // 終了した際に必ず描画を再開します flex.EndUpdate(); } グリッドに大量のデータを追加する場合も BeginUpdate/EndUpdate メソッドを使用してグリッドの再描画を抑制すること で、処理能力を向上させることが可能です。行や列の追加(行数・列数の設定)処理、データの設定処理などを行っている間 は、BeginUpdate メソッドをコールし、再描画を中断する方法を確認してください。 Visual Basic コードの書き方 Visual Basic ' グリッドの描画を中断します flex.BeginUpdate() ' 行や列の追加(行数・列数の設定)処理 ' ~ ' データの設定処理 ' ~ ' グリッドの描画を再開します flex.EndUpdate() C#コードの書き方 コードの書き方 Visual Basic 212 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // グリッドの描画を中断します flex.BeginUpdate(); // 行や列の追加(行数・列数の設定)処理 // ~ // データの設定処理 // ~ // グリッドの描画を再開します flex.EndUpdate(); 繰り返しスタイルを作成している StyleNew プロパティによるスタイル設定は、カスタムスタイルを新規で作成しますので、繰り返し実行すると、パフォーマンス が低下したり、リソースの消費量が増加する場合があります。また、何度も発生するイベント内で繰り返しカスタムスタイルを 作成しているような場合も同様です。 同じスタイルを繰り返し適用するような場合は、あらかじめ作成したカスタムスタイルをセルや行、列に適用するようにしてくだ さい。 JIS2004 対応フォントを使用する Windows Vista や Windows 7 などで標準搭載される JIS2004 対応フォントを FlexGridで使用した場合について説明します。 (Windows XP/Windows Server 2003 に JIS2004 対応フォントをインストールした場合も同様です) サロゲート ペア文字の表示 FlexGrid のデフォルト設定では、JIS2004 対応によって追加されたサロゲート ペア文字で表現される文字の一部が正 しく描画されません。これは、デフォルトの設定では UseCompatibleTextRendering プロパティが True に設定され、 GDI+ で描画されているためです。 例: か(U+304B)+ ゜(U+309A)で表示される「か゚」を表示した場合 正しく描画するためには、UseCompatibleTextRendering プロパティを False に設定し、GDI で描画します。 例: か(U+304B)+ ゜(U+309A)で表示される「か゚」を表示した場合(UseCompatibleTextRendering=False) FlexGrid で描画される結果は全て GDI または GDI+ における .NET Framework の仕様に依存します。 まとめ FlexGrid for WinForms にて JIS2004 対応フォントを扱う場合、UseCompatibleTextRendering プロパティの利用に よって対応できるのは画面上の文字列描画に関する問題だけです。それ以外の機能(入力、データベース接続など) については注意すべき点があります。 JIS2004 対応フォントの詳細については、予め MSDN ライブラリなどの各種参考文献をご覧いただくことをお勧めしま す。また、アプリケーション開発および運用の際には十分な注意を払い、入念な動作検証を行う必要があります。 注意: サロゲート ペア文字自体の入力を制御する直接的な機能はありません。 サロゲート ペア文字を含む編集セル内でのキー操作(カーソルキー、Backspace キー、Delete キー)は標準の TextBox コントロール等と同様です。 編集中セルではサロゲート ペア文字が正しく描画されます。FlexGrid では編集中のセルにて専用のエディタコン トロールを利用しますが、ここでは OS が提供するエディタクラスを使用しているためです。 上図のようなサロゲート ペア文字は4バイト(2文字)として扱われます。そのため、入力マスクなど入力文字数の 制御では注意が必要です。 サロゲート ペア文字を含むデータベースとの接続を行う場合は、予めご利用のデータベースにおける当該文字の 213 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 扱いに関して確認してください。FlexGrid ではデータベース側での問題(制限事項など)に対応することはできま せん。 印刷(プレビュー)の結果は、グリッドの描画結果に依存します。UseCompatibleTextRendering プロパティを False に設定することでサロゲート ペア文字を含むグリッドも正しく印刷されます。 セルラベル、Excel などのファイル出力では、サロゲート ペア文字を含む値も正しく表示、出力されます。 グループ化の機能を使用する FlexGrid の標準機能には実装されていませんが、コントロールを拡張することで実現可能です。詳細については、製品付属の FlexGroup サンプルを参照してください。 【FlexGroup サンプルの実行例】 関連項目 「チュートリアル」 境界線 境界線に関するタスクを紹介します。 コントロールの境界線スタイルを変更する コントロールの境界線スタイルを設定するには、BorderStyle プロパティを Fixed3D、FixedSingle、Light3D、None、XpThemes のいずれかに設定します。このプロパティは、デザイナでもコードでも 設定できます。 境界線 説明 Fixed3D 3D境界線 (デフォルト設定) FixedSingle 単線の境界線 Light3D 明るいくぼんだ境界線 None 境界線なし 214 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 境界線 説明 XpThemes XPテーマを使用して描画される境界線 【実行例】 3D 境界線 (Fixed3D)) 境界線は 3D(立体表示)になります。 単線の境界線 (FixedSingle)) 境界線は単線になります。 明るいくぼんだ境界線 (Light3D)) 境界線は、明るい 3D 表示になります。 215 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 境界線なし (None)) 境界線はありません。 (XpThemes)) XP テーマの境界線 境界線は、XP テーマ表示になります。 216 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【デザイナで設定する場合】 プロパティウィンドウで BorderStyle プロパティを探し、それを Fixed3D、FixedSingle、Light3D、None、XpThemes のい ずれかに設定します。この例では、BorderStyle プロパティは Fixed3D に設定されます。 【コードで設定する場合】 Form_Load イベントにコードを追加し、BorderStyle プロパティを Fixed3D、FixedSingle、Light3D、None、 、XpThemes の いずれかに設定します。以下のコードは、BorderStyle プロパティを Fixed3D に設定します。 Visual Basic コードの書き方 Visual Basic flex.BorderStyle = C1.Win.C1FlexGrid.Util.BaseControls.BorderStyleEnum.Fixed3D C# コードの書き方 C# flex.BorderStyle = C1.Win.C1FlexGrid.Util.BaseControls.BorderStyleEnum.Fixed3D; グリッドの境界線スタイルを設定する グリッドの境界線スタイルを設定するには、Style プロパティを Dotted、 、Double、 、Fillet、 、Flat、 、Groove、 、Inset、 、None、 、 Raised のいずれかに設定します。このプロパティは、デザイナまたはコードで、C1FlexGrid の組み込みスタイルを使用して 設定できます。 217 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 境界線 説明 Dotted 点線の境界線 Double 二重線の境界線 Fillet フィレット付きの境界線 Flat 実線のフラットな境界線(デフォル ト設定) Groove 溝付きの境界線 Inset くぼんだ境界線 None 境界線なし Raised 浮き出た境界線 【実行例】 点線の境界線 (Dotted)) セル境界線は点線になります。 二重線の境界線 (Double)) セル境界線は二重線になります。 218 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms フィレット付きの境界線 (Fillet)) セル境界線はフィレット付きになります。 フラットな境界線 (Flat)) セル境界線はフラットな実線になります。 219 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 溝付きの境界線 (Groove)) セル境界線は溝付きになります。 くぼんだ境界線 (Inset)) セル境界線はくぼんだ状態になります。 220 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 境界線なし (None)) セル境界線はありません。 浮き出た境界線 (Raised)) セル境界線は浮き出た状態になります。 221 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【デザイナで設定する場合】 1. 「スタイルエディタ」を開きます。スタイルエディタへのアクセス方法の詳細については、「スタイルエディタにアクセス」を 参照してください。 2. [組み込みスタイル 組み込みスタイル]で、Normal を選択します。右列で、Border プロパティを探して展開します。Style プロパティを Dotted、Double、Fillet、Flat、Groove、Inset、None、Raised のいずれかに設定します。この例では、Style プロパ ティは Dotted に設定されます。 3. 〈OK〉をクリックし、エディタを閉じます。 222 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【コードで設定する場合】 Form_Load イベントにコードを追加し、Normal スタイルの Style プロパティを Dotted、Double、Fillet、Flat、Groove、Inset、None、Raised のいずれかのオプションに設定します。以下のコード は、Style プロパティを Dotted に設定します。 Visual Basic コードの書き方 Visual Basic ' グリッドの境界線スタイルを変更する flex.Styles.Normal.Border.Style = C1.Win.C1FlexGrid.BorderStyleEnum.Dotted C# コードの書き方 C# // グリッドの境界線スタイルを変更する flex.Styles.Normal.Border.Style = C1.Win.C1FlexGrid.BorderStyleEnum.Dotted; グリッドの境界線を変更する(非表示、色変更) Normal 組み込みスタイルの Border プロパティを変更します。 【実行例】 Visual Basic コードの書き方 Visual Basic ' 垂直方向のみ境界線を表示します flex.Styles.Normal.Border.Direction = C1.Win.C1FlexGrid.BorderDirEnum.Vertical ' 境界線の色を赤にします flex.Styles.Normal.Border.Color = Color.Red C# コードの書き方 223 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# // 垂直方向のみ境界線を表示します flex.Styles.Normal.Border.Direction = C1.Win.C1FlexGrid.BorderDirEnum.Vertical; // 境界線の色を赤にします flex.Styles.Normal.Border.Color = Color.Red; 注意: CellBorder クラスの Direction プロパティで設定できる値は、垂直/水平/両方のいずれかになります。また、 垂直および水平で別々の線種や色を設定することはできません。 行/列の境界線を設定する 行や列 の Border プロパティを変更します。 【実行例】 Visual Basic コードの書き方 Visual Basic ' 1列目の境界線スタイルを変更します flex.Cols(1).StyleNew.Border.Style = C1.Win.C1FlexGrid.BorderStyleEnum.Double ' 1列目の境界線の色を黒にします flex.Cols(1).Style.Border.Color = Color.Black ' 2列目の境界線を垂直方向のみにします flex.Cols(2).StyleNew.Border.Direction = C1.Win.C1FlexGrid.BorderDirEnum.Vertical ' 2列目の境界線の色を赤にします flex.Cols(2).Style.Border.Color = Color.Red ' 3行目の境界線スタイルを水平方向のみにします flex.Rows(3).StyleNew.Border.Direction = C1.Win.C1FlexGrid.BorderDirEnum.Horizontal ' 3行目の境界線の色を青にします flex.Rows(3).Style.Border.Color = Color.Blue C# コードの書き方 C# 224 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // 1列目の境界線スタイルを変更します flex.Cols[1].StyleNew.Border.Style = C1.Win.C1FlexGrid.BorderStyleEnum.Double; // 1列目の境界線の色を黒にします flex.Cols[1].Style.Border.Color = Color.Black; // 2列目の境界線を垂直方向のみにします flex.Cols[2].StyleNew.Border.Direction = C1.Win.C1FlexGrid.BorderDirEnum.Vertical; // 2列目の境界線の色を赤にします flex.Cols[2].Style.Border.Color = Color.Red; // 3行目の境界線スタイルを水平方向のみにします flex.Rows[3].StyleNew.Border.Direction = C1.Win.C1FlexGrid.BorderDirEnum.Horizontal; // 3行目の境界線の色を青にします flex.Rows[3].Style.Border.Color = Color.Blue; 注意: CellBorder クラスの Direction プロパティで設定できる値は、垂直/水平/両方のいずれかになります。また、 垂直および水平で別々の線種や色を設定することはできません。 行/列の設定が重複した場合、列の設定が優先されます。 行や列にスタイルが設定されていない場合は、 StyleNew プロパティを使用して新しいスタイルを作成する必要 があります。 セルに線を描画する CellBorder クラスの Direction プロパティで設定できる値は、垂直/水平/両方のいずれかになります。例え ば、Direction プロパティに BorderDirEnum.Horizontal (水平) を設定すると、垂直の線 (列の境界線) が表示されなくなり ます。また、CellBorder クラスの Style や Width 、Color といった設定は、Direction プロパティで設定された種類 (垂直/ 水平/両方のいずれか) 全体に適用されるため、垂直線は赤色、水平線は青色といった設定はできません。 そのため、特定のセルで自由に線を描画したい場合は、オーナー描画の機能を使用します。OwnerDrawCell イベントを使用 してグリッドのセルに描画を行う場合は、セルの右側や下側に対して行う必要がある点に注意してください。これは、FlexGrid のそれぞれのセル枠線が各セルの右側と下側の線の集まりから形成されているためです。例えば、グリッドの2行毎に線を描 画する場合、下記のサンプルコードのように、セルの下側に対して線を描画する必要があります。 【実行例】 225 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' オーナー描画の機能を使用 flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw End Sub Private Sub flex_OwnerDrawCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles flex.OwnerDrawCell ' セルの描画を開始 e.DrawCell() ' 固定列を除いたセルで2行毎に下線を描画 If (e.Col <> 0) And ((e.Row Mod 2) = 0) Then ' セルを描画 e.DrawCell() Dim p1 As Pen = New Pen(Color.Red, 1) Dim b As Integer = e.Bounds.Bottom - p1.Width e.Graphics.DrawLine(p1, e.Bounds.Left, b, e.Bounds.Right, b) End If ' 3列目は右側にも線を描画 If e.Col = 3 Then Dim p2 As Pen = New Pen(Color.YellowGreen, 1) Dim r As Integer = e.Bounds.Right - p2.Width e.Graphics.DrawLine(p2, r, e.Bounds.Top, r, e.Bounds.Bottom) End If ' 描画終了 e.Handled = True End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // オーナー描画の機能を使用 flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw; } private void flex_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e) { // セルの描画を開始 e.DrawCell(); // 固定列を除いたセルで2行毎に下線を描画 if ((e.Col != 0) && ((e.Row % 2) == 0)) { Pen p1 = new Pen(Color.Red, 1); float b = e.Bounds.Bottom - p1.Width; e.Graphics.DrawLine(p1, e.Bounds.Left, b, e.Bounds.Right, b); } // 3列目は右側にも線を描画 if (e.Col == 3) 226 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms { スクロールバー スクロールバーに関するタスクを紹介します。 スクロールバーの表示/非表示を設定する スクロールバーの表示は、ScrollBars プロパティで制御します。(デフォルト Both) ScrollBars.Horizontal(水平スクロールバーのみ)、ScrollBars.Vertical(垂直スクロールバーのみ)、ScrollBars.Both(両方)の いずれかに設定すると、スクロールバーが表示されます。ScrollBars.None に設定すると、スクロールバーは表示されません。 【実行例: 【実行例:Horizontal】】 【実行例: 【実行例:Vertical】】 227 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例: 【実行例:Both】】 【実行例: 【実行例:None】】 Visual Basic コードの書き方 Visual Basic ' 水平スクロールバーのみ表示 flex.ScrollBars = ScrollBars.Horizontal C# コードの書き方 C# // 水平スクロールバーのみ表示 flex.ScrollBars = ScrollBars.Horizontal; 228 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 注意: ScrollBars.None 以外に設定しても、グリッド内に行・列がすべて表示されている場合、スクロールバーは表示さ れません。スクロールバーはグリッドの内容がコントロールに収まらない場合にのみ表示されます。 スクロールバーの幅を変更する機能は用意されていません。C1FlexGrid コントロールではシステムのスクロール バーを使用します。 関連項目 「常にスクロールバーを表示する」 常にスクロールバーを表示する ScrollOptions プロパティに ScrollFlags.AlwaysVisible を設定することで、行や列がFlexGridコントロール内にすべて表示 されている場合でも、スクロールバーを表示することができます。垂直 垂直(または水平 水平)スクロールバーのみを常に表示したい場 合は、ScrollOptionsプロパティに ScrollFlags.AlwaysVisibleを設定した上で、ScrollBars プロパティを設定します。 【実行例】 Visual Basic コードの書き方 Visual Basic flex.ScrollOptions = C1.Win.C1FlexGrid.ScrollFlags.AlwaysVisible flex.ScrollBars = ScrollBars.Both ' 水平スクロールバーのみを表示 'flex.ScrollBars = ScrollBars.Horizontal ' 垂直スクロールバーのみを表示 'flex.ScrollBars = ScrollBars.Vertical C# コードの書き方 C# flex.ScrollOptions = C1.Win.C1FlexGrid.ScrollFlags.AlwaysVisible; flex.ScrollBars = ScrollBars.Both; 229 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // 水平スクロールバーのみを表示 //flex.ScrollBars = ScrollBars.Horizontal; // 垂直スクロールバーのみを表示 //flex.ScrollBars = ScrollBars.Vertical; スクロールバーの表示状態を取得する 現在のスクロールバーの表示状態を取得するには、ScrollBarsVisible プロパティを使用します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click MessageBox.Show(flex.ScrollBarsVisible.ToString) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { MessageBox.Show(flex.ScrollBarsVisible.ToString()); } スクロール動作を変更する ScrollOptions プロパティを設定します。(デフォルトは ScrollFlags.None) スクロール動作のオプション、ScrollFlags列挙体の設定を2つ以上設定するには、Or(|)を使用します。 Visual Basic コードの書き方 230 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic ' スクロールバーを常に表示しつつ、行列単位でスクロールする flex.ScrollOptions = C1.Win.C1FlexGrid.ScrollFlags.AlwaysVisible Or _ C1.Win.C1FlexGrid.ScrollFlags.ScrollByRowColumn C# コードの書き方 C# // スクロールバーを常に表示しつつ、行列単位でスクロールする flex.ScrollOptions = C1.Win.C1FlexGrid.ScrollFlags.AlwaysVisible | C1.Win.C1FlexGrid.ScrollFlags.ScrollByRowColumn; VS-FlexGrid と同様のスクロール動作にする ActiveX 製品 VS-FlexGrid Pro のスクロール動作には、行・列単位でスクロールすることと、スクロールバーを動かしている 間はスクロールしないといった特徴があります。FlexGrid for WinForms でこの動作を実現するには、ScrollOptions プロパ ティに ScrollFlags.DelayedScroll と ScrollFlags.ScrollByRowColumn を設定します。 ScrollFlags 列挙体を組み合わせて設定する際は、VB:「Or」 C#:「|」を使用します。 Visual Basic コードの書き方 Visual Basic flex.ScrollOptions = C1.Win.C1FlexGrid.ScrollFlags.DelayedScroll Or _ C1.Win.C1FlexGrid.ScrollFlags.ScrollByRowColumn C# コードの書き方 C# flex.ScrollOptions = C1.Win.C1FlexGrid.ScrollFlags.DelayedScroll | C1.Win.C1FlexGrid.ScrollFlags.ScrollByRowColumn; スクロールチップを表示する ScrollOptions プロパティに ScrollFlags.ShowScrollTips を設定し、ShowScrollTip イベントを使用します。 【実行例】 231 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' スクロールチップを表示する flex.ScrollOptions = C1.Win.C1FlexGrid.ScrollFlags.ShowScrollTips End Sub Private Sub flex_ShowScrollTip(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.ToolTipEventArgs) Handles flex.ShowScrollTip e.ToolTipText = String.Format("row {0}", e.Row) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // スクロールチップを表示する flex.ScrollOptions = C1.Win.C1FlexGrid.ScrollFlags.ShowScrollTips; } private void flex_ShowScrollTip(object sender, C1.Win.C1FlexGrid.ToolTipEventArgs e) { e.ToolTipText = string.Format("row {0}", e.Row); } スクロール位置を変更する TopRow プロパティで垂直方向の位置を、LeftCol プロパティで水平方向の位置を設定します。 【実行例】 232 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i As Integer = 1 To flex.Rows.Count - 1 flex(i, 0) = i Next For j As Integer = 0 To flex.Cols.Count - 1 flex(0, j) = j Next flex.Cols(0).Width = 30 ' スクロール位置を変更する flex.TopRow = 10 flex.LeftCol = 3 End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { for(int i=1; i { flex[i, 0] = i; } for(int j=0; j { flex[0, j] = j; } // スクロール位置を変更する flex.TopRow = 10; flex.LeftCol = 3; 233 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms } 注意: ピクセル単位でスクロールするには、ScrollPosition プロパティを使用します。 特定のセルを表示するには、ShowCell メソッドを使用します。 関連項目 「任意のセルを表示する」 スタイル 組み込みスタイルやカスタムスタイルに関するタスクを紹介します。「スタイルの要素」にあるタスクは、組み込みスタイルとカ スタムスタイル、どちらでも使用できます。 関連項目 「セルの外観」 組み込みスタイルの位置について 234 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 通常セルの外観を変更する Normal 組み込みスタイルを利用することで、通常セル全体のデフォルトスタイルを設定できます。これは、グリッド上の通常 セル全てに対して同一スタイルを設定したいような場合に有効な手法です。 【実行例】 235 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic ' デフォルトスタイルを設定する flex.Styles.Normal.BackColor = Color.LemonChiffon flex.Styles.Normal.ForeColor = Color.Red flex.Styles.Normal.DataType = GetType(Double) flex.Styles.Normal.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter flex.Styles.Normal.Border.Style = C1.Win.C1FlexGrid.BorderStyleEnum.Double flex.Styles.Normal.Border.Color = Color.Green flex.Styles.Normal.Format = "#.#0" ' Normalスタイルから継承されているFixedスタイルのFormatをクリア flex.Styles.Fixed.Format = "" C# コードの書き方 C# // デフォルトスタイルを設定する flex.Styles.Normal.BackColor = Color.LemonChiffon; flex.Styles.Normal.ForeColor = Color.Red; flex.Styles.Normal.DataType = typeof(double); flex.Styles.Normal.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter; flex.Styles.Normal.Border.Style = C1.Win.C1FlexGrid.BorderStyleEnum.Double; flex.Styles.Normal.Border.Color = Color.Green; flex.Styles.Normal.Format = "#.#0"; // Normalスタイルから継承されているFixedスタイルのFormatをクリア flex.Styles.Fixed.Format = ""; 注意: Fixed 組み込みスタイルの何も設定していないプロパティの値は、親スタイルの Normal スタイルから継承され ます。 Normal 組み込みスタイルは、スタイルエディタからも設定できます。 236 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 関連項目 CellStyle クラス 「スタイルエディタにアクセス」 固定セルの外観を変更する Fixed 組み込みスタイルを利用することで、固定セル全体の外観を変更します。 【実行例】 Visual Basic コードの書き方 Visual Basic ' 固定セルの背景色を黄色に設定 flex.Styles.Fixed.BackColor = Color.Yellow C# コードの書き方 C# // 固定セルの背景色を黄色に設定 flex.Styles.Fixed.BackColor = Color.Yellow; 注意: Fixed 組み込みスタイルの何も設定していないプロパティの値は、親スタイルのNormal スタイルから継承されま す。 Fixed 組み込みスタイルは、スタイルエディタからも設定できます。 関連項目 CellStyle クラス 「スタイルエディタにアクセス」 237 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 選択されているセルの外観を変更する Highlight 組み込みスタイルの背景色や文字色などを変更します。 【実行例】 Visual Basic コードの書き方 Visual Basic ' 選択色を黄緑にします flex.Styles.Highlight.BackColor = Color.YellowGreen C# コードの書き方 C# // 選択色を黄緑にします flex.Styles.Highlight.BackColor = Color.YellowGreen; 注意: 組み込みスタイルは、スタイルエディタ からも設定できます。 カレントセルの外観は、Focus 組み込みスタイルで変更します。 コントロールにフォーカスがないときにセルを強調表示するかどうかを指定するには、Highlight プロパティを使 用します。 選択方法を変更するには、SelectionMode プロパティを変更します。 カレントセルの外観を変更する Focus 組み込みスタイルの背景色や文字色などを変更します。 【実行例】 238 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic ' カレントセルの背景色を黄色に変更 flex.Styles.Focus.BackColor = Color.Yellow ' カレントセルの文字色を赤に変更 flex.Styles.Focus.ForeColor = Color.Red C# コードの書き方 C# // カレントセルの背景色を黄色に変更 flex.Styles.Focus.BackColor = Color.Yellow; // カレントセルの文字色を赤に変更 flex.Styles.Focus.ForeColor = Color.Red; 注意: 組み込みスタイルは、スタイルエディタ からも設定できます。 カレントセルのフォーカス枠を変更する FocusRect プロパティを変更します。(デフォルトは Light) 【実行例】 太いフォーカス矩形( 太いフォーカス矩形(Heavy)) 239 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 くぼんだフォーカス矩形( くぼんだフォーカス矩形(Inset)) 【実行例】 細いフォーカス矩形( 細いフォーカス矩形(Light)) 240 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 浮き出たフォーカス矩形( 浮き出たフォーカス矩形(Raised)) 【実行例】 実線のフォーカス矩形( 実線のフォーカス矩形(Solid)) 矩形の色は、Highlight 組み込みスタイルのBackColor プロパティの色になります。 241 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 フォーカス矩形なし( フォーカス矩形なし(None)) フォーカス枠をなしにすると、カレントセルはHighlight 組み込みスタイルで描画されます。 Visual Basic コードの書き方 Visual Basic flex.FocusRect = C1.Win.C1FlexGrid.FocusRectEnum.Heavy C# コードの書き方 C# flex.FocusRect = C1.Win.C1FlexGrid.FocusRectEnum.Heavy; 注意: 注意:組み込みスタイルは、スタイルエディタ からも設定できます。 242 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms カレントセルのフォーカス枠の色を変更する FocusRect プロパティを Solid にします。矩形の色は、Highlight 組み込みスタイルの BackColor プロパティの色になりま す。 【実行例】 Visual Basic コードの書き方 Visual Basic ' フォーカス枠を Solid にします flex.FocusRect = C1.Win.C1FlexGrid.FocusRectEnum.Solid ' フォーカス枠の色を赤にします flex.Styles.Highlight.BackColor = Color.Red ' カレントセルの背景色を黄色にします flex.Styles.Focus.BackColor = Color.Yellow C# コードの書き方 C# // フォーカス枠を Solid にします flex.FocusRect = C1.Win.C1FlexGrid.FocusRectEnum.Solid; // フォーカス枠の色を赤にします flex.Styles.Highlight.BackColor = Color.Red; // カレントセルの背景色を黄色にします flex.Styles.Focus.BackColor = Color.Yellow; 注意: 線種は Solid のみになります。また、線の太さを変更することはできません。 組み込みスタイルは、スタイルエディタ からも設定できます。 1行おきのスタイルを設定する Alternate 組み込みスタイルとNormal スタイルを設定します。 243 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 Visual Basic コードの書き方 Visual Basic ' 1行おきのスタイルを設定します flex.Styles.Alternate.BackColor = Color.YellowGreen ' 通常セルのスタイルを設定します flex.Styles.Normal.BackColor = Color.Yellow C# コードの書き方 C# // 1行おきのスタイルを設定します flex.Styles.Alternate.BackColor = Color.YellowGreen; // 通常セルのスタイルを設定します flex.Styles.Normal.BackColor = Color.Yellow; 注意 注意: Alternate 組み込みスタイルの何も設定していないプロパティの値は、親スタイルの Normal スタイルから継承 されます。 Alternate や Normal 組み込みスタイルは、スタイルエディタからも設定できます。 関連項目 CellStyle クラス スタイルエディタにアクセス 固定セルや静止セルも1行おきに外観を変更する 固定セルや静止セルも1行おきに外観を変更する 1行おきに行のスタイルを変更する場合、組み込みスタイルAlternate を使用します。ただし、Alternate 組み込みスタイルの 対象には、固定セルや静止セルが含まれていません。また、固定/静止セルについては、Fixed/Frozen 組み込みスタイル 244 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms にて設定しますが、こちらは固定/静止セル全体に影響することになります。 そのため、固定セルや静止セルも1行おきに背景色などを変更する場合は、カスタムスタイルを作成して1行おきの固定/静 止セルに適用する方法で対応します。下記のように2通りの方法があります。 【実行例】 ループ処理でカスタムスタイルを設定 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex.Cols.Fixed = 1 flex.Cols.Frozen = 1 ' Alternate プロパティを設定 flex.Styles.Alternate.BackColor = Color.SkyBlue ' 静止セルの背景色を通常セルと同じにします flex.Styles.Frozen.BackColor = flex.Styles.Normal.BackColor ' Alternate と同じ背景色のカスタムスタイルを作成 flex.Styles.Add("AlternateFrozen") flex.Styles("AlternateFrozen").BackColor = flex.Styles.Alternate.BackColor ' 作成したカスタムスタイル1行おきに固定/静止セルに設定 For i As Integer = flex.Rows.Fixed To flex.Rows.Count - 1 If i Mod 2 = 1 Then ' 固定列 flex.SetCellStyle(i, 0, flex.Styles("AlternateFrozen")) ' 静止列 flex.SetCellStyle(i, 1, flex.Styles("AlternateFrozen")) End If Next flex.Cols(0).Caption = "固定列" flex.Cols(1).Caption = "静止列" End Sub 245 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex.Cols.Fixed = 1; flex.Cols.Frozen = 1; // Alternate プロパティを設定 flex.Styles.Alternate.BackColor = Color.AliceBlue; // 静止セルの背景色を通常セルと同じにします flex.Styles.Frozen.BackColor = flex.Styles.Normal.BackColor; // Alternate と同じ背景色のカスタムスタイルを作成 flex.Styles.Add("AlternateFrozen"); flex.Styles["AlternateFrozen"].BackColor = flex.Styles.Alternate.BackColor; // 作成したカスタムスタイル1行おきに固定/静止セルに設定 for (int i = flex.Rows.Fixed; i < flex.Rows.Count; i++) { if (i % 2 == 1) { // 固定列 flex.SetCellStyle(i, 0, flex.Styles["AlternateFrozen"]); // 静止列 flex.SetCellStyle(i, 1, flex.Styles["AlternateFrozen"]); } } flex.Cols[0].Caption = "固定列"; flex.Cols[1].Caption = "静止列"; } オーナー描画を使用してカスタムスタイルを設定 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex.Cols.Fixed = 1 flex.Cols.Frozen = 1 flex.Cols(0).Caption = "固定列" flex.Cols(1).Caption = "静止列" ' Alternate プロパティを設定 flex.Styles.Alternate.BackColor = Color.SkyBlue ' 静止セルの背景色を通常セルと同じにします flex.Styles.Frozen.BackColor = flex.Styles.Normal.BackColor ' Alternate と同じ背景色のカスタムスタイルを作成 flex.Styles.Add("AlternateCell") flex.Styles("AlternateCell").BackColor = flex.Styles.Alternate.BackColor ' オーナー描画 flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw End Sub Private Sub flex_OwnerDrawCell(ByVal sender As Object, ByVal e As 246 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles flex.OwnerDrawCell If e.Row >= flex.Rows.Fixed And e.Row Mod 2 = 1 Then If e.Col < flex.Cols.Fixed + flex.Cols.Frozen Then ' 作成したカスタムスタイル1行おきに ' 固定/静止セルに設定 e.Style = flex.Styles("AlternateCell") End If End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex.Cols.Fixed = 1; flex.Cols.Frozen = 1; flex.Cols[0].Caption = "固定列"; flex.Cols[1].Caption = "静止列"; // Alternate プロパティを設定 flex.Styles.Alternate.BackColor = Color.SkyBlue; // 静止セルの背景色を通常セルと同じにします flex.Styles.Frozen.BackColor = flex.Styles.Normal.BackColor; // Alternate と同じ背景色のカスタムスタイルを作成 flex.Styles.Add("AlternateCell"); flex.Styles["AlternateCell"].BackColor = flex.Styles.Alternate.BackColor; // オーナー描画 flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw; } private void flex_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e) { if ((e.Row % 2 == 1) && (e.Row >= flex.Rows.Fixed)) { if (e.Col < flex.Cols.Fixed + flex.Cols.Frozen) { // 作成したカスタムスタイル1行おきに // 固定/静止セルに設定 e.Style = flex.Styles["AlternateCell"]; } } } 関連項目 CellStyle クラス スタイルエディタにアクセス 1行おきのスタイルを設定する Excel スタイルのヘッダを使用する ShowThemedHeaders プロパティをShowThemedHeadersEnum.None に設定し、組み込みスタイル 247 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms の SelectedRowHeader/SelectedColumnHeader を変更します。 【実行例】 Visual Basic コードの書き方 Visual Basic flex.ShowThemedHeaders = C1.Win.C1FlexGrid.ShowThemedHeadersEnum.None flex.Styles.SelectedRowHeader.BackColor = Color.Yellow flex.Styles.SelectedColumnHeader.BackColor = Color.YellowGreen C# コードの書き方 C# flex.ShowThemedHeaders = C1.Win.C1FlexGrid.ShowThemedHeadersEnum.None; flex.Styles.SelectedRowHeader.BackColor = Color.Yellow; flex.Styles.SelectedColumnHeader.BackColor = Color.YellowGreen; 注意: 注意:SelectedColumnHeader/ /SelectedRowHeader スタイルは、行または列のヘッダがXPのテーマで描画されて いない場合、およびVisualStyle プロパティがVisualStyle.Custom に設定されている場合に有効になります。 行/列の外観を変更する 行および列の外観は Style プロパティで、特定の行/列ヘッダの外観は StyleFixed プロパティにて制御しま す。StyleNew/StyleFixedNew プロパティで新しいスタイルを作成するか、作成したカスタムスタイルを行や列に適用しま す。 【実行例】 248 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 2列目の列ヘッダに新しいスタイルを作成、背景色・文字色を変更 flex.Cols(2).StyleFixedNew.BackColor = Color.YellowGreen flex.Cols(2).StyleFixed.ForeColor = Color.LightPink ' 2列目に新しいスタイルを作成、背景色・文字色を変更 flex.Cols(2).StyleNew.BackColor = Color.Yellow flex.Cols(2).Style.ForeColor = Color.Red ' 3行目に新しいスタイルを作成、背景色・文字色を変更 flex.Rows(3).StyleNew.BackColor = Color.Beige flex.Rows(3).Style.ForeColor = Color.Blue ' 3行目の行ヘッダに新しいスタイルを作成、背景色・文字色を変更 flex.Rows(3).StyleFixedNew.BackColor = Color.Orange flex.Rows(3).StyleFixed.ForeColor = Color.White ' データの設定 flex(0, 2) = "2列目" flex(1, 2) = "1行2列" flex(3, 0) = "3行目" flex(3, 1) = "3行1列" ' カスタムスタイルを適用する場合 'flex.Styles.Add("Col2Style") 'flex.Styles("Col2Style").BackColor = Color.Yellow 'flex.Styles("Col2Style").ForeColor = Color.Red 'flex.Cols(2).Style = flex.Styles("Col2Style") End Sub C# コードの書き方 C# rivate void Form1_Load(object sender, EventArgs e) 249 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms { // 2列目の列ヘッダに新しいスタイルを作成、背景色・文字色を変更 flex.Cols[2].StyleFixedNew.BackColor = Color.YellowGreen; flex.Cols[2].StyleFixed.ForeColor = Color.LightPink; // 2列目に新しいスタイルを作成、背景色・文字色を変更 flex.Cols[2].StyleNew.BackColor = Color.Yellow; flex.Cols[2].Style.ForeColor = Color.Red; // 3行目に新しいスタイルを作成、背景色・文字色を変更 flex.Rows[3].StyleNew.BackColor = Color.Beige; flex.Rows[3].Style.ForeColor = Color.Blue; // 3行目の行ヘッダに新しいスタイルを作成、背景色・文字色を変更 flex.Rows[3].StyleFixedNew.BackColor = Color.Orange; flex.Rows[3].StyleFixed.ForeColor = Color.White; // データの設定 flex[0, 2] = "2列目"; flex[1, 2] = "1行2列"; flex[3, 0] = "3行目"; flex[3, 1] = "3行1列"; // カスタムスタイルを適用する場合 //flex.Styles.Add("Col2Style"); //flex.Styles["Col2Style"].BackColor = Color.Yellow; //flex.Styles["Col2Style"].ForeColor = Color.Red; //flex.Cols[2].Style = flex.Styles["Col2Style"]; } 注意: 行、列両方のスタイルが設定されている場合、列のスタイルが優先されます。 カスタムスタイルは、スタイルエディタからも作成できます。 関連項目 セルの外観 カスタムスタイルを作成する スタイルエディタにアクセス カスタムスタイルを作成する Add メソッドで作成します。作成したカスタムスタイルは、行や列、セル(範囲)に自由に適用できます。 注意: カスタムスタイルは繰り返し使用できます。同じ要素を持つスタイルを何度も作成しないようにしてください。 作成したカスタムスタイルの要素を変更すると、スタイルを適用しているすべてのセルが影響を受けます。 【実行例】 250 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' カスタムスタイルを作成します flex.Styles.Add("CustomStyle1") ' スタイルの要素を変更します flex.Styles("CustomStyle1").BackColor = Color.YellowGreen flex.Styles("CustomStyle1").ForeColor = Color.AliceBlue ' 同じ処理です 'Dim cs As C1.Win.C1FlexGrid.CellStyle 'cs = flex.Styles.Add("CustomStyle1") 'cs.BackColor = Color.Red 'cs.ForeColor = Color.AliceBlue ' 行に適用します flex.Rows(1).Style = flex.Styles("CustomStyle1") ' 列に適用します flex.Cols(1).Style = flex.Styles("CustomStyle1") ' セルに適用します flex.SetCellStyle(3, 4, "CustomStyle1") ' セル範囲に適用します Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetCellRange(4, 2, 5, 3) cr.Style = flex.Styles("CustomStyle1") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' ご注意 ' 下記のようにスタイルの要素を変更すると、 ' カスタムスタイル"CustomStyle1"を ' 適用したすべてのセルが影響を受けます 'flex.Cols(1).Style.BackColor = Color.Yellow ' 回避するには、別のスタイルを適用します 251 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.Styles.Add("CustomStyle2") flex.Styles("CustomStyle2").BackColor = Color.Yellow flex.Cols(1).Style = flex.Styles("CustomStyle2") ' または、スタイルをクリアして、再度スタイルを作成します 'flex.Cols(1).Clear(C1.Win.C1FlexGrid.ClearFlags.Style) 'flex.Cols(1).StyleNew.BackColor = Color.Yellow End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // カスタムスタイルを作成します flex.Styles.Add("CustomStyle1"); // スタイルの要素を変更します flex.Styles["CustomStyle1"].BackColor = Color.YellowGreen; flex.Styles["CustomStyle1"].ForeColor = Color.AliceBlue; // 同じ処理です //C1.Win.C1FlexGrid.CellStyle cs; //cs = flex.Styles.Add("CustomStyle1"); //cs.BackColor = Color.Red; //cs.ForeColor = Color.AliceBlue; // 行に適用します flex.Rows[1].Style = flex.Styles["CustomStyle1"]; // 列に適用します flex.Cols[1].Style = flex.Styles["CustomStyle1"]; // セルに適用します flex.SetCellStyle(3, 4, "CustomStyle1"); // セル範囲に適用します C1.Win.C1FlexGrid.CellRange cr; cr = flex.GetCellRange(4, 2, 5, 3); cr.Style = flex.Styles["CustomStyle1"]; } private void button1_Click(object sender, EventArgs e) { // ご注意 // 下記のようにスタイルの要素を変更すると、 // カスタムスタイル"CustomStyle1"を // 適用したすべてのセルが影響を受けます //flex.Cols[1].Style.BackColor = Color.Yellow; // 回避するには、別のスタイルを適用します flex.Styles.Add("CustomStyle2"); flex.Styles["CustomStyle2"].BackColor = Color.Yellow; flex.Cols[1].Style = flex.Styles["CustomStyle2"]; // または、スタイルをクリアして、再度スタイルを作成します //flex.Cols[1].Clear(C1.Win.C1FlexGrid.ClearFlags.Style); //flex.Cols[1].StyleNew.BackColor = Color.Yellow; } 注意: 行、列両方のスタイルが設定されている場合、列のスタイルが優先されます。 252 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms カスタムスタイルは、スタイルエディタからも作成できます。 関連項目 セルの外観 セル(範囲)の外観を変更する セル(範囲)の外観を変更する カスタムスタイルを作成して任意のセル、セル範囲に適用します。スタイルの適用には、SetCellStyle メソッドやStyle プロパ ティを使用します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' カスタムスタイルを作成 Dim cs As C1.Win.C1FlexGrid.CellStyle cs = flex.Styles.Add("OrangeStyle") cs.BackColor = Color.Orange ' 2行3列目のセルに適用 flex.SetCellStyle(2, 3, "OrangeStyle") ' セル範囲に適用 Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetCellRange(5, 1, 6, 3) cr.Style = flex.Styles("OrangeStyle") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) 253 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms { // カスタムスタイルを作成 C1.Win.C1FlexGrid.CellStyle cs; cs = flex.Styles.Add("OrangeStyle"); cs.BackColor = Color.Orange; // 2行3列目のセルに適用 flex.SetCellStyle(2, 3, "OrangeStyle"); // セル範囲に適用 C1.Win.C1FlexGrid.CellRange cr; cr = flex.GetCellRange(5, 1, 6, 3); cr.Style = flex.Styles["OrangeStyle"]; } 注意: 行、列両方のスタイルが設定されている場合、列のスタイルが優先されます。 カスタムスタイルは、スタイルエディタからも作成できます。 関連項目 セルの外観 カスタムスタイルを作成する 適用したスタイルをクリアする 行や列の Clear メソッドやグリッドの Clear メソッドを使用します。 【実行例】 (クリア前) 【実行例】 (クリア後) 254 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' カスタムスタイルを作成します flex.Styles.Add("CustomStyle1") ' スタイルの要素を変更します flex.Styles("CustomStyle1").BackColor = Color.YellowGreen flex.Styles("CustomStyle1").ForeColor = Color.AliceBlue ' 行に適用します flex.Rows(1).Style = flex.Styles("CustomStyle1") ' 列に適用します flex.Cols(1).Style = flex.Styles("CustomStyle1") ' セルに適用します flex.SetCellStyle(3, 4, "CustomStyle1") ' セル範囲に適用します Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetCellRange(4, 2, 5, 3) cr.Style = flex.Styles("CustomStyle1") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 1行目のスタイルをクリアします flex.Rows(1).Clear(C1.Win.C1FlexGrid.ClearFlags.Style) 'flex.Rows(1).Style = Nothing ' 1列目のスタイルをクリアします flex.Cols(1).Clear(C1.Win.C1FlexGrid.ClearFlags.Style) 'flex.Cols(1).Style = Nothing ' セルに設定したスタイルをクリアします 'flex.Clear(C1.Win.C1FlexGrid.ClearFlags.Style, 3, 4) ' セル範囲に設定したスタイルをクリアします 'flex.Clear(C1.Win.C1FlexGrid.ClearFlags.Style, 4, 2, 5, 3) End Sub 255 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // カスタムスタイルを作成します flex.Styles.Add("CustomStyle1"); // スタイルの要素を変更します flex.Styles["CustomStyle1"].BackColor = Color.YellowGreen; flex.Styles["CustomStyle1"].ForeColor = Color.AliceBlue; // 行に適用します flex.Rows[1].Style = flex.Styles["CustomStyle1"]; // 列に適用します flex.Cols[1].Style = flex.Styles["CustomStyle1"]; // セルに適用します flex.SetCellStyle(3, 4, "CustomStyle1"); // セル範囲に適用します C1.Win.C1FlexGrid.CellRange cr; cr = flex.GetCellRange(4, 2, 5, 3); cr.Style = flex.Styles["CustomStyle1"]; } private void button1_Click(object sender, EventArgs e) { // 1行目のスタイルをクリアします flex.Rows[1].Clear(C1.Win.C1FlexGrid.ClearFlags.Style); //flex.Rows[1].Style = null; // 1列目のスタイルをクリアします flex.Cols[1].Clear(C1.Win.C1FlexGrid.ClearFlags.Style); //flex.Cols[1].Style = null; //// セルに設定したスタイルをクリアします //flex.Clear(C1.Win.C1FlexGrid.ClearFlags.Style, 3, 4); //// セル範囲に設定したスタイルをクリアします //flex.Clear(C1.Win.C1FlexGrid.ClearFlags.Style, 4, 2, 5, 3); } 注意: 注意:スタイルの各要素のみをクリアする(デフォルトに戻す)処理については、「スタイル要素の設定をクリアする」を参 照してください。 データの内容に応じてスタイルを適用する CellChanged イベントまたは ValidateEdit イベントを使用して編集後のデータを取得・判別し、作成したカスタムスタイルを 適用します。 【実行例】 256 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 大きな値に適用するカスタムスタイルを作成します Dim cs As C1.Win.C1FlexGrid.CellStyle cs = flex.Styles.Add("BigValue") cs.Font = New Font(Font, FontStyle.Italic) cs.BackColor = Color.Gold End Sub ' ValidateEditイベントを使用する場合 Private Sub flex_ValidateEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.ValidateEditEventArgs) Handles flex.ValidateEdit ' 50,000より大きい値の場合、カスタムスタイルを適用します ' それ以外はスタイルに Nothing を設定してリセットします Dim cs As C1.Win.C1FlexGrid.CellStyle cs = Nothing If Val(flex.Editor.Text) >= 50000 Then cs = flex.Styles("BigValue") End If flex.SetCellStyle(e.Row, e.Col, cs) End Sub 'Private Sub flex_CellChanged(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.CellChanged ' 50,000より大きい値の場合、カスタムスタイルを適用します ' それ以外はスタイルに Nothing を設定してリセットします ' Dim cs As C1.Win.C1FlexGrid.CellStyle ' cs = Nothing ' If Val(flex(e.Row, e.Col)) >= 50000 Then ' cs = flex.Styles("BigValue") ' End If ' flex.SetCellStyle(e.Row, e.Col, cs) 'End Sub 257 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 大きな値に適用するカスタムスタイルを作成します C1.Win.C1FlexGrid.CellStyle cs; cs = flex.Styles.Add("BigValue"); cs.Font = new Font(Font, FontStyle.Italic); cs.BackColor = Color.Gold; } // ValidateEditイベントを使用する場合 private void flex_ValidateEdit(object sender, C1.Win.C1FlexGrid.ValidateEditEventArgs e) { // 50,000より大きい値の場合、カスタムスタイルを適用します // それ以外はスタイルに null を設定してリセットします C1.Win.C1FlexGrid.CellStyle cs; cs = null; if (int.Parse(flex.Editor.Text) >= 50000) { cs = flex.Styles["BigValue"]; } flex.SetCellStyle(e.Row, e.Col, cs); } //private void flex_CellChanged(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) //{ // 50,000より大きい値の場合、カスタムスタイルを適用します // // それ以外はスタイルに null を設定してリセットします //C1.Win.C1FlexGrid.CellStyle cs; // cs = null; // if (int.Parse(flex[e.Row, e.Col].ToString()) >= 50000) // { // cs = flex.Styles["BigValue"]; // } // flex.SetCellStyle(e.Row, e.Col, cs); //} カスタムスタイルは、設計時に作成することもできます。次の手順では、スタイルエディタを使用して BigValue という新し いCellStyle を作成し、BackColor プロパティを Gold に設定します。 1. [スタイルエディタ スタイルエディタ]を開きます。スタイルエディタ スタイルエディタへのアクセス方法の詳細については、「スタイルエディタにアクセス」を 参照してください。 2. 〈追加 追加〉をクリックし、新しいスタイルを作成します。 3. CustomStyle1 をダブルクリックし、名前を BigValue に変更します。終わったら[Enter]を押します。 4. 右ペインの BackColor プロパティを探し、それを Gold に設定します。 258 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 5. Font プロパティを探し、その横の〈...〉ボタンをクリックして[フォント フォント]ダイアログボックスを開きます。 6. [スタイル スタイル]ボックスで斜体 斜体に設定します。 7. 〈OK〉をクリックし、[フォント フォント]ダイアログを閉じます。 259 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 8. 〈OK〉をクリックし、[FlexGrid スタイルエディタ スタイルエディタ]を閉じます。 関連項目 セルの外観 カスタムスタイルを作成する 設定したスタイルを優先させる カスタムスタイルを作成し、行や列、セルに適用している場合でも、フォーカスのあるセルやハイライト(選択)されているセルの 外観は、Focus や Highlight といった組み込みスタイルにて制御されることになります。 FocusやHiglightの外観よりも優先させたい外観がある場合は、オーナー描画の機能を使用します。OwnerDrawCell イベン ト内で任意のセルにスタイルを適用することで、フォーカスが移動した際やハイライトされた場合でも、変更したセルの外観が 表示されます。下記サンプルコードでは、3行目を通常のカスタムスタイルで、5行目をオーナー描画で外観を変更しています。 5行目のみ変更したスタイルが優先されていることを確認してください。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With flex .SelectionMode = C1.Win.C1FlexGrid.SelectionModeEnum.Row .Styles.Highlight.BackColor = Color.Blue .Styles.Highlight.ForeColor = Color.Red .Styles.Focus.BackColor = Color.Yellow .Styles.Focus.ForeColor = Color.Black End With ' 通常のカスタムスタイル ' FocusやHiglightの外観が優先される flex.Styles.Add("Style1") With flex.Styles("Style1") .BackColor = Color.Red 260 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms .ForeColor = Color.Yellow End With flex.Rows(3).Style = flex.Styles("Style1") ' オーナー描画 flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw End Sub Private Sub flex_OwnerDrawCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles flex.OwnerDrawCell ' オーナー描画の利用 ' FocusやHiglightの外観よりも優先される If e.Row = 5 And e.Col >= flex.Cols.Fixed Then e.Style = flex.Styles("Style1") End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex.SelectionMode = C1.Win.C1FlexGrid.SelectionModeEnum.Row; flex.Styles.Highlight.BackColor = Color.Blue; flex.Styles.Highlight.ForeColor = Color.Red; flex.Styles.Focus.BackColor = Color.Yellow; flex.Styles.Focus.ForeColor = Color.Black; // 通常のカスタムスタイル // FocusやHiglightの外観が優先される flex.Styles.Add("Style1"); flex.Styles["Style1"].BackColor = Color.Red; flex.Styles["Style1"].ForeColor = Color.Yellow; flex.Rows[3].Style = flex.Styles["Style1"]; // オーナー描画 flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw; } private void flex_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e) { // オーナー描画の利用 // FocusやHiglightの外観よりも優先される if ((e.Row == 5) && (e.Col >= flex.Cols.Fixed)) { e.Style = flex.Styles["Style1"]; } } 関連項目 セルの外観 組み込みスタイルの位置について カスタムスタイルを作成する スタイルの要素 261 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 「セルの外観」にもありますが、CellStyle オブジェクトには背景色やフォント、データ型、エディタ、コンボボックスなど様々な要 素があります。このトピックで紹介している以外にもスタイルの要素はありますが、基本的な使用方法は同じです。スタイルの 要素を理解し、組み込みスタイルやカスタムスタイル、行/列のスタイルをを使用することで FlexGrid の外観や動作を簡単に 変更することができます。 スタイルの要素については、CellStyle クラスを参照してください。(組み込み、カスタム)スタイルを設定してグリッドや行、列、 セルの外観を変更する例は、これ以前のトピックを参照してください。また、カスタムスタイルや組み込みスタイル、列のスタイ ルは設計時にデザイナ画面を通じて設定することができます。詳細については、「設計時のサポート」を参照してください。 背景色/文字色を変更する スタイルの要素:BackColor プロパティを変更します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 背景色/文字色を変更する ' この例ではカスタムスタイルを作成して ' 行に適用します flex.Styles.Add("YellowCell") flex.Styles("YellowCell").BackColor = Color.Yellow flex.Styles("YellowCell").ForeColor = Color.Red flex.Rows(2).Style = flex.Styles("YellowCell") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 背景色/文字色を変更する 262 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // この例ではカスタムスタイルを作成して // 行に適用します flex.Styles.Add("YellowCell"); flex.Styles["YellowCell"].BackColor = Color.Yellow; flex.Styles["YellowCell"].ForeColor = Color.Red; flex.Rows[2].Style = flex.Styles["YellowCell"]; } フォントを変更する スタイルの要素: Font プロパティを変更します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' この例ではカスタムスタイルを作成して ' 列に適用します flex.Styles.Add("ItalicStyle") flex.Styles("ItalicStyle").Font = New Font("verdana", 10, FontStyle.Italic) flex.Styles("ItalicStyle").BackColor = Color.AliceBlue flex.Cols(2).Style = flex.Styles("ItalicStyle") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // この例ではカスタムスタイルを作成して 263 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // 列に適用します flex.Styles.Add("ItalicStyle"); flex.Styles["ItalicStyle"].Font = new Font("verdana", 10, FontStyle.Italic); flex.Styles["ItalicStyle"].BackColor = Color.AliceBlue; flex.Cols[2].Style = flex.Styles["ItalicStyle"]; } 注意: 注意:Font プロパティの詳細は、MSDN を参照してください。 データの表示位置を変更する スタイルの要素: TextAlign プロパティを使用します。データの表示位置は、行/列の TextAlign プロパティを使用しても変 更できます。 【実行例】 Visual Basic コードの書き方 Visual Basic ' データの表示位置を変更する ' この例では列のスタイルを作成して設定します flex.Cols(2).StyleNew.ForeColor = Color.Red flex.Cols(2).Style.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.RightBottom ' flex.Cols(2).TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter C# コードの書き方 C# // データの表示位置を変更する // この例では列のスタイルを作成して設定します flex.Cols[2].StyleNew.ForeColor = Color.Red; flex.Cols[2].Style.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.RightBottom; //flex.Cols[2].TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter; 264 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 画像の表示位置を変更する スタイルの要素: ImageAlign プロパティを使用します。画像の表示位置は、行/列の ImageAlign プロパティを使用しても 変更できます。 【実行例】 Visual Basic コードの書き方 Visual Basic ' 画像の表示位置を変更する ' この例では列のスタイルを作成して設定します flex.Cols(2).StyleNew.ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.CenterCenter ' flex.Cols(2).ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.CenterCenter flex.SetCellImage(2, 2, New Bitmap("c1icon.gif")) C# コードの書き方 C# // 画像の表示位置を変更する // この例では列のスタイルを作成して設定します flex.Cols[2].StyleNew.ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.CenterCenter; //flex.Cols[2].ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.CenterCenter; flex.SetCellImage(2, 2, new Bitmap("c1icon.gif")); 3Dテキストを表示する スタイルの要素:TextEffect プロパティを使用します。TextEffectEnum.Inset または TextEffectEnum.Raised に設定する ことで3D効果のテキストを表示できます。 【実行例】 265 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic ' この例では Fixed 組み込みスタイルを変更しています ' 固定セル全体が3Dテキストで表示されます flex.Styles.Fixed.TextEffect = C1.Win.C1FlexGrid.TextEffectEnum.Raised flex.Cols(1).Caption = "1列目" flex.Rows(3).Caption = "3行目" C# コードの書き方 C# // この例では Fixed 組み込みスタイルを変更しています / 固定セル全体が3Dテキストで表示されます flex.Styles.Fixed.TextEffect = C1.Win.C1FlexGrid.TextEffectEnum.Raised; flex.Cols[1].Caption = "1列目"; flex.Rows[3].Caption = "3行目"; 背景画像を設定する スタイルの要素:BackgroundImage プロパティを使用します。 【実行例】 266 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic ' この例ではカスタムスタイルを作成、適用します Dim cs As C1.Win.C1FlexGrid.CellStyle cs = flex.Styles.Add("CustomImage") ' スタイルの要素:BackgroundImageを設定 ' 背景画像を設定します cs.BackgroundImage = New Bitmap("logo_grapecity.jpg") cs.BackgroundImageLayout = C1.Win.C1FlexGrid.ImageAlignEnum.Stretch cs.ForeColor = Color.Orange cs.Font = New Font("verdana", 12, FontStyle.Bold Or FontStyle.Italic) cs.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.LeftTop ' セル範囲を取得 Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetCellRange(2, 1, 3, 3) ' セルの結合 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Custom flex.MergedRanges.Add(cr) cr.Data = "PowerTools" ' セル範囲にスタイルを適用 cr.Style = flex.Styles("CustomImage") C# コードの書き方 C# // この例ではカスタムスタイルを作成、適用します C1.Win.C1FlexGrid.CellStyle cs; cs = flex.Styles.Add("CustomImage"); // スタイルの要素:BackgroundImageを設定 // 背景画像を設定します cs.BackgroundImage = new Bitmap("logo_grapecity.jpg"); cs.BackgroundImageLayout = C1.Win.C1FlexGrid.ImageAlignEnum.Stretch; 267 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms cs.ForeColor = Color.Orange; cs.Font = new Font("verdana", 12, FontStyle.Bold cs.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.LeftTop; // セル範囲を取得 C1.Win.C1FlexGrid.CellRange cr; cr = flex.GetCellRange(2, 1, 3, 3); // セルの結合 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Custom; flex.MergedRanges.Add(cr); cr.Data = "PowerTools"; // セル範囲にスタイルを適用 cr.Style = flex.Styles["CustomImage"]; 関連項目 グリッドの背景画像を設定する 透明度を指定して背景画像を設定する 折り返して表示する スタイルの要素:WordWrapプロパティを使用します。True(デフォルト:False)に設定すると、自動的に折り返して表示されま す。 【実行例】 . Visual Basic コードの書き方 Visual Basic ' この例では組み込みの Normal スタイルを使用しています flex.Styles.Normal.WordWrap = True flex(1, 1) = "テキストを折り返して表示" ' 行の高さを調整します flex.AutoSizeRow(1) 268 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# // この例では組み込みの Normal スタイルを使用しています flex.Styles.Normal.WordWrap = true; flex[1, 1] = "テキストを折り返して表示"; // 行の高さを調整します flex.AutoSizeRow(1); 注意: 注意:WordWrap プロパティを True に設定してテキストを折り返して表示しても、すべてのテキストが表示されるよう自 動的に行の高さが調整されるわけではありません。AutoSizeRow / AutoSizeRows メソッドなどを使用して調整する 必要があります。製品付属の「AutoSizeEditサンプル サンプル」やトピック:「行の高さ/列の幅を変更する」を参照してください。 トリミングして表示する スタイルの要素:Trimming プロパティ(デフォルト:StringTrimming.None)を設定します。セル内に収まらない長いテキスト が切り詰められて表示されます。 【実行例】 . Visual Basic コードの書き方 Visual Basic ' トリミングして表示する ' この例では列のスタイルを使用しています flex.Cols(1).StyleNew.Trimming = StringTrimming.EllipsisCharacter flex(1, 1) = "トリミングして表示する" C# コードの書き方 C# // トリミングして表示する // この例では列のスタイルを使用しています 269 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.Cols[1].StyleNew.Trimming = StringTrimming.EllipsisCharacter; flex[1, 1] = "トリミングして表示する"; 注意: 注意:StringTrimming 列挙体 列挙体の詳細については、MSDN を参照してください。 縦書きで表示する スタイルの要素:TextDirection プロパティ(デフォルト:TextDirectionEnum.Normal)を設定しま す。TextDirectionEnum.Down の場合は上から下へ、TextDirectionEnum.Up の場合は下から上へテキストが描画され ます。 【実行例】 . Visual Basic コードの書き方 Visual Basic ' 縦書きで表示する ' この例では行・列のスタイルを使用しています flex.Rows(1).StyleNew.BackColor = Color.Yellow flex.Rows(1).Style.TextDirection = C1.Win.C1FlexGrid.TextDirectionEnum.Down flex.Rows(2).StyleNew.BackColor = Color.YellowGreen flex.Rows(2).Style.TextDirection = C1.Win.C1FlexGrid.TextDirectionEnum.Up flex.Cols(3).StyleNew.BackColor = Color.AliceBlue flex.Cols(3).Style.TextDirection = C1.Win.C1FlexGrid.TextDirectionEnum.Normal flex.Styles.Normal.Font = New Font("verdana", 11) flex(1, 1) = "Down" flex(1, 2) = "ダウン" flex(2, 1) = "Up" flex(2, 2) = "アップ" flex(1, 3) = "Normal" flex(2, 3) = "ノーマル" C# コードの書き方 C# 270 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // 縦書きで表示する // この例では行・列のスタイルを使用しています flex.Rows[1].StyleNew.BackColor = Color.Yellow; flex.Rows[1].Style.TextDirection = C1.Win.C1FlexGrid.TextDirectionEnum.Down; flex.Rows[2].StyleNew.BackColor = Color.YellowGreen; flex.Rows[2].Style.TextDirection = C1.Win.C1FlexGrid.TextDirectionEnum.Up; flex.Cols[3].StyleNew.BackColor = Color.AliceBlue; flex.Cols[3].Style.TextDirection = C1.Win.C1FlexGrid.TextDirectionEnum.Normal; flex.Styles.Normal.Font = new Font("verdana", 11); flex[1, 1] = "Down"; flex[1, 2] = "ダウン"; flex[2, 1] = "Up"; flex[2, 2] = "アップ"; flex[1, 3] = "Normal"; flex[2, 3] = "ノーマル"; 注意: 半角英数字は、実行例のように横書きのまま上から下(または下から上)へ描画されます。 2バイト文字は、 バイト文字は、TextDirectionEnum.Downまたは またはTextDirectionEnum.Upのどちらを設定しても、実行例のよ のどちらを設定しても、実行例のよ うに上から下へ描画されます。 TextDirection プロパティの設定を行っても入力時は通常どおり横書きとなります。入力後に TextDirection プロ パティの設定でセルの内容がレンダリングされるのみとなります。 行と列のスタイルが同時に設定された場合、列のスタイルが優先されます。 データ型を設定する スタイルの要素:DataType プロパティを使用します。 【実行例】 . Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 271 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Handles MyBase.Load ' データ型を設定する ' この例ではカスタムスタイルを作成してセルに適用します flex.Styles.Add("CheckStyle") flex.Styles("CheckStyle").DataType = GetType(Boolean) flex.Styles("CheckStyle").BackColor = Color.AliceBlue flex.Styles("CheckStyle").ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.CenterCenter ' 3行2列目のセルに適用 flex.SetCellStyle(3, 2, "CheckStyle") ' セル範囲に適用 Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetCellRange(6, 1, 7, 4) cr.Style = flex.Styles("CheckStyle") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // データ型を設定する // この例ではカスタムスタイルを作成してセルに適用します flex.Styles.Add("CheckStyle"); flex.Styles["CheckStyle"].DataType = typeof(bool); flex.Styles["CheckStyle"].BackColor = Color.AliceBlue; flex.Styles["CheckStyle"].ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.CenterCenter; // 3行2列目のセルに適用 flex.SetCellStyle(3, 2, "CheckStyle"); // セル範囲に適用 C1.Win.C1FlexGrid.CellRange cr; cr = flex.GetCellRange(6, 1, 7, 4); cr.Style = flex.Styles["CheckStyle"]; } 注意: GetType メソッドや typeof 式の詳細は、MSDN を参照してください。 行や列単位でデータ型を設定する方法は、「データ型を設定する」を参照してください。 連結(バウンド)モードのグリッドにおけるセルのデータ型は、C1FlexGrid コントロールと接続しているデータソース に依存します。 書式を設定する スタイルの要素:Format プロパティを使用します。 注意: 注意:Format プロパティを設定したセル(列)の DataType プロパティが、Int32やDouble等の数値型や日付型に設定さ れていることを確認してください。Format プロパティは数値や日付データの書式を行うための機能ですので、DataType プロパティが Object や String 等に設定されている場合には機能しません。 【実行例】 272 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 書式を設定する ' この例ではカスタムスタイルを作成してセルに適用します flex.Cols(1).DataType = GetType(Date) flex.Styles.Add("LongDateStyle") flex.Styles("LongDateStyle").Format = "D" flex.Styles("LongDateStyle").BackColor = Color.AliceBlue ' 3行1列目のセルに適用 flex.SetCellStyle(3, 1, "LongDateStyle") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 書式を設定する // この例ではカスタムスタイルを作成してセルに適用します flex.Cols[1].DataType = typeof(DateTime); flex.Styles.Add("LongDateStyle"); flex.Styles["LongDateStyle"].Format = "D"; flex.Styles["LongDateStyle"].BackColor = Color.AliceBlue; // 3行1列目のセルに適用 flex.SetCellStyle(3, 1, "LongDateStyle"); } 注意: GetType メソッドや typeof 式の詳細は、MSDN を参照してください。 数値型、日付型の書式指定についての詳細は、MSDN を参照してください。 273 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 行や列単位で書式を設定する方法は、「行列の書式を設定する」を参照してください。 マージンを設定する スタイルの要素:Margins プロパティを使用します。セルの端から内容までのマージンをピクセル単位で設定できます。 【実行例】 . Visual Basic コードの書き方 Visual Basic rivate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' マージンを設定する ' この例ではカスタムスタイルを作成して行に適用します ' 通常セルのスタイルを左寄せに設定 flex.Styles.Normal.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.LeftCenter ' カスタムスタイルを作成 Dim cs As C1.Win.C1FlexGrid.CellStyle = flex.Styles.Add("MyMargins") cs.BackColor = Color.AliceBlue ' 親スタイルからマージンのクローンオブジェクトを作成 cs.Margins = CType(flex.Styles.Normal.Margins.Clone(), System.Drawing.Printing.Margins) ' 左側のマージンを設定 cs.Margins.Left = 10 ' 3行目に設定 flex.Rows(3).Style = flex.Styles("MyMargins") flex.Rows(3).Caption = "3行目" End Sub C# コードの書き方 C# 274 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms private void Form1_Load(object sender, EventArgs e) { // マージンを設定する // この例ではカスタムスタイルを作成して行に適用します // 通常セルのスタイルを左寄せに設定 flex.Styles.Normal.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.LeftCenter; // カスタムスタイルを作成 C1.Win.C1FlexGrid.CellStyle cs = flex.Styles.Add("MyMargins"); cs.BackColor = Color.AliceBlue; // 親スタイルからマージンのクローンオブジェクトを作成 cs.Margins = (System.Drawing.Printing.Margins)flex.Styles.Normal.Margins.Clone(); // 左側のマージンを設定 cs.Margins.Left = 10; // 3行目に設定 flex.Rows[3].Style = flex.Styles["MyMargins"]; flex.Rows[3].Caption = "3行目"; } 注意: 注意:Margins クラス(System.Drawing.Printing)についての詳細は、MSDN を参照してください。 スタイル要素の設定をクリアする Clear メソッドを使用します。StyleElementFlags 列挙体でクリアするスタイル要素を指定します。 【実行例】( 【実行例】(Clear メソッド実行前) 【実行例】( 【実行例】(Clear メソッド実行後) メソッド実行後): 275 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' この例では行のスタイルを使用しています ' 1列目のスタイル要素を設定 flex.Cols(1).StyleNew.BackColor = Color.Yellow flex.Cols(1).Style.ForeColor = Color.Red flex.Cols(1).Style.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter flex.Cols(1).Style.DataType = GetType(Date) flex.Cols(1).Style.Format = "yy/MM/dd" End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 背景色の設定をクリアします flex.Cols(1).Style.Clear(C1.Win.C1FlexGrid.StyleElementFlags.BackColor) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // この例では行のスタイルを使用しています // 1列目のスタイル要素を設定 flex.Cols[1].StyleNew.BackColor = Color.Yellow; flex.Cols[1].Style.ForeColor = Color.Red; flex.Cols[1].Style.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter; flex.Cols[1].Style.DataType = typeof(bool); flex.Cols[1].Style.Format = "yy/MM/dd"; } private void button1_Click(object sender, EventArgs e) 276 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms { // 背景色の設定をクリアします flex.Cols[1].Style.Clear(C1.Win.C1FlexGrid.StyleElementFlags.BackColor); } 注意: 注意:設定されているスタイル自体をクリアする方法については、「適用したスタイルをクリアする」を参照してください。 行/列 行/列に関するタスクを デザイン と操作 に分けて紹介します。 デザイン 固定行列や静止行列、行列ヘッダなどを使用してグリッドのデザインを変更するタスクを紹介します。 行列数を設定する 行数は RowCollection の Count プロパティ、列数はColumnCollection の Count プロパティにより設定します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 行数:12 flex.Rows.Count = 12 ' 列数:5 flex.Cols.Count = 5 ' データ設定 For i As Integer = 0 To flex.Rows.Count - 1 flex(i, 0) = i Next 277 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms For i As Integer = 0 To flex.Cols.Count - 1 flex(0, i) = i Next End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 行数:12 flex.Rows.Count = 12; // 列数:5 flex.Cols.Count = 5; // データ設定 for (int i = 0; i < flex.Rows.Count; i++) { flex[i, 0] = i; } for (int i = 0; i < flex.Cols.Count; i++) { flex[0, i] = i; } } 注意: 注意:連結(バウンド)モード時の行数・列数は、C1FlexGrid と接続しているデータソースに依存します。連結モードのグ リッドで列数を設定すると非連結列 非連結列として追加されますが、行数を設定した場合は例外が発生します。 固定行または固定列を設定する 固定行数は RowCollection の Fixed プロパティ、固定列数は ColumnCollection の Fixed プロパティにて設定します。固 定行はユーザーがグリッドを垂直方向にスクロールしても常にグリッドの一番上に、固定列はユーザーがグリッドを水平方向 にスクロールしても常にグリッドの左端に表示される編集不可のセルです。 【実行例】 278 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic ' 行数:50 flex.Rows.Count ' 固定行数:3 flex.Rows.Fixed ' 列数:10 flex.Cols.Count ' 固定列数:2 flex.Cols.Fixed = 50 = 3 = 10 = 2 C# コードの書き方 C# // 行数:50 flex.Rows.Count // 固定行数:3 flex.Rows.Fixed // 列数:10 flex.Cols.Count // 固定列数:2 flex.Cols.Fixed = 50; = 3; = 10; = 2; 関連項目 行列数を設定する 静止行または静止列を設定する 静止行または静止列を設定する 静止行数は RowCollection の Frozen プロパティ、静止列数は ColumnCollection の Frozen プロパティにて設定します。 静止行・静止列は、固定行・固定列と同様にスクロールされませんが、ユーザーによる編集が可能です。 279 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 Visual Basic コードの書き方 Visual Basic 行数:50 flex.Rows.Count = 50 ' 固定行数:1 flex.Rows.Fixed = 1 ' 静止行数:3 flex.Rows.Frozen = 3 ' 列数:10 flex.Cols.Count = 10 ' 固定列数:0 flex.Cols.Fixed = 0 ' 静止列数:2 flex.Cols.Frozen = 2 C# コードの書き方 C# // 行数:50 280 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.Rows.Count = 50; // 固定行数:1 flex.Rows.Fixed = 1; // 静止行数:3 flex.Rows.Frozen = 3; // 列数:10 flex.Cols.Count = 10; // 固定列数:0 flex.Cols.Fixed = 0; // 静止列数:2 flex.Cols.Frozen = 2; 関連項目 行列数を設定する 固定行または固定列を設定する 列ヘッダを設定する Caption プロパティ、または直接セルに値を設定します。 【実行例】 Visual Basic コードの書き方 281 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i As Integer = flex.Cols.Fixed To flex.Cols.Count - 1 flex.Cols(i).Caption = "Col" & i ' 直接セルに設定する場合 ' flex(0, i) = "Col" & i Next End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { for (int i = flex.Cols.Fixed; i < flex.Cols.Count; i++) { flex.Cols[i].Caption = "Col" + i.ToString(); // 直接セルに設定する場合 //flex[0, i] = "Col" + i.ToString(); } } 注意: 直接セルに値を設定する方法については、「セルに値を設定する」を参照してください。 C1FlexGrid を連結モードで使用した場合、デフォルトでは Caption プロパティ、Name プロパティにはデータソー スの列名が設定されます。 固定行を複数にしている場合、Caption プロパティの設定は0行目になります。 関連項目 行列数を設定する 固定行または固定列を設定する 行ヘッダを設定する Caption プロパティ、または直接セルに値を設定します。 【実行例】 282 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i As Integer = flex.Rows.Fixed To flex.Rows.Count - 1 flex.Rows(i).Caption = "Row" & i ' 直接セルに表示する場合 ' flex(i, 0) = "Row" & i Next End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { for (int i = flex.Rows.Fixed; i < flex.Rows.Count; i++) { flex.Rows[i].Caption = "Row" + i.ToString(); // 直接セルに表示する場合 //flex[i, 0] = "Row" + i.ToString(); } } 注意: 直接セルに値を設定する方法については、「セルに値を設定する」を参照してください。 固定列を複数にしている場合、Caption プロパティの設定は0列目になります。 関連項目 行列数を設定する 固定行または固定列を設定する すべての行の高さ/列の幅を変更する 283 DefaultSize プロパティを変更します。(デフォルトは行:16pix、列:80pix) Copyright © GrapeCity inc. All rights reserved. DefaultSize プロパティは行の高さ/列幅のデフォルト値です。Height プロパティに-1が設定されている行は、デフォルトの FlexGrid for WinForms 注意: グリッドの Font プロパティに新しい値を設定すると、DefaultSize プロパティはそのフォントに合わせて自動調整 されます。 Height や Width プロパティはデフォルトが -1 のため、実際のサイズを参照する際 は、HeightDisplay/WidthDisplay プロパティを使用します。 連結(バウンド)モードで DefaultSize プロパティを設定する場合は、データソースと連結する前にAutoResize プ ロパティを False(デフォルト)に設定して列幅の自動調整を行わないようにする必要があります。 行の高さ/列の幅を変更する 各行の高さを変更するには Height プロパティを、各列の幅を変更するには Width プロパティを設定します。(デフォルトは 1) 【実行例】 Visual Basic コードの書き方 Visual Basic ' 2行目の高さを変更します flex.Rows(2).Height = 40 ' 2列目の幅を変更します flex.Cols(2).Width = 120 C# コードの書き方 C# // 2行目の高さを変更します flex.Rows[2].Height = 40; // 2列目の幅を変更します flex.Cols[2].Width = 120; 注意: 284 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Height や Width プロパティは、デフォルトが -1 のため、実際のサイズを参照する際 は、HeightDisplay/WidthDisplay プロパティを使用します。 各列の幅は、設計時にデザイン画面や列エディタを通して設定することも可能です。 関連項目 列エディタにアクセス 自動で列幅を調整する デザイン時に設定した列幅が無効になってしまう場合の対処方法 データソースとグリッドを接続する前に列幅などを設定している場合 データソースとグリッドを接続する前、つまり DataSource プロパティを設定する前に、列幅や列名を設定した場合、列幅など の設定はデータソースになにも設定していないグリッドに対して行っていることになります。また、グリッドにデータソースを設定 した時点でグリッドはデータソースの内容(情報)で列の設定を再構築します。そのため、DataSource プロパティによりデータ ソースが設定されると、データソースになにも設定されていないグリッドに対して行われた列幅などの設定は、データソースと 接続後のグリッドの設定に上書きされることになります。 バウンドモードで使用するグリッドに対して列幅や列名などを設定する場合は、データソースを設定した後のグリッドに対して、 列幅などの設定を行う必要があります。設計時にプロパティウィンドウから DataSource プロパティを設定後、列エディタにて 列名や列幅などを設定するか、Form_Load イベントなどで DataSource プロパティを設定後、列名や列幅をコードで設定してく ださい。 上記以外の場合 データソースを設定後にデザイナより列幅を変更しているにも関わらず、列幅が無効になってしまう場合は、AutoResize プロ パティの設定を確認してください。AutoResize プロパティが True(デフォルト値:False)になっている場合、データ読み込み時 に列幅が自動的に調整され、コントロールは列幅を最も幅の広い入力データに合わせてリサイズします。 関連項目 列エディタにアクセス 自動で列幅を調整する 列の順序を変更する 列の順序を変更するには、デザイナで列をグリッド内の新しい位置にドラッグするか、列エディタ を使用するか、実行時にコー ドで MoveRange メソッドを設定します。 デザイナの場合 1. グリッドで、移動する列を選択します。この例では、C列を移動します。 2. 列をクリックして左にドラッグします。列をドロップできる場所に縦の点線が表示されます。 285 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 3. B列の前にC列をドロップします。 [FlexGrid 列エディタ 列エディタ]の場合 の場合 1. 列エディタ を開きます。[FlexGrid 列エディタ 列エディタ]へのアクセス方法の詳細については、「列エディタにアクセス 」を参照し てください。 2. デザイナで、移動する列を選択します。この例では、C列を移動します。. 3. 列をクリックして左にドラッグします。列をドロップできる場所に縦の点線が表示されます。 286 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 4. B列の前にC列をドロップします。 5. 〈OK〉をクリックし、エディタを閉じます。 287 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms コードの場合 以下のコードにて、列3(この例ではC列)を列2の位置に移動します。 Visual Basic コードの書き方 Visual Basic flex.Cols.MoveRange(3, 1, 2) C# コードの書き方 C# flex.Cols.MoveRange(3, 1, 2); 【実行例】 288 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 行列のデータ型を設定する 行や列単位でデータ型を設定するには、DataType プロパティを使用します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 2列目のデータ型を設定 flex.Cols(2).DataType = GetType(Date) flex.Cols(2).Caption = "Date型" ' 3行目のデータ型を設定 flex.Rows(3).DataType = GetType(Boolean) flex.Rows(3).Caption = "Boolean型" End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 2列目のデータ型を設定 flex.Cols[2].DataType = typeof(DateTime); flex.Cols[2].Caption = "DateTime型"; // 3行目のデータ型を設定 flex.Rows[3].DataType = typeof(bool); flex.Rows[3].Caption = "bool型"; } 注意: GetType メソッドや typeof 式の詳細は、MSDNを参照してください。 289 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms DataType プロパティは設計時に設定することも可能です。 行、列両方のデータ型が設定されている場合、列の設定が優先されます。 連結(バウンド)モードのグリッドにおける列のデータ型は、C1FlexGrid と接続しているデータソースに依存しま す。 関連項目 列エディタ Column タスク データ型を設定する 行列の書式を設定する 行や列単位で書式を設定するには、Format プロパティを使用します。 注意: 注意:Format プロパティを設定したセル(列)の DataType プロパティが、Int32やDouble等の数値型や日付型に設定さ れていることを確認してください。Format プロパティは数値や日付データの書式を行うための機能ですので、DataType プロパティが Object や String 等に設定されている場合には機能しません。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 2列目のデータ型を設定 flex.Cols(2).DataType = GetType(Date) ' 2列目の書式を設定 flex.Cols(2).Format = "D" flex.Cols(2).Caption = "長い日付" ' 3行目のデータ型を設定 flex.Rows(3).DataType = GetType(Date) ' 3行目の書式を設定 290 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.Rows(3).Format = "d" flex.Rows(3).Caption = "短い日付" End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 2列目のデータ型を設定 flex.Cols[2].DataType = typeof(DateTime); // 2列目の書式を設定 flex.Cols[2].Format = "D"; flex.Cols[2].Caption = "長い日付"; // 3行目のデータ型を設定 flex.Rows[3].DataType = typeof(DateTime); // 3行目の書式を設定 flex.Rows[3].Format = "d"; flex.Rows[3].Caption = "短い日付"; } 注意: GetType メソッドや typeof 式の詳細は、MSDNを参照してください。 数値型、日付型の書式指定についての詳細は、MSDNを参照してください。 DataType プロパティは設計時に設定することも可能です。 行、列両方のデータ型・書式が設定されている場合、列の設定が優先されます。 連結(バウンド)モードのグリッドにおける列のデータ型は、C1FlexGrid と接続しているデータソースに依存しま す。 関連項目 列エディタ C1FlexGrid タスク データ型を設定する セルの内容 固定列に行番号を表示する 行番号の自動採番機能はありませんが、オーナー描画を使用する方法で自動採番と同様の処理が可能です。 【実行例】 291 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例:行追加後に自動採番】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex.Rows.Count = 10 flex.AllowAddNew = True flex.Styles.NewRow.BackColor = Color.Beige ' オーナー描画の機能を使用 flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw End Sub ' 自動的に行番号を表示する Private Sub flex_OwnerDrawCell(ByVal sender As Object, ByVal e As 292 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles flex.OwnerDrawCell ' 0列目に行番号を表示 If e.Col = 0 And e.Row >= flex.Rows.Fixed And e.Row <= flex.Rows.Count - 2 Then e.Text = e.Row End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex.Rows.Count = 10; flex.AllowAddNew = true; flex.Styles.NewRow.BackColor = Color.Beige; // オーナー描画の機能を使用 flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw; } // 自動的に行番号を表示する private void flex_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e) { // 0列目に行番号を表示 if (e.Col == 0 & e.Row >= flex.Rows.Fixed & e.Row <= flex.Rows.Count - 2) { e.Text = e.Row.ToString(); } } 単純に固定列に行番号を表示する場合は、ループ処理で固定列に直接値を設定してください。 【実行例】 293 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex.Rows.Count = 12 For i As Integer = 0 To flex.Rows.Count - 1 flex(i, 0) = i ' Caption プロパティを使用する場合 ' flex.Rows(i).Caption = i Next End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex.Rows.Count = 10; flex.AllowAddNew = true; flex.Styles.NewRow.BackColor = Color.Beige; private void Form1_Load(object sender, EventArgs e) { flex.Rows.Count = 12; for (int i = 0; i < flex.Rows.Count; i++) { flex[i, 0] = i; // Caption プロパティを使用する場合 // flex.Rows[i].Caption = i.ToString(); } } 操作 行列の操作に関するタスクを紹介します。 行を追加する 行を追加するには、RowCollection クラスのAdd メソッドやC1FlexGridBase クラスのAddItem メソッドを使用しま す。RowCollection クラスのCount プロパティを使用して行数を変更する方法もあります。 注意: 注意:RowCollection クラスの Count プロパティを変更できるのは、非連結モードで使用している場合のみです。連結 モードで使用すると、例外が発生します。 【実行例】 294 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 追加後イメージ Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' AddItemメソッドを使用する ' 行を追加してデータを設定 flex.AddItem("4" & vbTab & "4行目") ' RowCollection.Addメソッドを使用する Dim r As C1.Win.C1FlexGrid.Row ' 行を追加 r = flex.Rows.Add() ' データを設定 295 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms r.Item(0) = "4" r.Item(1) = "4行目" ' RowCollection.Countプロパティを変更する ' 行を追加 flex.Rows.Count += 1 ' データを設定 flex(flex.Rows.Count - 1, 0) = "4" flex(flex.Rows.Count - 1, 1) = "4行目" End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // AddItemメソッドを使用する // 行を追加してデータを設定 flex.AddItem("4" + "\t" + "4行目"); // RowCollection.Addメソッドを使用する C1.Win.C1FlexGrid.Row r; // 行を追加 r = flex.Rows.Add(); // データを設定 r[0] = "4"; r[1] = "4行目"; // RowCollection.Countプロパティを変更する // 行を追加 flex.Rows.Count += 1; // データを設定 flex[flex.Rows.Count - 1, 0] = "4"; flex[flex.Rows.Count - 1, 1] = "4行目"; } 注意: 注意:付属の LoadSpeed サンプルも参照してください。 列を追加する \ 行を追加するには、ColumnCollection クラスの Add メソッドを使用するか、ColumnCollection クラスの Count プロパティ を変更します。 注意: 注意:連結モードで列を追加した場合、非連結列として追加されます。 【実行例】 296 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 追加後イメージ Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' ColumnCollection.Addメソッドを使用する Dim c As C1.Win.C1FlexGrid.Column c = flex.Cols.Add c.Caption = "追加した列" ' ColumnCollection.Countプロパティを変更する flex.Cols.Count += 1 flex.Cols(flex.Cols.Count -1).Caption = "追加した列" End Sub 297 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // ColumnCollection.Addメソッドを使用する C1.Win.C1FlexGrid.Column c; c = flex.Cols.Add(); c.Caption = "追加した列"; // ColumnCollection.Countプロパティを変更する flex.Cols.Count += 1; flex.Cols[flex.Cols.Count - 1].Caption = "追加した列"; } 行/列を削除する 行を削除するには、RowCollection クラスの Remove メソッドや C1FlexGridBase クラスのRemoveItem メソッドを使用し ます。RowCollection クラスの Count プロパティを使用して行数を変更する方法もあります。 列を削除するには、Remove メソッドを使用するか、ColumnCollection クラスの Count プロパティを使用して列数を変更し ます。 また、RemoveRange/RemoveRange メソッドを使用すると、複数行/列を削除できます。 注意: 注意:RowCollection クラスの Count プロパティを変更できるのは、非連結モードで使用している場合のみです。連結 モードで使用すると、例外が発生します。 【実行例】 298 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 削除後イメージ Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' RowCollection.Removeメソッドを使用して2行目を削除 flex.Rows.Remove(2) ' RemoveItemメソッドを使用して2行目を削除 flex.RemoveItem(2) ' RowCollection.Countプロパティを変更:最後の行を削除 flex.Rows.Count -= 1 ' RemoveRangeメソッドを使用して2行目から3行削除 flex.Rows.RemoveRange(2, 3) 299 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ' ColumnCollection.Removeメソッドを使用して2列目を削除 flex.Cols.Remove(2) ' ColumnCollection.Countプロパティを変更:最後の行を削除 flex.Cols.Count -= 1 ' RemoveRangeメソッドを使用して2列目から3列削除 flex.Cols.RemoveRange(2, 3) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // RowCollection.Removeメソッドを使用して2行目を削除 flex.Rows.Remove(2); // RemoveItemメソッドを使用して2行目を削除 flex.RemoveItem(2); // RowCollection.Countプロパティを変更:最後の行を削除 flex.Rows.Count -= 1; // RemoveRangeメソッドを使用して2行目から3行削除 flex.Rows.RemoveRange(2, 3); } private void button2_Click(object sender, EventArgs e) { // ColumnCollection.Removeメソッドを使用して2列目を削除 flex.Cols.Remove(2); // ColumnCollection.Countプロパティを変更:最後の行を削除 flex.Cols.Count -= 1; // RemoveRangeメソッドを使用して2列目から3列削除 flex.Cols.RemoveRange(2, 3); } 行を挿入する 行を挿入するには、RowCollection クラスのInsert メソッドを使用します。InsertRange メソッドを使用すると、指定した位置 に複数行を挿入できます。 注意: 注意:行の挿入は非連結モード時のみ可能です。連結モードでは行の追加のみがサポートされま す。Insert/ /InsertRange メソッドを連結モードで使用すると、例外が発生します。 【実行例】 300 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 挿入後イメージ Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim r As C1.Win.C1FlexGrid.Row ' Insertメソッドで2行目の位置に挿入 r = flex.Rows.Insert(2) r(1) = "挿入行" ' InsertRangeメソッドで2行目の位置に3行を挿入 'flex.Rows.InsertRange(2, 3) End Sub 301 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { C1.Win.C1FlexGrid.Row r; // Insertメソッドで2行目の位置に挿入 r = flex.Rows.Insert(2); r[1] = "挿入行"; // InsertRangeメソッドで2行目の位置に3行を挿入 //flex.Rows.InsertRange(2, 3); } 列を挿入する 行を挿入するには、ColumnCollection クラスの Insert メソッドを使用します。InsertRange メソッドを使用すると、指定した 位置に複数行を挿入できます。 注意: 注意:連結モードで列を挿入した場合、非連結列として挿入されます。 【実行例】 挿入後イメージ 302 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim c As C1.Win.C1FlexGrid.Column ' Insertメソッドで2列目の位置に挿入 c = flex.Cols.Insert(2) c.Caption = "挿入列" ' InsertRangeメソッドで2列目の位置に3列を挿入 'flex.Cols.InsertRange(2, 3) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { C1.Win.C1FlexGrid.Column c; // Insertメソッドで2列目の位置に挿入 c = flex.Cols.Insert(2); c.Caption = "挿入列"; // InsertRangeメソッドで2列目の位置に3列を挿入 //flex.Cols.InsertRange(2, 3); } ユーザーによる行の追加を許可する AllowAddNew プロパティを True に変更します。行の追加を許可すると、最終行に新規追加のテンプレート行が表示されま す。 また、NewRowWatermark プロパティを使用して新規追加のテンプレート行に任意の文字列を表示し、ユーザーに新規行 への入力を促す処理を実装することも可能です。 303 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 Visual Basic コードの書き方 Visual Basic flex.AllowAddNew = True flex.NewRowWatermark = "新しいレコードは、ここに追加してください" C# コードの書き方 C# flex.AllowAddNew = true; flex.NewRowWatermark = "新しいレコードは、ここに追加してください"; 注意: 注意:AllowAddNew プロパティは、[C1FlexGrid タスク] からも設定できます。 304 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ユーザーによる行の削除を許可する AllowDelete プロパティを True に変更すると、ユーザーは行を選択して Delete キー キーを押すことで、それらの行を削除できま す。 【実行例】 5行目を選択して、 行目を選択して、Delete キーを押します。 削除後イメージ 305 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic flex.AllowDelete = True C# コードの書き方 C# flex.AllowDelete = true; 注意: 注意:AllowDelete プロパティは、[C1FlexGrid タスク] からも設定できます。 306 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ユーザーによる行/列の移動を許可する AllowDragging プロパティを変更します(デフォルトは AllowDraggingEnum.Columns)。また、行や列の AllowDragging プロパティを False に設定すると、特定行または列のドラッグを禁止できます。 注意: 注意:行の移動は非連結モードでのみ可能です。連結モードでの行の移動はサポートされません。 【実行例】 5行目をドラッグして移動 行目をドラッグして移動 307 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 移動後イメージ Visual Basic コードの書き方 Visual Basic ' ユーザーによる行/列の移動をを許可する flex.AllowDragging = C1.Win.C1FlexGrid.AllowDraggingEnum.Both ' 2列目の移動は禁止 flex.Cols(2).AllowDragging = False C# コードの書き方 C# // ユーザーによる行/列の移動をを許可する flex.AllowDragging = C1.Win.C1FlexGrid.AllowDraggingEnum.Both; // 2列目の移動は禁止 flex.Cols[2].AllowDragging = false; 注意: 各列の移動許可/禁止は、列エディタ や Column タスク からも設定できます。 列の移動のみを許可する場合は、「C1FlexGrid タスク」 からも設定できます。 308 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ユーザーによる行の高さ/列幅の変更を許可する AllowResizing プロパティを変更します(デフォルトは AllowResizingEnum.Columns)。また、行や列の AllowResizing プ ロパティを False に設定すると、特定行または列のサイズ変更を禁止できます。 【実行例】 Visual Basic コードの書き方 Visual Basic 309 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ' ユーザーによる行の高さ/列幅の変更を許可する flex.AllowResizing = C1.Win.C1FlexGrid.AllowResizingEnum.Both ' 2列目のサイズ変更は禁止 flex.Cols(2).AllowResizing = False C# コードの書き方 C# // ユーザーによる行の高さ/列幅の変更を許可する flex.AllowResizing = C1.Win.C1FlexGrid.AllowResizingEnum.Both; // 2列目のサイズ変更は禁止 flex.Cols[2].AllowResizing = false; 注意: 注意:各列のサイズ変更許可/禁止は、列エディタ や Column タスク からも設定できます。 データにあわせて行/列のサイズを調整する AutoSizeRow/AutoSizeRows メソッドで行のサイズを、AutoSizeCol/AutoSizeCols メソッドで列のサイズをデータにあ わせて調整できます。 また、行や列のサイズ変更が許可されている場合、ユーザーは行/列の境界線をダブルクリックすることで表示されている データにあわせてサイズを調整できます。 【実行例】 サイズ調整後イメージ 310 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 1列目の列幅を調整 flex.AutoSizeCol(1) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // 1列目の列幅を調整 flex.AutoSizeCol(1); } 注意:AutoSizeRow/AutoSizeRows、AutoSizeCol/AutoSizeCols メソッドは、行・列のサイズ変更を禁止している 場合でも使用できます。 関連項目 自動で列幅を調整する 行/列の最小、最大サイズを設定する MinSize プロパティで最小サイズを、MaxSize プロパティで最大サイズを設定します。この設定は、ユーザーによるサイズ変 更時、コードでのサイズ変更時の両方で有効です。 【実行例】 311 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 列幅の最大サイズを50にします flex.Cols.MaxSize = 50 ' 行の高さの最小サイズを16にします flex.Rows.MinSize = 16 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 列幅の自動調整を行っても最大サイズ以上にはなりません flex.AutoSizeCol(1) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 列幅の最大サイズを50にします flex.Cols.MaxSize = 50; // 行の高さの最小サイズを16にします flex.Rows.MinSize = 16; } private void button1_Click(object sender, EventArgs e) { // 列幅の自動調整を行っても最大サイズ以上にはなりません flex.AutoSizeCol(1); } 注意: 312 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms MinSize/MaxSize プロパティを0にすると、最小/最大サイズの設定は無効になります。 最小サイズが DefaultSize よりも小さい場合、最小サイズの値で行や列が表示されます。 ユーザーによる行/列の静止を許可する ユーザーがマウスで行と列を静止(フリーズ)できるようにするには、AllowFreezing プロパティ を、AllowFreezingEnum.Columns(列のみをフリーズする場合)、AllowFreezingEnum.Rows(行のみをフリーズする場 合)、 AllowFreezingEnum.Both(列と行の両方をフリーズする場合)のいずれかに設定します。反対に、フリーズを無効に するには、AllowFreezing プロパティを AllowFreezingEnum.None(デフォルト設定)に設定します。 【実行例】 マウスポインタ が行 の ロック または列のロック( 313 )アイコンになったとき、フリーズする行または列の上にマウスをドラッグします。 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 静止後イメージ Visual Basic コードの書き方 Visual Basic flex.AllowFreezing = C1.Win.C1FlexGrid.AllowFreezingEnum.Both C# コードの書き方 C# flex.AllowFreezing = C1.Win.C1FlexGrid.AllowFreezingEnum.Both; ユーザーによるデータ検索を有効にする 314 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ユーザーが入力した値で列内のデータを検索するには、AutoSearch プロパティを AutoSearchEnum.FromCursor(現在の 行から検索を開始する場合)、または AutoSearchEnum.FromTop(最初のスクロール可能な行から検索を開始する場合) に設定します。反対に、検索を無効にするには、AutoSearch プロパティを AutoSearchEnum.None(デフォルト設定)に設 定します。 【実行例】 データ検索を有効にすると、ユーザーが入力した文字を含むセルをハイライト表示します。この例では、2列目にCと入力する と、「CCC」がハイライト表示されます。 Visual Basic コードの書き方 Visual Basic flex.AutoSearch = C1.Win.C1FlexGrid.AutoSearchEnum.FromTop C# コードの書き方 C# flex.AutoSearch = C1.Win.C1FlexGrid.AutoSearchEnum.FromTop; 注意: 同じ文字で始まる複数の値がある場合、次の文字を入力すると、それらの文字を含むセルがハイライト表示され ます。たとえば、ABと入力すると、「ABC」がハイライト表示されます。 検索文字のバッファがクリアされるまでの時間は、AutoSearchDelay プロパティで変更します。 データ検索を有効にした場合、ユーザーは[Enter]、[Space]、または[F2]キーを押してセルの編集を開始する必 要があります。その他のキーは検索に使用されます。 セルの値 セルやセル範囲のデータを参照および設定する方法を紹介します。 セルに値を設定する Item プロパティ(インデクサ)、または SetData メソッドを使用します。 315 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 2行3列目のセルに値を設定 flex(2, 3) = " 2行3列目" ' flex.Item(2, 3) = "2行3列目" ' flex.SetData(2, 3, "2行3列目", True) ' セルの移動(選択) flex.Select(2, 3) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // 2行3列目のセルに値を設定 flex[2, 3] = "2行3列目"; // flex.SetData(2, 3, "2行3列目", true); // セルの移動(選択) flex.Select(2, 3); } 関連項目 データの取得と設定 セル範囲に値を設定する Data プロパティ、または SetData メソッドを使用します。 316 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 1行2列-2行3列のセル範囲に値を設定 Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetCellRange(1, 2, 2, 3) cr.Data = "セル範囲" ' flex.SetData(cr, "セル範囲", True) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // 1行2列-2行3列のセル範囲に値を設定 C1.Win.C1FlexGrid.CellRange cr; cr = flex.GetCellRange(1, 2, 2, 3); cr.Data = "セル範囲"; // flex.SetData(cr, "セル範囲", true); } セルの値を取得する 以下のプロパティ、メソッドを使用します。 プロパティ/メソッド 説明 Item プロパティ(インデクサ) セルに格納されている生データ(書式設定などがされていない値) 317 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms GetData メソッド セルに格納されている生データ(書式設定などがされていない値) GetDataDisplay メソッド セルに表示されている(書式設定を含む)データ Data プロパティ セル範囲に格納されている生データ(書式設定などがされていない値) DataDisplay プロパティ セル範囲に表示されている(書式設定を含む)データ 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex.Cols(1).Format = "###,#" flex(1, 1) = 1000 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim str As String str = "インデクサ:" & flex(1, 1) & vbCrLf str += "GetData:" & flex.GetData(1, 1) & vbCrLf str += "GetDataDisplay:" & flex.GetDataDisplay(1, 1) MessageBox.Show(str) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex.Cols[1].Format = "###,#"; flex[1, 1] = 1000; } 318 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms private void button1_Click(object sender, EventArgs e) { String str; str = "インデクサ:" + flex[1, 1] + "\n"; str += "GetData:" + flex.GetData(1, 1) + "\n"; str += "GetDataDisplay:" + flex.GetDataDisplay(1, 1); MessageBox.Show(str); セル(範囲)の値をクリアする AutoClipboard プロパティを True に設定してクリップボードの自動処理を実装することで、ユーザーは Delete キー キーを押して セルのデータをクリアすることができます。 【実行例】 クリア後イメージ 319 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic flex.AutoClipboard = True C# コードの書き方 C# flex.AutoClipboard = true; また、コードからデータをクリアする場合は、SetData メソッドを使用します。 注意: 注意:値をセルに格納すると、グリッドはその値を列のデータ型に変換しようとします。変換できない場合、グリッド は GridError イベントを発生させてセルを変更しません。””(空文字)を設定してデータをクリアする場合は、注意が必要 です。SetData メソッドを使用して coerce 引数を False に設定することでこの動作を変更できます。 【実行例】 320 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms クリア後イメージ Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' カレントセルにDBNull.Valueを設定してクリア flex.SetData(flex.Row, flex.Col, System.DBNull.Value, False) End Sub C# コードの書き方 C# 321 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms private void button1_Click(object sender, EventArgs e) { // カレントセルにDBNull.Valueを設定してクリア flex.SetData(flex.Row, flex.Col, System.DBNull.Value, false); } 関連項目 データの取得と設定 画像/表示 主にグリッドの表示に関するタスクを紹介します。 オーナー描画を使用する このタスク内でも「セルに線を描画する」や「グラデーション背景を描画する」などの処理でオーナー描画を使用していますが、 オーナー描画の変更は表示上のみ影響します。そのため、罫線や背景色といった外観だけではなく、「パスワード入力を行う」 のように表示されているデータに対して描画を行っても実際のデータは変更されません。 たとえば、下記のサンプルでは実際のデータに対して”(済)”という文字列を追加する処理を実装しています。入力されたデータ には変更がないことを確認できます。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' オーナー描画を使用する flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw End Sub Private Sub flex_OwnerDrawCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles flex.OwnerDrawCell ' 1列目のみ変更 322 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms If e.Col = 1 Then If e.Row >= flex.Rows.Fixed And e.Text <> "" Then e.Text = e.Text & " (済)" End If End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click MessageBox.Show("実際のデータ:" & flex(2, 1)) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // オーナー描画を使用する flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw; } private void flex_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e) { // 1列目のみ変更 if (e.Col == 1) { if ((e.Row >= flex.Rows.Fixed) && (e.Text != "")) { e.Text = e.Text + " (済)"; } } } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("実際のデータ:" + flex[2, 1]); } グラデーション背景を描画する セル範囲にグラデーション背景を適用するには、OwnerDrawCell イベントを使用してセルの描画を行います。 【実行例】 セル範囲のみに Navy のグラデーション背景を表示します。 323 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 1. フォームクラスレベルに以下のコードを追加し、LinearGradient ブラシと CellRange を作成します。 Visual Basic コードの書き方 Visual Basic Dim GradientStyleBrush As System.Drawing.Drawing2D.LinearGradientBrush Dim rng As C1.Win.C1FlexGrid.CellRange C# コードの書き方 C# System.Drawing.Drawing2D.LinearGradientBrush GradientStyleBrush; C1.Win.C1FlexGrid.CellRange rng; 2. Form_Load イベントに以下のコードを追加し、DrawMode プロパティを OwnerDraw に設定します。 Visual Basic コードの書き方 Visual Basic flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw C# コードの書き方 C# flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw; 3. GetCellRange メソッドを使用し、2行2列目から4行4列目の CellRange を設定します。 Visual Basic コードの書き方 Visual Basic rng = flex.GetCellRange(2, 2, 4, 4) C# コードの書き方 C# rng = flex.GetCellRange(2, 2, 4, 4) 4. グラデーションの LinearGradient ブラシの色と角度を設定します。 Visual Basic コードの書き方 324 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic GradientStyleBrush = New System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, Color.Navy, Color.Transparent, 270) C# コードの書き方 C# GradientStyleBrush = new System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, Color.Navy, Color.Transparent, 270); 5. OwnerDrawCell イベントを追加し、CellRange にグラデーションを描画します。 Visual Basic コードの書き方 Visual Basic Private Sub flex_OwnerDrawCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles flex.OwnerDrawCell ' グラデーションブラシを使用して ' セルの背景を描画します If (e.Row >= rng.r1) And (e.Row <= rng.r2) Then If (e.Col >= rng.c1) And (e.Col <= rng.c2) Then ' 背景を描画 e.Graphics.FillRectangle(GradientStyleBrush, e.Bounds) ' セルの内容を描画 e.DrawCell(C1.Win.C1FlexGrid.DrawCellFlags.Content) ' 描画の終了 e.Handled = True End If End If End Sub C# コードの書き方 C# private void flex_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e) { // グラデーションブラシを使用して // セルの背景を描画します if ((e.Row >= rng.r1) && (e.Row <= rng.r2)) { if ((e.Col >= rng.c1) && (e.Col <= rng.c2)) { // 背景を描画 e.Graphics.FillRectangle(GradientStyleBrush, e.Bounds); // セルの内容を描画 e.DrawCell(C1.Win.C1FlexGrid.DrawCellFlags.Content); // 描画の終了 e.Handled = true; 325 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms } } } セルを塗りつぶす FlexGrid には、VS-FlexGrid(ActiveX製品)の CellFloodPercent プロパティのような、セルを塗りつぶすための直接的な機能 はありません。ただ、オーナー描画セルとして、セル上に任意のグラフィックを表示する機能が実装されています。この場合、 実際の描画処理は .NET Framework の System.Drawing クラスを使用しますが、同クラスの FillRectangle メソッドを使用し て、任意の四角形の領域を塗りつぶす動作が可能です。 セルを塗りつぶす具体的な処理・コードについては、製品付属の BarChart サンプルを確認してください。また、オーナー描画 機能の詳細については、「オーナー描画セル」や「OwnerDrawCell イベント」を参照してください。 【BarChar サンプル実行例】 セルラベルを表示する ShowCellLabels プロパティを True に設定します。 【実行例】 326 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic flex.ShowCellLabels = True C# コードの書き方 C# flex.ShowCellLabels = true; 注意: セル内にすべてのデータが表示されている場合、そのセルではラベルは表示されません。 付属の各サンプル、CellLabels、CellLabelDelay、CellLabelsNew も参照してください。 セルに画像を設定する 下記の方法でセル(範囲)に画像を設定します。例えば、Image.FromFile メソッドを使用することで、GDI+でサポートされて いる画像フォーマット.png/JPEG/GIF/EMF/WMF/TIFF/PNG/ICOなど)を表示することができます。 【SetCellImageメソッドを使用する】 メソッドを使用する】 SetCellImage メソッドを使用して、セルに直接画像を設定します。 327 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic ' 2行3列目のセルに画像を設定 flex.SetCellImage(2, 3, Image.FromFile("soccer.gif")) flex(2, 3) = "サッカー" C# コードの書き方 C# // 2行3列目のセルに画像を設定 flex.SetCellImage(2, 3, Image.FromFile("soccer.gif")); flex[2, 3] = "サッカー"; 【Image プロパティを使用する】 Image プロパティを使用して、任意のセル(範囲)に画像を設定します。 328 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic ' 5行3列目-6行3列目に画像を表示 Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetCellRange(5, 3, 6, 3) cr.Image = Image.FromFile("baseball.gif") cr.Data = "野球" C# コードの書き方 C# // 5行3列目-6行3列目に画像を表示 C1.Win.C1FlexGrid.CellRange cr; cr = flex.GetCellRange(5, 3, 6, 3); cr.Image = Image.FromFile("baseball.gif"); cr.Data = "野球"; 【オーナー描画の機能を使用する】 OwnerDrawCell イベントの e.Image に画像を設定します。 329 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Dim img As Image Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw img = Image.FromFile("basketball.gif") End Sub Private Sub flex_OwnerDrawCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles flex.OwnerDrawCell ' 3行4列目に画像を表示 If e.Row = 3 And e.Col = 4 Then e.Image = img e.Text = "バスケット" End If End Sub C# コードの書き方 C# Image img; private void Form1_Load(object sender, EventArgs e) { flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw; img = Image.FromFile("basketball.gif"); } private void flex_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e) { // 3行4列目に画像を表示 if((e.Row == 3) && (e.Col == 4)) { 330 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms e.Image = img; e.Text = "バスケット"; } } 注意: MultiColumnDictionary クラスを使用したマルチカラムコンボボックスの使用例について は、MultiColumnDictionary サンプルを確認してください。 ImageAndText プロパティを使用して、セルにテキストと画像を表示するか、画像のみを表示するかを指定でき ます。 新規追加行を示すアイコンを変更する Glyphs プロパティで GlyphEnum.DBAdd を指定して変更します。 【実行例】 変更前(デフォルト) 331 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic ' 新規追加行を表示 flex.AllowAddNew = True ' 新規追加行の背景色を変更 flex.Styles.NewRow.BackColor = Color.Beige ' 新規追加行を示すアイコンを変更 flex.Glyphs(C1.Win.C1FlexGrid.GlyphEnum.DBAdd) = Image.FromFile("C:\arrow.png") C# コードの書き方 C# // 新規追加行を表示 flex.AllowAddNew = true; // 新規追加行の背景色を変更 flex.Styles.NewRow.BackColor = Color.Beige; // 新規追加行を示すアイコンを変更 flex.Glyphs[C1.Win.C1FlexGrid.GlyphEnum.DBAdd] = Image.FromFile(@"C:\arrow.png"); 注意: 注意:Glyphs プロパティに Nothing(Null) を設定すると、デフォルトの画像が復元されます。アイコンを非表示にする場 合は、小さなブランク画像に設定してください。 エラー情報を表示する ShowErrors プロパティを True に設定し、GetCellErrorInfo/GetRowErrorInfo イベントを使用して制御します。 【実行例】 332 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' エラー情報を表示 flex.ShowErrors = True End Sub Private Sub flex_GetCellErrorInfo(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.GetErrorInfoEventArgs) Handles flex.GetCellErrorInfo ' 1列目のデータが空白の場合、 ' セルにエラーアイコンを表示 If e.Col = 1 And flex(e.Row, e.Col) = "" Then e.ErrorText = "未入力" End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // エラー情報を表示 flex.ShowErrors = true; } private void flex_GetCellErrorInfo(object sender, C1.Win.C1FlexGrid.GetErrorInfoEventArgs e) { // 1列目のデータが空白の場合、 // セルにエラーアイコンを表示 if((e.Col == 1) && (flex[e.Row, e.Col].ToString() == "")) { e.ErrorText = "未入力"; 333 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms } } 注意: 注意:エラー情報の表示については、付属の ErrorInfo サンプルも参照してください。 エラー情報のアイコンを変更する Glyphs プロパティで GlyphEnum.ErrorInfo を指定して変更します。 【実行例】 変更前(デフォルト) Visual Basic コードの書き方 Visual Basic 334 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.ShowErrors = True flex.Glyphs(C1.Win.C1FlexGrid.GlyphEnum.ErrorInfo) = Image.FromFile("C:\bikuri.gif") C# コードの書き方 C# flex.ShowErrors = true; flex.Glyphs[C1.Win.C1FlexGrid.GlyphEnum.ErrorInfo] = Image.FromFile(@"C:\bikuri.gif") 注意: Glyphs プロパティに Nothing(Null) を設定すると、デフォルトの画像が復元されます。アイコンを非表示にする 場合は、ShowErrors プロパティを False に設定してください。 エラー情報の表示方法については、「エラー情報を表示する」を参照してください。 カレント行を示すアイコンを表示する ShowCursor プロパティを True に設定(デフォルトは False )すると、固定列に DB 形式のカーソルを表示することができま す。 【実行例】 Visual Basic コードの書き方 Visual Basic flex.ShowCursor = True C# コードの書き方 C# flex.ShowCursor = true; 注意: 注意:アイコンを変更する場合は、Glyphs プロパティで GlyphEnum.DBCursor を指定して変更します。 335 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms イメージを拡大/縮小する セルに表示されている画像の表示方法は、行列やスタイルの ImageAlign プロパティを使用して変更します。 列単位でイメージを拡大/縮小 グリッドの行がリサイズされたとき単一列のイメージを拡大/縮小するには、ImageAlign プロパティを Scale に設定します。 【行のリサイズ前】 【行のリサイズ後】 デザイナの場合 1. [FlexGrid 列エディタ 列エディタ]を開きます。列エディタへのアクセス方法の詳細については、「列エディタにアクセス」を参照し てください。 2. 右ペインからイメージを含む列を選択し、左ペインの ImageAlign プロパティを Scale に設定します。 336 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 3. 〈OK〉〉をクリックし、エディタを閉じます。 コードの場合 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 行の高さを設定 flex.Rows(1).Height = 2 * flex.Rows.DefaultSize flex.Rows(2).Height = 2 * flex.Rows.DefaultSize ’ 3列目のみ設定 flex.Cols(3).ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.Scale End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 行の高さを設定 flex.Rows[1].Height = 2 * flex.Rows.DefaultSize; flex.Rows[2].Height = 2 * flex.Rows.DefaultSize; // 3列目のみ設定 flex.Cols[3].ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.Scale; } グリッド全体でイメージを拡大/縮小 1つの列だけでなく、グリッド全体でイメージを拡大/縮小するには、Normal 組み込みスタイルの ImageAlignプロパティを Scale に設定します。 【行のリサイズ前】 337 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【行のリサイズ後】 デザイナの場合 1. [FlexGrid スタイルエディタ スタイルエディタ]を開きます。スタイルエディタへのアクセス方法の詳細については、「スタイルエディタにア クセス」を参照してください。 2. [組み込みスタイル]のリストで Normal を選択します。 3. 右ペインで、ImageAlign プロパティを探し、それを Scale に設定します。 338 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 4. 〈OK〉をクリックし、エディタを閉じます。 コードの場合 Form_Load イベントに次のコードを追加します。 Visual Basic コードの書き方 Visual Basic flex.Styles("Normal").ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.Scale C# コードの書き方 C# flex.Styles("Normal").ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.Scale; 描画方法を変更する C1FlexGrid の描画はデフォルトで GDI+ で行われますが、UseCompatibleTextRendering プロパティを False に設定する ことで GDI で描画できます。 また、編集エディタは GDI で描画されます。そのため、編集中と非編集時で描画が少し異なります。このような場合には、 UseCompatibleTextRendering プロパティを False に設定し、非編集時の描画を GDI で行った上で、Editor 組み込みスタイ ルの Margins プロパティ(マージン)を調整することで対応できます。 【実行例】 339 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' GDIで描画します flex.UseCompatibleTextRendering = False flex.Font = New Font("MS Pゴシック", 11) ' 編集時のマージンを設定 flex.Styles.Editor.Margins = New System.Drawing.Printing.Margins(3, 1, 2, 1) flex.Cols(2).DataType = GetType(String) flex(2, 2) = "12345678901234567890" flex(3, 2) = "12345678901234567890" flex.AutoSizeCol(2) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // GDIで描画します flex.UseCompatibleTextRendering = false; flex.Font = new Font("MS Pゴシック", 11); // 編集時のマージンを設定 flex.Styles.Editor.Margins = new System.Drawing.Printing.Margins(3, 1, 2, 1); flex.Cols[2].DataType = typeof(string); flex[2, 2] = "12345678901234567890"; flex[3, 2] = "12345678901234567890"; flex.AutoSizeCol(2); } コンテキストメニューを表示する 340 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 非編集時の場合 ContextMenuStrip コントロールを使用して任意のコンテキストメニューを作成し、C1FlexGrid の ContextMenuStrip プロ パティに設定します。 注意: ContextMenuStrip コントロールの詳細は、MSDN を参照してください。 C1FlexGrid には ContextMenu プロパティも用意されています。以前のバージョンの ContextMenu コントロー ルを利用する場合に使用してください。 【実行例】 Visual Basic コードの書き方 Visual Basic Dim cm As New ContextMenuStrip cm.Items.Add("Menu1") cm.Items.Add("Menu2") cm.Items.Add("Menu3") flex.ContextMenuStrip = cm C# コードの書き方 C# ContextMenuStrip cm = new ContextMenuStrip(); cm.Items.Add("Menu1"); cm.Items.Add("Menu2"); cm.Items.Add("Menu3"); flex.ContextMenuStrip = cm; 編集中の場合 編集中は編集用エディタに設定されているデフォルトのコンテキストメニューが表示されます。デフォルトのコンテキストメ ニューを変更する場合は、StartEdit イベントで編集用エディタを取得し、別の ContextMenuStrip コントロールを設定しま 341 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms す。 【実行例 (デフォルトの状態)】 【実行例 (変更時)】 Visual Basic コードの書き方 Visual Basic Private Sub flex_StartEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.StartEdit ' 1列目のみコンテキストメニューを変更 342 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms If e.Col = 1 Then ' 編集用エディタを取得 Dim tb As TextBox tb = CType(flex.Editor, TextBox) ' コンテキストメニューを作成 Dim cm2 As New ContextMenuStrip cm2.Items.Add("Menu1-Edit") cm2.Items.Add("Menu2-Edit") cm2.Items.Add("Menu3-Edit") ' コンテキストメニューを設定 tb.ContextMenuStrip = cm2 Else ' コンテキストメニューをクリア(デフォルトに戻す) flex.Editor.ContextMenuStrip = Nothing End If End Sub C# コードの書き方 C# private void flex_StartEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { // 1列目のみコンテキストメニューを変更 if (e.Col == 1) { // 編集用エディタを取得 TextBox tb = (TextBox)flex.Editor; // コンテキストメニューを作成 ContextMenuStrip cm2 = new ContextMenuStrip(); cm2.Items.Add("Menu1-Edit"); cm2.Items.Add("Menu2-Edit"); cm2.Items.Add("Menu3-Edit"); // コンテキストメニューを設定 tb.ContextMenuStrip = cm2; } else { // コンテキストメニューをクリア(デフォルトに戻す) flex.Editor.ContextMenuStrip = null; ; } } ユーザーデータをツールチップに表示する ユーザーデータを表示するツールチップを追加するには、MouseMove や MouseEnterCell/MouseLeaveCell イベントを 使用し、UserData プロパティを取得して ToolTip コントロールに表示します。ここでは、行、列、セル、セル範囲、スタイルの UserData を ToolTips に表示する方法を紹介します。 行のユーザーデータをツールチップに表示 行のユーザーデータをツールチップに表示するには、MouseEnterCell イベントを使用し、UserData プロパティを取得して ToolTip コントロールに表示します。 343 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 ツールチップは、行全体にわたって表示されます。 1. ツールボックスの ToolTip コントロールを探し、それをフォームに追加します。 2. Form_Load イベントで、行の UserData プロパティを設定します。この例では、LastName/FirstName 列のデータを 使用しています。 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i As Integer = flex.Rows.Fixed To flex.Rows.Count - 1 flex.Rows(i).UserData = "顧客名:" & flex(i, 2) & " " & flex(i, 3) Next End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { for (int i = flex.Rows.Fixed; i < flex.Rows.Count; i++) { flex.Rows[i].UserData = "顧客名:" + flex[i, 2] + " " + flex[i, 3]; } } 3. 以下のコードを MouseEnterCell イベントとMouseLeaveCell イベントに追加し、行の UserData をツールチップに表 示します。 Visual Basic コードの書き方 Visual Basic Private Sub flex_MouseEnterCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.MouseEnterCell 344 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms If e.Row >= flex.Rows.Fixed Then Dim tip As String tip = flex.Rows(e.Row).UserData ' ToolTipを表示 ToolTip1.SetToolTip(flex, tip) End If End Sub Private Sub flex_MouseLeaveCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.MouseLeaveCell ' ToolTipを非表示 ToolTip1.SetToolTip(flex, "") End Sub C# コードの書き方 C# private void flex_MouseEnterCell(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { if (e.Row >= flex.Rows.Fixed) { string tip; tip = flex.Rows[e.Row].UserData.ToString(); // ToolTipを表示 toolTip1.SetToolTip(flex, tip); } } private void flex_MouseLeaveCell(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { // ToolTipを非表示 toolTip1.SetToolTip(flex, ""); } 注意: 注意:ToolTip コントロールの詳細は、MSDNなどを参照してください。 列のユーザーデータをツールチップに表示する 列のユーザーデータをツールチップに表示するには、MouseEnterCell イベントを使用し、UserData プロパティを取得して ToolTip コントロールに表示します。 【実行例】 ツールチップは2列目のみに表示されます。 345 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 1. ツールボックスの ToolTip コントロールを探し、それをフォームに追加します。 2. Form_Load イベントで、2列目の UserData プロパティを設定します。 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex.Cols(2).UserData = "LastName" End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex.Cols[2].UserData = "LastName"; } 3. 以下のコードを MouseEnterCell イベントとMouseLeaveCell イベントに追加し、列の UserData をツールチップに表 示します。 Visual Basic コードの書き方 Visual Basic Private Sub flex_MouseEnterCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.MouseEnterCell If e.Col = 2 Then Dim tip As String tip = flex.Cols(2).UserData ' ToolTipを表示 ToolTip1.SetToolTip(flex, tip) End If End Sub Private Sub flex_MouseLeaveCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.MouseLeaveCell ' ToolTipを非表示 346 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ToolTip1.SetToolTip(flex, "") End Sub C# コードの書き方 C# private void flex_MouseEnterCell(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { if (e.Col == 2) { string tip; tip = flex.Cols[2].UserData.ToString(); // ToolTipを表示 toolTip1.SetToolTip(flex, tip); } } private void flex_MouseLeaveCell(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { // ToolTipを非表示 toolTip1.SetToolTip(flex, ""); } 注意: 注意:ToolTip コントロールの詳細は、MSDN などを参照してください。 セルのユーザーデータをツールチップに表示 単一セルのユーザーデータをツールチップに表示するには、 MouseEnterCell イベントを使用し、 GetUserData プロパティ を取得して ToolTip コントロールに表示します。 【実行例】 3行2列目のセルにマウスを移動すると、ツールチップが表示されます。 1. ツールボックスの ToolTip コントロールを探し、それをフォームに追加します。 347 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 2. Form_Load イベントで、行の GetUserData プロパティを設定します。この例では、LastName/FirstName 列のデー タを使用しています。 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim ud As String ud = flex(3, 2) & " " & flex(3, 3) & "さんの誕生日:" & flex(3, 6) flex.SetUserData(3, 2, ud) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { string ud; ud = flex[3, 2] + " " + flex[3, 3] + "さんの誕生日:" + ((DateTime)flex[3, 6]).ToString("yyyy/MM/dd"); flex.SetUserData(3, 2, ud); } 3. 以下のコードを MouseLeaveCell イベントに追加し、GetUserData メソッドで取得したセルの UserData をツールチッ プに表示します。 Visual Basic コードの書き方 Visual Basic Private Sub flex_MouseEnterCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.MouseEnterCell Dim tip As String = "" If e.Row = 3 And e.Col = 2 Then tip = flex.GetUserData(3, 2) End If ToolTip1.SetToolTip(flex, tip) End Sub C# コードの書き方 C# private void flex_MouseEnterCell(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { string tip = ""; if((e.Row == 3) && (e.Col == 2)) { tip = flex.GetUserData(3, 2).ToString(); } toolTip1.SetToolTip(flex, tip); } 注意: 注意:ToolTip コントロールの詳細は、MSDNなどを参照してください。 348 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms セル範囲のユーザーデータをツールチップに表示 セル範囲のユーザーデータをツールチップに表示するには、MouseEnterCell イベントを使用し、UserData プロパティを取得 して ToolTip コントロールに表示します。 【実行例】 セル範囲全体で ToolTip が表示されます。 1. ツールボックスの ToolTip コントロールを探し、それをフォームに追加します。 2. Form_Load イベントでセル範囲に対して UserData プロパティを設定します。 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 6行1列目-8行3列目のセル範囲を取得します Dim rng As C1.Win.C1FlexGrid.CellRange rng = flex.GetCellRange(6, 1, 8, 3) ' セル範囲を見やすくするために背景色を設定します rng.StyleNew.BackColor = Color.AliceBlue ' セル範囲のユーザーデータを設定します rng.UserData = "EmployeeID 6~8" End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 6行1列目-8行3列目のセル範囲を取得します C1.Win.C1FlexGrid.CellRange rng = flex.GetCellRange(6, 1, 8, 3); // セル範囲を見やすくするために背景色を設定します rng.StyleNew.BackColor = Color.AliceBlue; // セル範囲のユーザーデータを設定します 349 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms rng.UserData = "EmployeeID 6~8"; } 3. MouseEnterCell イベントを使用して、ツールチップを表示します。 Visual Basic コードの書き方 Visual Basic Private Sub flex_MouseEnterCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.MouseEnterCell Dim tip As String = "" If Not flex.GetUserData(e.Row, e.Col) Is Nothing Then tip = flex.GetUserData(e.Row, e.Col) End If ToolTip1.SetToolTip(flex, tip) End Sub C# コードの書き方 C# private void flex_MouseEnterCell(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { string tip = ""; if (flex.GetUserData(e.Row, e.Col) != null) { tip = flex.GetUserData(e.Row, e.Col).ToString(); } toolTip1.SetToolTip(flex, tip); } 注意: 注意:ToolTip コントロールの詳細は、MSDNなどを参照してください。 スタイルのユーザーデータをツールチップに表示 スタイルのユーザーデータをツールチップに表示するには、MouseEnterCell イベントを使用し、UserData プロパティを取得 して ToolTip コントロールに表示します。 【実行例】 スタイル全体で ToolTip が表示されます。 350 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 1. ツールボックスの ToolTip コントロールを探し、それをフォームに追加します。 2. Form_Load イベントで行と列のカスタムスタイルを作成して、スタイルを割り当てます。CellStyle の作成方法につい ての詳細は、「行/列の外観を変更する」を参照してください。 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 列のCellStyleを作成します Dim cc As C1.Win.C1FlexGrid.CellStyle cc = flex.Styles.Add("ColumnColor") cc.BackColor = Color.Cornsilk ' スタイル名を持つUserDataを追加します cc.UserData = "ColumnColor Style" ' 行のCellStyleを作成します Dim rs As C1.Win.C1FlexGrid.CellStyle rs = flex.Styles.Add("RowColor") rs.BackColor = Color.PowderBlue ' スタイル名を持つUserDataを追加します rs.UserData2 = "RowColor Style" ' ColumnColorスタイルを列に割り当てます flex.Cols(2).Style = flex.Styles("ColumnColor") ' RowColor スタイルを行に割り当てます。 flex.Rows(4).Style = flex.Styles("RowColor") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 列のCellStyleを作成します C1.Win.C1FlexGrid.CellStyle cc; cc = flex.Styles.Add("ColumnColor"); cc.BackColor = Color.Cornsilk; 351 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // スタイル名を持つUserDataを追加します cc.UserData = "ColumnColor Style"; // 行のCellStyleを作成します C1.Win.C1FlexGrid.CellStyle rs; rs = flex.Styles.Add("RowColor"); rs.BackColor = Color.PowderBlue; // スタイル名を持つUserDataを追加します rs.UserData = "RowColor Style"; // ColumnColorスタイルを列に割り当てます flex.Cols[2].Style = flex.Styles["ColumnColor"]; // RowColor スタイルを行に割り当てます。 flex.Rows[4].Style = flex.Styles["RowColor"]; } 3. 以下のコードを MouseEnterCell イベントと MouseLeaveCell イベントに追加し、UserData をツールチップを表示し ます。 Visual Basic コードの書き方 Visual Basic Private Sub flex_MouseEnterCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.MouseEnterCell Dim tip As String = "" If e.Row = 4 Then tip = flex.Rows(4).Style.UserData End If If e.Col = 2 Then tip = flex.Cols(2).Style.UserData End If ' ToolTipを表示 ToolTip1.SetToolTip(flex, tip) End Sub Private Sub flex_MouseLeaveCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.MouseLeaveCell ' ToolTipを非表示 ToolTip1.SetToolTip(flex, "") End Sub C# コードの書き方 C# private void flex_MouseEnterCell(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { string tip = ""; if (e.Row == 4) { tip = flex.Rows[4].Style.UserData.ToString(); } if (e.Col == 2) { tip = flex.Cols[2].Style.UserData.ToString(); } 352 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // ToolTipを表示 toolTip1.SetToolTip(flex, tip); } private void flex_MouseLeaveCell(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { // ToolTipを非表示 toolTip1.SetToolTip(flex, ""); } 注意: 注意:ToolTip コントロールの詳細は、MSDNなどを参照してください。 マウス下のセルをハイライト表示する MouseEnterCell/MouseLeaveCellイベントを使用することで、セル内にマウスポインタが入ったとき、およびマウスポインタ がセルから離れたときを判別できます。MouseEnterCell イベントでスタイルを設定し、MouseLeaveCell イベントで設定した スタイルを削除することでマウス下のセルをハイライト表示します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' カスタムスタイルを作成 flex.Styles.Add("track") flex.Styles("track").BackColor = Color.Gold End Sub Private Sub flex_MouseEnterCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.MouseEnterCell ' セル内にマウスポインタが入ればスタイルを設定 flex.SetCellStyle(e.Row, e.Col, flex.Styles("track")) End Sub 353 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Private Sub flex_MouseLeaveCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.MouseLeaveCell ' セルから出た際にスタイルを削除 flex.SetCellStyle(e.Row, e.Col, CType(Nothing, C1.Win.C1FlexGrid.CellStyle)) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // カスタムスタイルを作成 flex.Styles.Add("track"); flex.Styles["track"].BackColor = Color.Gold; } private void flex_MouseEnterCell(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { // セル内にマウスポインタが入ればスタイルを設定 flex.SetCellStyle(e.Row, e.Col, flex.Styles["track"]); } private void flex_MouseLeaveCell(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { // セルから出た際にスタイルを削除 flex.SetCellStyle(e.Row, e.Col, (C1.Win.C1FlexGrid.CellStyle)null); } マージ マージに関するタスクを紹介します。 隣接する同一データを自動マージする グリッドの AllowMerging プロパティを Free にし(デフォルトはNone)、行や列の AllowMerging プロパティを True に設 定することで、固定セル・通常セルを自動的にマージして表示します。 【実行例】 2列目、5・7・8行目をマージ。8行目は列のマージが優先されます。 354 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic ' グリッドのAllowMergingプロパティを設定 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Free ' 固定行数を設定 flex.Rows.Fixed = 2 ' 各行、列のAllowMergingプロパティを設定 flex.Cols(2).AllowMerging = True flex.Rows(5).AllowMerging = True flex.Rows(8).AllowMerging = True ' データの設定 flex(0, 2) = "列のマージ" flex(1, 2) = "列のマージ" flex(2, 2) = "列のマージ" flex(3, 2) = "列のマージ" flex(5, 3) = "行のマージ" flex(5, 4) = "行のマージ" flex(7, 2) = "列のマージが優先" flex(8, 2) = "列のマージが優先" flex(8, 3) = "列のマージが優先" C# コードの書き方 C# // グリッドのAllowMergingプロパティを設定 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Free; // 固定行数を設定 flex.Rows.Fixed = 2; // 各行、列のAllowMergingプロパティを設定 flex.Cols[2].AllowMerging = true; flex.Rows[5].AllowMerging = true; flex.Rows[8].AllowMerging = true; 355 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // データの設定 flex[0, 2] = flex[1, 2] = flex[2, 2] = flex[3, 2] = flex[5, 3] = flex[5, 4] = flex[7, 2] = flex[8, 2] = flex[8, 3] = "列のマージ"; "列のマージ"; "列のマージ"; "列のマージ"; "行のマージ"; "行のマージ"; "列のマージが優先"; "列のマージが優先"; "列のマージが優先"; 注意: 固定セルと通常セルはマージされません。 自動マージの場合、特定の位置でのみマージする(同一データをマージしない)といった動作はできません。この 場合は、自動マージのカスタマイズや制限付きマージ、カスタムマージを検討してください。 行と列のマージが同時に行われた場合、列のマージが優先されます。 カスタムマージと自動マージを同時に実装することはできません。 隣接する同一データを自動マージする(制限付き) グリッドの AllowMerging プロパティを RestrictRows(上にあるセルもマージされる場合)、またはRestrictCols(左にあるセ ルもマージされる場合)、RestrictAll(上または左にあるセルもマージされる場合)にし、行や列の AllowMerging プロパティ を True に設定します。 【実行例】 上にあるセルもマージされる場合( 上にあるセルもマージされる場合(RestrictRows)) 1. 2行目をマージ。2行目のCCCのセルは、1行目がマージされているセルのみマージされます。 Visual Basic コードの書き方 Visual Basic ' グリッドのAllowMergingプロパティを設定 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.RestrictRows ' 各行、列のAllowMergingプロパティを設定 flex.Rows(1).AllowMerging = True 356 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.Rows(2).AllowMerging = True ' 列ヘッダの設定 flex.Rows(1).Caption = "1行目" flex.Rows(2).Caption = "2行目" ' データの設定 flex(1, 1) = "AAA" flex(1, 2) = "AAA" flex(1, 3) = "BBB" flex(1, 4) = "BBB" flex(2, 1) = "CCC" flex(2, 2) = "CCC" flex(2, 3) = "CCC" flex(2, 4) = "CCC" C# コードの書き方 C# // グリッドのAllowMergingプロパティを設定 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.RestrictRows; // 各行、列のAllowMergingプロパティを設定 flex.Rows[1].AllowMerging = true; flex.Rows[2].AllowMerging = true; // 列ヘッダの設定 flex.Rows[1].Caption = "1行目"; flex.Rows[2].Caption = "2行目"; // データの設定 flex[1, 1] = "AAA"; flex[1, 2] = "AAA"; flex[1, 3] = "BBB"; flex[1, 4] = "BBB"; flex[2, 1] = "CCC"; flex[2, 2] = "CCC"; flex[2, 3] = "CCC"; flex[2, 4] = "CCC"; 【実行例】 左にあるセルもマージされる場合( 左にあるセルもマージされる場合(RestrictCols)) 1. 2列目をマージ。2列目のCCCのセルは、1列目がマージされているセルのみマージされます。 357 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic ' グリッドのAllowMergingプロパティを設定 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.RestrictCols ' 各行、列のAllowMergingプロパティを設定 flex.Cols(1).AllowMerging = True flex.Cols(2).AllowMerging = True ' 列ヘッダの設定 flex.Cols(1).Caption = "1列目" flex.Cols(2).Caption = "2列目" ' データの設定 flex(1, 1) = "AAA" flex(2, 1) = "AAA" flex(3, 1) = "BBB" flex(4, 1) = "BBB" flex(1, 2) = "CCC" flex(2, 2) = "CCC" flex(3, 2) = "CCC" flex(4, 2) = "CCC" C# コードの書き方 C# // グリッドのAllowMergingプロパティを設定 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.RestrictCols; // 各行、列のAllowMergingプロパティを設定 flex.Cols[1].AllowMerging = true; flex.Cols[2].AllowMerging = true; // 列ヘッダの設定 flex.Cols[1].Caption = "1列目"; flex.Cols[2].Caption = "2列目"; // データの設定 358 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex[1, flex[2, flex[3, flex[4, flex[1, flex[2, flex[3, flex[4, 1] 1] 1] 1] 2] 2] 2] 2] = = = = = = = = "AAA"; "AAA"; "BBB"; "BBB"; "CCC"; "CCC"; "CCC"; "CCC"; 注意: 固定セルと通常セルはマージされません。 行と列のマージが同時に行われた場合、列のマージが優先されます。 カスタムマージと自動マージを同時に実装することはできません。 自動マージ処理をカスタマイズする C1FlexGrid コントロールの自動マージでは、行のマージよりも列のマージが優先される仕様になっているため、行および列の 両方にまたがるブロックのセル範囲をマージすることができません。また、隣接するセルの値が同じ場合でも特定の位置では マージしないといった動作もできないといった制限があります。 この場合、カスタムマージ(セル結合)で対応するか、C1FlexGrid を継承、GetMergeRange メソッドをオーバーライドし、自 動マージ処理をカスタマイズする方法があります。 【実行例】 ブロックのセル範囲をマージ (CustomCellMerge サンプル) 曜日(列)や時間(行)をまたがってブロック単位にマージされています。 【実行例】 マージ範囲を限定 (CustomCellMerge2 サンプル) 上下の隣接するセル同士が同じ値でもマージを行わず、[ID] 列ごとにマージしています。 359 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 注意: 注意:コード例については、付属の CustomCellMerge/CustomCellMerge2 サンプルを参照してください。 カスタムマージ(セル結合)を行う グリッドのAllowMerging プロパティをCustom にし、マージ(結合)したいセル範囲を MergedRanges コレクションに追加し ます。 【実行例】 2行 行2列目から 列目から5行 行3列目を結合 列目を結合 Visual Basic コードの書き方 Visual Basic ' グリッドのAllowMergingプロパティを設定 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Custom ' マージ(結合)したいセル範囲を取得 360 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetCellRange(2, 2, 5, 3) ' セル範囲にデータを設定 cr.Data = "マージ(セル結合)" ' セル範囲の背景色を設定 cr.StyleNew.BackColor = Color.AliceBlue ' セル範囲のテキスト表示位置を設定 cr.Style.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter ' セル範囲をMergedRangesコレクションに追加 flex.MergedRanges.Add(cr) C# コードの書き方 C# // グリッドのAllowMergingプロパティを設定 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Custom; // マージ(結合)したいセル範囲を取得 C1.Win.C1FlexGrid.CellRange cr; cr = flex.GetCellRange(2, 2, 5, 3); // セル範囲にデータを設定 cr.Data = "マージ(セル結合)"; // セル範囲の背景色を設定 cr.StyleNew.BackColor = Color.AliceBlue; // セル範囲のテキスト表示位置を設定 cr.Style.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter; // セル範囲をMergedRangesコレクションに追加 flex.MergedRanges.Add(cr); 注意: マージ(結合)を解除する場合は、MergedRanges コレクションから削除(Clear/ /RemoveAt)します。 カスタムマージと自動マージを同時に実装することはできません。 オーバーフロー表示を行う グリッドの AllowMerging プロパティを Spill にします。1つのセル内に収まらない長いデータが隣のセル(空白の場合に限 り)にはみ出して表示されます。 【実行例】 361 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic ' グリッドのAllowMergingプロパティを設定 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Spill ' データの設定 flex(2, 1) = "セル内に収まらない長いデータをオーバーフロー表示" C# コードの書き方 C# // グリッドのAllowMergingプロパティを設定 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Spill; // データの設定 flex[2, 1] = "セル内に収まらない長いデータをオーバーフロー表示"; 注意: 注意:カスタムマージや自動マージと同時に実装することはできません。 ノード行をマージする グリッドの AllowMerging プロパティを Nodes にします。ノード行全体がマージされて表示されます。 【実行例】 362 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' グリッドの AllowMerging プロパティを設定 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Nodes ' 列数:6 flex.Cols.Count = 6 ' 固定列:0 flex.Cols.Fixed = 0 ' ツリー列:0 flex.Tree.Column = 0 ' ツリースタイルを設定 flex.Tree.Style = C1.Win.C1FlexGrid.TreeStyleFlags.SimpleLeaf ' 1行目をノード行に設定 flex.Rows(1).IsNode = True ' 階層レベルを0に設定 flex.Rows(1).Node.Level = 0 ' 3行目をノード行に設定 flex.Rows(3).IsNode = True ' 階層レベルを0に設定 flex.Rows(3).Node.Level = 0 flex(1, 0) = "ノード行1" flex(3, 0) = "ノード行2" End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // グリッドのAllowMergingプロパティを設定 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Nodes; // 列数:6 flex.Cols.Count = 6; // 固定列:0 flex.Cols.Fixed = 0; 363 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // ツリー列:0 flex.Tree.Column = 0; // ツリースタイルを設定 flex.Tree.Style = C1.Win.C1FlexGrid.TreeStyleFlags.SimpleLeaf; // 1行目をノード行に設定 flex.Rows[1].IsNode = true; // 階層レベルを0に設定 flex.Rows[1].Node.Level = 0; // 3行目をノード行に設定 flex.Rows[3].IsNode = true; // 階層レベルを0に設定 flex.Rows[3].Node.Level = 0; flex[1, 0] = "ノード行1"; flex[3, 0] = "ノード行2"; } 固定セルと通常セルのマージモードを別々に設定する AllowMergingFixed プロパティで固定セルのマージモードを、AllowMerging プロパティで通常セルのマージモードを設定 します。 注意: 注意:グリッドの AllowMerging プロパティを FixedOnly に設定すると、固定行/列のみが自動マージの対象になり、 通常セルがマージされません。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 固定行数の設定 flex.Rows.Fixed = 3 ' 固定セルのマージモードを設定 flex.AllowMergingFixed = C1.Win.C1FlexGrid.AllowMergingEnum.Custom 364 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ' マージ(結合)したいセル範囲を取得 Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetCellRange(0, 1, 2, 3) ' セル範囲にデータを設定 cr.Data = "マージ(セル結合)" ' セル範囲のテキスト表示位置を設定 cr.StyleNew.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter ' セル範囲をMergedRangesコレクションに追加 flex.MergedRanges.Add(cr) ' 通常セルのマージモードを設定 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Free ' 各列のAllowMergingプロパティを設定 flex.Cols(1).AllowMerging = True flex.Cols(2).AllowMerging = True flex.Cols(3).AllowMerging = True ' データの設定 flex(3, 1) = "AAA" flex(4, 1) = "AAA" flex(5, 1) = "AAA" flex(3, 2) = "BBB" flex(4, 2) = "BBB" flex(5, 2) = "BBB" flex(6, 2) = "CCC" flex(7, 2) = "CCC" End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 固定行数の設定 flex.Rows.Fixed = 3; // 固定セルのマージモードを設定 flex.AllowMergingFixed = C1.Win.C1FlexGrid.AllowMergingEnum.Custom; // マージ(結合)したいセル範囲を取得 Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetCellRange(0, 1, 2, 3); // セル範囲にデータを設定 cr.Data = "マージ(セル結合)"; // セル範囲のテキスト表示位置を設定 cr.StyleNew.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter; // セル範囲をMergedRangesコレクションに追加 flex.MergedRanges.Add(cr); // 通常セルのマージモードを設定 flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Free; // 各列のAllowMergingプロパティを設定 flex.Cols[1].AllowMerging = true; flex.Cols[2].AllowMerging = true; flex.Cols[3].AllowMerging = true; // データの設定 flex[3, 1] = "AAA"; 365 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex[4, flex[5, flex[3, flex[4, flex[5, flex[6, flex[7, 1] 1] 2] 2] 2] 2] 2] = = = = = = = "AAA"; "AAA"; "BBB"; "BBB"; "BBB"; "CCC"; "CCC"; } 注意: 行と列のマージが同時に行われた場合、列のマージが優先されます。 固定セルまたは通常セル内でカスタムマージと自動マージを同時に実装することはできません。 マージセルかどうかを判別する GetMergedRange メソッドで任意のセルを含むセル範囲を取得し、CellRange オブジェクトの IsSingleCell プロパティで、取 得したセル範囲が単一セルで構成されるかどうかを参照します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' カスタムマージ(セル結合) flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Custom Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetCellRange(1, 1, 2, 3) flex.MergedRanges.Add(cr) End Sub ' 2行3列目のセルがマージセルかどうかを判別します Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 366 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ' 2行3列目のセルを含むCellRangeオブジェクトを取得 Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetMergedRange(2, 3) ' マージセルかどうかを判別 If cr.IsSingleCell = False Then ' マージセルの場合の処理 MessageBox.Show("マージセルです") End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // カスタムマージ(セル結合) flex.AllowMerging = C1.Win.C1FlexGrid.AllowMergingEnum.Custom; C1.Win.C1FlexGrid.CellRange cr; cr = flex.GetCellRange(1, 1, 2, 3); flex.MergedRanges.Add(cr); } // 2行3列目のセルがマージセルかどうかを判別します private void button1_Click(object sender, EventArgs e) { // 2行3列目のセルを含むCellRangeオブジェクトを取得 C1.Win.C1FlexGrid.CellRange cr; cr = flex.GetMergedRange(2, 3); // マージセルかどうかを判別 if(cr.IsSingleCell == false) { // マージセルの場合の処理 MessageBox.Show("マージセルです"); } } 選択/移動 セルの選択や移動に関するタスクを紹介します。付属の下記サンプルも参照してください。 サンプル 説明 CustomSelection テキストエディタのような非長方形の行範囲選択を実現します LockedColumns 列単位でフォーカス不可に設定します MultiSelection Excel のような複数の範囲選択を実現します SelectionMode FlexGrid に実装されている選択方法の種類を紹介します 選択モードを変更する SelectionMode プロパティを変更します。(デフォルトはDefault) 【実行例】 単一セルの選択( 単一セルの選択(Cell)) 367 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 単一セル、セル範囲の選択( 単一セル、セル範囲の選択(CellRange)) 【実行例】 単一列の選択( 単一列の選択(Column)) 368 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 単一列、連続する複数列の選択( 単一列、連続する複数列の選択(ColumnRange)) 【実行例】 行、複数行、連続しない複数行の選択( 行、複数行、連続しない複数行の選択(ListBox)) 369 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 単一行の選択( 単一行の選択(Row)) 【実行例】 連続する複数行の選択( 連続する複数行の選択(ScrollFlags.AlwaysVisible)) 370 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic flex.SelectionMode = C1.Win.C1FlexGrid.SelectionModeEnum.ListBox C# コードの書き方 C# flex.SelectionMode = C1.Win.C1FlexGrid.SelectionModeEnum.ListBox; 注意: 注意:コントロールにフォーカスがないときにセルを強調表示するかどうかを指定するには、HighLight プロパティを使用 します。 複数の選択モードを利用する 行ヘッダをクリックした際に SelectionMode プロパティを ListBox に設定し、その他の部分をクリックした場合には Default に戻します。このような処理で、Default+ListBox の選択モードを実装します。 Visual Basic コードの書き方 Visual Basic Private Sub flex_BeforeMouseDown(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.BeforeMouseDownEventArgs) Handles flex.BeforeMouseDown ' 行ヘッダがクリックされた場合、選択モードをListBoxに設定 If flex.HitTest(e.X, e.Y).Type = C1.Win.C1FlexGrid.HitTestTypeEnum.RowHeader Then flex.SelectionMode = C1.Win.C1FlexGrid.SelectionModeEnum.ListBox Else flex.SelectionMode = C1.Win.C1FlexGrid.SelectionModeEnum.Default End If End Sub C# コードの書き方 C# 371 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms private void flex_BeforeMouseDown(object sender, C1.Win.C1FlexGrid.BeforeMouseDownEventArgs e) { // 行ヘッダがクリックされた場合、選択モードをListBoxに設定 if (flex.HitTest(e.X, e.Y).Type == C1.Win.C1FlexGrid.HitTestTypeEnum.RowHeader) { flex.SelectionMode = C1.Win.C1FlexGrid.SelectionModeEnum.ListBox; } else { flex.SelectionMode = C1.Win.C1FlexGrid.SelectionModeEnum.Default; } } 行全体をハイライト表示する SelectionMode プロパティを Row や RowRange、ListBox に設定して行選択にした上で、FocusRect プロパティを None にしてカレントセルのフォーカス枠を非表示にします。 【実行例】 Visual Basic コードの書き方 Visual Basic flex.SelectionMode = C1.Win.C1FlexGrid.SelectionModeEnum.ListBox flex.FocusRect = C1.Win.C1FlexGrid.FocusRectEnum.None C# コードの書き方 C# flex.SelectionMode = C1.Win.C1FlexGrid.SelectionModeEnum.ListBox; flex.FocusRect = C1.Win.C1FlexGrid.FocusRectEnum.None; 372 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 選択範囲を作成する 2つの対角(カレントセルと、セル範囲の最後のセル)でセル範囲を作成します。Row/Col プロパティにてカレントセル を、RowSel/ColSel プロパティにてセル範囲の最後のセルを設定します。Select メソッドでも同様の処理が可能です。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 3行2列目から6行3列目を選択範囲に設定 flex.Row = 3 flex.Col = 2 flex.RowSel = 6 flex.ColSel = 3 ' 同じ処理 'flex.Select(3, 2, 6, 3) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // 3行2列目から6行3列目を選択範囲に設定 flex.Row = 3; flex.Col = 2; flex.RowSel = 6; flex.ColSel = 3; // 同じ処理 //flex.Select(3, 2, 6, 3); } 373 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 注意: 注意:カレントセルを変更すると、選択範囲は自動的にリセットされます。 選択範囲を取得する Selection プロパティを使用します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.Selection MessageBox.Show("選択範囲" & vbCrLf & _ cr.r1 & ":" & cr.c1 & "から" & cr.r2 & ":" & cr.c2) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { C1.Win.C1FlexGrid.CellRange cr; cr = flex.Selection; MessageBox.Show("選択範囲\n" + cr.r1 + ":" + cr.c1 + "から" + cr.r2 + ":" + cr.c2); } 注意: 注意:カレントセルを変更すると、選択範囲は自動的にリセットされます。 複数行を選択する(ListBox) 374 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms コードから複数行を選択する場合、SelectionMode プロパティを ListBox に設定し、選択したい行のSelected プロパティを True にする方法があります。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 3、4行目を選択 ' ※この場合、カレントセルは移動しません flex.SelectionMode = C1.Win.C1FlexGrid.SelectionModeEnum.ListBox flex.Rows(3).Selected = True flex.Rows(4).Selected = True ' 3、4行目全体を選択範囲に設定 ' flex.Row = 3 ' flex.Col = flex.Cols.Fixed ' flex.RowSel = 4 ' flex.ColSel = flex.Cols.Count - 1 ' 同じ処理 'flex.Select(3, flex.Cols.Fixed, 4, flex.Cols.Count - 1, False) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // 3、4行目を選択 // ※この場合、カレントセルは移動しません flex.SelectionMode = C1.Win.C1FlexGrid.SelectionModeEnum.ListBox; flex.Rows[3].Selected = true; flex.Rows[4].Selected = true; 375 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // 3、4行目全体を選択範囲に設定 //flex.Row = 3; //flex.Col = flex.Cols.Fixed; //flex.RowSel = 4; //flex.ColSel = flex.Cols.Count - 1; // 同じ処理 //flex.Select(3, flex.Cols.Fixed, 4, flex.Cols.Count - 1, false); } 行の選択状態を取得する(ListBox) SelectionMode プロパティを ListBox に設定している場合は、Selected プロパティから選択されている行を取得することが できます。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim s As String = flex.Rows.Selected.Count & _ "行が選択されています。" & vbCrLf For Each r As C1.Win.C1FlexGrid.Row In flex.Rows.Selected s = s & r.Index & "行目" & vbCrLf Next ' 同じ結果になります For i As Integer = flex.Rows.Fixed To flex.Rows.Count - 1 If flex.Rows(i).Selected = True Then s = s & i & "行目" & vbCrLf End If Next MessageBox.Show(s) 376 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { flex.SelectionMode = C1.Win.C1FlexGrid.SelectionModeEnum.ListBox; String s = flex.Rows.Selected.Count + "行が選択されています。\n"; foreach (C1.Win.C1FlexGrid.Row r in flex.Rows.Selected) { s = s + r.Index + "行目\n"; } // 同じ処理です for (int i = flex.Rows.Fixed; i < flex.Rows.Count; i++) { if (flex.Rows[i].Selected = true) { s = s + i.ToString() + "行目\n"; } } MessageBox.Show(s); } カレントセルを移動/取得する Row プロパティにてカレント行を、Col プロパティにてカレント列を設定することで、カレントセルを移動します。Select メソッド を使用することでもカレントセルを移動できます。 カレントセルを取得する場合は、Row/ /Col プロパティを参照します。 【実行例】 3行2列目にカレントセルを移動 377 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic ' 行を移動 flex.Row = 3 ' 列を移動 flex.Col = 2 ' カレントセルを移動 flex.Select(3, 2, True) C# コードの書き方 C# // 行を移動 flex.Row = 3; // 列を移動 flex.Col = 2; // カレントセルを移動 flex.Select(3, 2, true); Enter/Tab キーによりカレントセルを移動する Enter キーでセルを移動するには、KeyActionEnter プロパティを変更します。(デフォルトMoveDown) また、Tab キーでセルを移動するには、KeyActionTab プロパティを変更します。(デフォルトNone) Visual Basic コードの書き方 Visual Basic flex.KeyActionEnter = C1.Win.C1FlexGrid.KeyActionEnum.MoveAcross flex.KeyActionTab = C1.Win.C1FlexGrid.KeyActionEnum.MoveAcrossOut C# コードの書き方 C# flex.KeyActionEnter = C1.Win.C1FlexGrid.KeyActionEnum.MoveAcross; flex.KeyActionTab = C1.Win.C1FlexGrid.KeyActionEnum.MoveAcrossOut; 注意: 注意:KeyActionEnter プロパティの設定は、編集時に Enter キーが押された際の動作になります。非編集時に Enter キーを押すと、編集状態(編集モードに移行)になります。「Enter キーを押した際、編集モードに移行しないようにする」も 参照してください。 なお、KeyActionEnter プロパティでは、MoveAcrossOut の設定は有効になりません。最終行・最終列のセルで Enter キー が押された際に別のコントロールに移動する場合は、別途コードで制御する必要があります。 【実行例】 378 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 移動後イメージ( 移動後イメージ(Button コントロールにフォーカスが移動) Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex.KeyActionEnter = C1.Win.C1FlexGrid.KeyActionEnum.MoveAcross End Sub ' 編集時に最終行・最終列で[Enter]キーを押した際 ' 次のコントロール(ボタン)にフォーカスを移動 Private Sub flex_KeyDownEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.KeyEditEventArgs) Handles flex.KeyDownEdit If flex.Row = flex.Rows.Count - 1 And _ flex.Col = flex.Cols.Count - 1 And _ 379 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms e.KeyCode = Keys.Enter Then flex.FinishEditing() Button1.Focus() End If End Sub ' 非編集時に最終行・最終列で[Enter]キーを押した際 ' 次のコントロール(ボタン)にフォーカスを移動 Private Sub flex_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles flex.KeyPress If flex.Row = flex.Rows.Count - 1 And _ flex.Col = flex.Cols.Count - 1 And _ Asc(e.KeyChar) = Keys.Enter Then e.Handled = True Button1.Focus() End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex.KeyActionEnter = C1.Win.C1FlexGrid.KeyActionEnum.MoveAcross; } // 編集時に最終行・最終列で[Enter]キーを押した際 // 次のコントロール(ボタン)にフォーカスを移動 private void flex_KeyDownEdit(object sender, C1.Win.C1FlexGrid.KeyEditEventArgs e) { if ((flex.Row == flex.Rows.Count - 1) && (flex.Col == flex.Cols.Count - 1) && (e.KeyCode == Keys.Enter)) { flex.FinishEditing(); button1.Focus(); } } // 非編集時に最終行・最終列で[Enter]キーを押した際 // 次のコントロール(ボタン)にフォーカスを移動 private void flex_KeyPress(object sender, KeyPressEventArgs e) { if ((flex.Row == flex.Rows.Count - 1) && (flex.Col == flex.Cols.Count - 1) && (e.KeyChar == '\r')) { e.Handled = true; button1.Focus(); } } 右クリックでカレントセルを移動する デフォルトの動作では、右クリックでセルは移動しません。BeforeMouseDown や MouseDown イベントなどを利用して右ク 380 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms リックを判別し、カレントセルを移動します。 Visual Basic コードの書き方 Visual Basic Private Sub flex_BeforeMouseDown(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.BeforeMouseDownEventArgs) Handles flex.BeforeMouseDown ' 右クリック時 If e.Button = Windows.Forms.MouseButtons.Right Then ' クリックされた位置を取得 Dim h As C1.Win.C1FlexGrid.HitTestInfo h = flex.HitTest(e.X, e.Y) ' カレントセルを移動 flex.Select(h.Row, h.Column) End If End Sub C# コードの書き方 C# private void flex_BeforeMouseDown(object sender, C1.Win.C1FlexGrid.BeforeMouseDownEventArgs e) { // 右クリック時 if (e.Button == MouseButtons.Right) { // クリックされた位置を取得 C1.Win.C1FlexGrid.HitTestInfo h; h = flex.HitTest(e.X, e.Y); // カレントセルを移動 flex.Select(h.Row, h.Column); } } 関連項目 クリックされたセルを取得する カレントセルを移動/取得する 任意のセルを表示する Select メソッド、または ShowCell メソッドを使用します。 【実行例】 381 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 任意のセル(10行5列目)を表示する flex.Select(10, 5, True) ' flex.ShowCell(10, 5) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // 任意のセル(10行5列目)を表示する flex.Select(10, 5, true); // flex.ShowCell(10, 5); } 注意: 注意:ShowCell メソッドの場合、カレントセルは移動しません。 カレントセルのカーソルを非表示にする Row またはCol プロパティに -1 を設定します。 【実行例】 382 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms カーソル非表示後イメージ Visual Basic コードの書き方 Visual Basic ' カレントセルのカーソルを非表示にする Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Row(または Col)に-1を設定 flex.Row = -1 'flex.Col = -1 End Sub C# コードの書き方 383 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# // カレントセルのカーソルを非表示にする private void button1_Click(object sender, EventArgs e) { // Row(または Col)に-1を設定 flex.Row = -1; //flex.Col = -1; } 注意: 注意:ユーザーがセルをクリックするか、-1 を設定した Row(または Col)プロパティに適切な値にすると、カーソルは再 度表示されます。 クリックされたセルを取得する MouseRow/MouseCol プロパティにより取得します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub flex_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles flex.MouseDown MessageBox.Show("クリックされたセル" & vbCrLf & _ "行:" & flex.MouseRow & vbCrLf & _ "列:" & flex.MouseCol) End Sub C# コードの書き方 C# private void flex_MouseDown(object sender, MouseEventArgs e) { 384 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms MessageBox.Show("クリックされたセル\n" + "行:" + flex.MouseRow + "\n" + "列:" + flex.MouseCol); } 注意: 注意:HitTest メソッドを使用することでもセル位置を取得できます。(参照:「クリックされたセルの種類を判別する」) クリックされたセルの種類を判別する HitTest メソッドを使用してマウス位置の情報(HitTestInfo 構造体)を取得し、Type フィールドから判別します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub flex_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles flex.MouseDown ' マウス位置の情報を取得 Dim ht As C1.Win.C1FlexGrid.HitTestInfo ht = flex.HitTest(e.X, e.Y) ' セルタイプ、行・列のインデックスを表示 MessageBox.Show("クリックされたセル" & vbCrLf & _ "セルタイプ:" & ht.Type.ToString & vbCrLf & _ "行:" & ht.Row & vbCrLf & _ "列:" & ht.Column) End Sub C# コードの書き方 C# private void flex_MouseDown(object sender, MouseEventArgs e) { // マウス位置の情報を取得 385 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C1.Win.C1FlexGrid.HitTestInfo ht; ht = flex.HitTest(e.X, e.Y); // セルタイプ、行・列のインデックスを表示 MessageBox.Show("クリックされたセル\n" + "セルタイプ:" + ht.Type.ToString() + "\n" + "行:" + ht.Row + "\n" + "列:" + ht.Column); } ダブルクリック時にテキストを選択状態にする 「セルの編集」にもありますが、セルをダブルクリックすると編集モードに移行してクリックした場所の近くに入力キャレットが表 示されます。この動作を変更し、ダブルクリック時にセル内の値を選択状態にするには、次の処理を実装します。 BeforeDoubleClick イベントでダブルクリックを検出、無効にする StartEditing メソッドで編集モードに移行する 編集用エディタを TextBox クラスに変換し、SelectAll メソッドで選択状態にする 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub flex_BeforeDoubleClick(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.BeforeMouseDownEventArgs) Handles flex.BeforeDoubleClick ' ダブルクリックを無効にする e.Cancel = True ' 編集モードに移行 flex.StartEditing() ' TextBoxクラスに変換し、SelectAllメソッドで選択状態にする Dim tb As TextBox = CType(flex.Editor, TextBox) tb.SelectAll() End Sub C# コードの書き方 386 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# private void flex_BeforeDoubleClick(object sender, C1.Win.C1FlexGrid.BeforeMouseDownEventArgs e) { // ダブルクリックを無効にする e.Cancel = true; // 編集モードに移行 flex.StartEditing(); // TextBoxクラスに変換し、SelectAllメソッドで選択状態にする TextBox tb = (TextBox)flex.Editor; tb.SelectAll(); } 入力/編集 セルの編集に関するタスクを紹介します。 常時入力モードにする EditOptions プロパティのEditOnRequest フラグを False にします。 このフラグが True に設定されている場合(デフォルトの設定)、ユーザーが入力を開始するかまたはセルをダブルクリック、 [F2]キーを押すまで、グリッドは編集モードに入りません(MS Excel と同じ動作)。 このフラグが False に設定されている場合、グリッドがフォーカスを得たとき、また選択セルが変更されたときには、グリッドは 自動的に編集モードに入ります(MS Access と同じ動作)。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 全部のフラグを False にします flex.EditOptions = C1.Win.C1FlexGrid.EditFlags.None ' EditOnRequestのみをFalseにします flex.EditOptions = C1.Win.C1FlexGrid.EditFlags.AutoSearch Or _ C1.Win.C1FlexGrid.EditFlags.CycleOnDoubleClick Or _ 387 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C1.Win.C1FlexGrid.EditFlags.DelayedCommit Or _ C1.Win.C1FlexGrid.EditFlags.ExitOnLeftRightKeys Or _ C1.Win.C1FlexGrid.EditFlags.MultiCheck Or _ C1.Win.C1FlexGrid.EditFlags.UseNumericEditor End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 全部のフラグを False にします flex.EditOptions = C1.Win.C1FlexGrid.EditFlags.None; // EditOnRequestのみをFalseにします flex.EditOptions = C1.Win.C1FlexGrid.EditFlags.AutoSearch | C1.Win.C1FlexGrid.EditFlags.CycleOnDoubleClick | C1.Win.C1FlexGrid.EditFlags.DelayedCommit | C1.Win.C1FlexGrid.EditFlags.ExitOnLeftRightKeys | C1.Win.C1FlexGrid.EditFlags.MultiCheck | C1.Win.C1FlexGrid.EditFlags.UseNumericEditor; } 編集中のセルの外観を変更する Editor 組み込みスタイルを使用して、編集中のセルの外観を変更します。非編集時のカレントセルの外観を変更する方法 は、「カレントセルの外観を変更する」を参照してください。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 388 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ' 編集中のセルの外観を変更する Dim cs As C1.Win.C1FlexGrid.CellStyle cs = flex.Styles.Editor cs.BackColor = Color.Yellow cs.ForeColor = Color.Red cs.Font = New Font(cs.Font.Name, 10, FontStyle.Italic) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 編集中のセルの外観を変更する C1.Win.C1FlexGrid.CellStyle cs; cs = flex.Styles.Editor; cs.BackColor = Color.Yellow; cs.ForeColor = Color.Red; cs.Font = new Font(cs.Font.Name, 10, FontStyle.Italic); } 注意: 注意:組み込みスタイルは、スタイルエディタ からも設定できます。 グリッド全体の編集を禁止する グリッド全体の編集を無効にするには、デザイナまたはコードで、AllowEditing プロパティを False に設定します。反対に、編 集を有効にするには AllowEditing プロパティを True(デフォルト)に設定します。 デザイナの場合 C1FlexGrid タスク メニューで、[編集を有効にする]チェックボックスを OFF にします。 389 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms または、プロパティウィンドウで AllowEditing プロパティを探し、それを False に設定します。 コードの場合 Form_Load イベントに以下のコードを追加します。 Visual Basic コードの書き方 Visual Basic flex.AllowEditing = False C# コードの書き方 C# flex.AllowEditing = false; 列単位で編集を禁止する 特定の列の編集を禁止するには、デザイナまたはコードで、AllowEditingプロパティを False に設定します。反対に、編集を 有効にするには AllowEditing プロパティを True(デフォルト)に設定します。 デザイナの場合 1. グリッドで編集を無効にしたい列を選択します。選択した列の Column タスク メニューが開きます。 2. [編集を有効にする]チェックボックスを OFF にします。 390 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms また、AllowEditing プロパティは、[FlexGrid 列エディタ]を使用して設定することもできます。 1. 列エディタ を開きます。[ FlexGrid 列エディタ]へのアクセス方法の詳細については、「列エディタにアクセス」を参照し てください。 2. 右ペインから編集を無効にしたい列を選択し、左ペインで AllowEditing プロパティを False に設定します。 391 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 3. 〈OK〉をクリックし、列エディタを閉じます。 コードの場合 Form_Load イベントに以下のコードを追加し、1列目(Col1)の編集を制限します。 Visual Basic コードの書き方 Visual Basic flex.Cols("Col1").AllowEditing = False ' 次のコードと同じ 'flex.Cols(1).AllowEditing = False C# コードの書き方 C# flex.Cols["Col1"].AllowEditing = false; // 次のコードと同じ //flex.Cols[1].AllowEditing = false; 行単位で編集を禁止する 特定の行の編集を禁止するには、AllowEditing プロパティを False に設定します。反対に、編集を有効にするには AllowEditing プロパティを True(デフォルト)に設定します。このコード例では、6行目の編集を制限します。 Visual Basic コードの書き方 Visual Basic flex.Rows(5).AllowEditing = False C# コードの書き方 C# 392 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.Rows(5).AllowEditing = False; セル単位で編集を禁止する BeforeEdit/StartEdit イベントを使用して入力セルを判別し、e.Cancel を True に設定します。下記のサンプルコードでは、 2行3列目のセルを編集不可としています。 Visual Basic コードの書き方 Visual Basic Private Sub flex_BeforeEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.BeforeEdit ' 2行3列目のセルの編集を禁止 If e.Row = 2 And e.Col = 3 Then e.Cancel = True End If End Sub C# コードの書き方 C# private void flex_BeforeEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { // 2行3列目のセルの編集を禁止 if((e.Row == 2) && (e.Col == 3)) { e.Cancel = true; } } Enter キーを押した際、編集モードに移行しないようにする 編集中ではないセルで Enter キーを押すと、(そのセルの編集が許可されていれば)セルは編集状態になります。この動作を 変更するには、KeyPress イベントで Enter キーの入力を無効にします。下記のサンプルコードでは、Enter キーが入力された 際、編集モードに移行せず、セルを移動しています。 Visual Basic コードの書き方 Visual Basic Private Sub flex_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles flex.KeyPress If e.KeyChar = Chr(Keys.Enter) Then ' Enter キーの入力を無効にする e.Handled = True ' セルの移動 ' KeyActionEnum.MoveAcross+最終セルの場合は先頭へ移動 If flex.Col = flex.Cols.Count - 1 Then flex.Col = flex.Cols.Fixed If flex.Row = flex.Rows.Count - 1 Then flex.Row = flex.Rows.Fixed Else flex.Row += 1 393 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms End If Else flex.Col += 1 End If End If End Sub C# コードの書き方 C# private void flex_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Enter) { // Enter キーの入力を無効にする e.Handled = true; // セルの移動 // KeyActionEnum.MoveAcross+最終セルの場合は先頭へ移動 if (flex.Col == flex.Cols.Count - 1) { flex.Col = flex.Cols.Fixed; if (flex.Row == flex.Rows.Count - 1) { flex.Row = flex.Rows.Fixed; } else { flex.Row += 1; } } else { flex.Col += 1; } } } 注意: 上記コードを使用しても、F2 キーの入力やダブルクリック時にセルは編集モードに移行します。 KeyPress イベントの詳細は、MSDN を参照してください。 KeyActionEnter プロパティの設定は、編集中に Enter キーが押された際の動作を制御します(「Enter/Tab キーによりカレントセルを移動する」)。 IMEモードを切り替える C1FlexGrid コントロールにおいてIME制御を行う場合、編集モードに移行する前に発生する BeforeEdit イベント内 で、ImeMode プロパティを設定するという方法になります。 Visual Basic コードの書き方 Visual Basic Private Sub flex_BeforeEdit(ByVal sender As Object, ByVal e As 394 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.BeforeEdit Select Case e.Col Case 1 ' 1列目は半角カタカナ flex.ImeMode = Windows.Forms.ImeMode.KatakanaHalf Case 2 ' 2列目はカタカナ flex.ImeMode = Windows.Forms.ImeMode.Katakana Case 3 ' 3列目はひらがな flex.ImeMode = Windows.Forms.ImeMode.Hiragana Case Else ' 上記以外はIMEオフ flex.ImeMode = Windows.Forms.ImeMode.Off End Select End Sub C# コードの書き方 C# private void flex_BeforeEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { switch (flex.Col) { case 1: // 1列目は半角カタカナ flex.ImeMode = ImeMode.KatakanaHalf; break; case 2: // 2列目はカタカナ flex.ImeMode = ImeMode.Katakana; break; case 3: // 3列目はひらがな flex.ImeMode = ImeMode.Hiragana; break; default: // 上記以外はIMEオフ flex.ImeMode = ImeMode.Off; break; } } キー入力を検知する 非編集時にキーを入力すると、KeyDown/KeyPress/KeyUpイベントが発生します。また、編集中は KeyDownEdit/KeyPressEdit/KeyUpEdit イベントが発生します。非編集時と編集時で発生するイベントが異なりますの で、注意してください。 【実行例】 395 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub flex_KeyDownEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.KeyEditEventArgs) Handles flex.KeyDownEdit ' 編集中に入力されたキーをラベルに出力 Label1.Text = Label1.Text & ":" & e.KeyCode.ToString End Sub C# コードの書き方 C# private void flex_KeyDownEdit(object sender, C1.Win.C1FlexGrid.KeyEditEventArgs e) { // 編集中に入力されたキーをラベルに出力 label1.Text = label1.Text + ":" + e.KeyCode.ToString(); } 注意: 注意:KeyDown/KeyPress/KeyUp イベントの詳細は、MSDN を参照してください セル単位で編集データをチェックする セルの編集後に発生するValidateEdit イベント内で、編集エディタ(Editor.Text)の内容をチェックします。チェックの結果、編 集状態を維持して再度入力を促す場合などは Cancel 引数を True に設定します。また、セルは変更前の内容になっているた め、編集エディタにセルの値を設定すると編集を無効にすることもできます。 【実行例】 396 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 1列目を日付型にします flex.Cols(1).DataType = GetType(Date) End Sub Private Sub flex_ValidateEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.ValidateEditEventArgs) Handles flex.ValidateEdit If e.Col = 1 Then ' 過去の日付の場合、変更を許可しません Dim d As Date = Date.Parse(flex.Editor.Text) If d >= Date.Today Then MessageBox.Show("過去の日付を入力してください。", "注意") e.Cancel = True End If '変更の確認で No の場合、変更前の値に戻します If MessageBox.Show("変更しますか?", "確認", _ MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.No Then flex.Editor.Text = flex(e.Row, e.Col) End If End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 1列目を日付型にします flex.Cols[1].DataType = typeof(DateTime); } 397 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms private void flex_ValidateEdit(object sender, C1.Win.C1FlexGrid.ValidateEditEventArgs e) { if(e.Col == 1) { // 過去の日付の場合、変更を許可しません DateTime d = DateTime.Parse(flex.Editor.Text); if (d >= DateTime.Today) { MessageBox.Show("過去の日付を入力してください。", "注意"); e.Cancel = true; } // 変更の確認で No の場合、変更前の値に戻します if (MessageBox.Show("変更しますか?", "確認", MessageBoxButtons.YesNo) == DialogResult.No) { flex.Editor.Text = flex[e.Row, e.Col].ToString(); } } } 注意: 注意:GetType メソッドや typeof 式、MssageBox.Show メソッドの詳細は、MSDNを参照してください。 関連項目 入力値の正当性検査 行単位で編集データをチェックする 行の移動時や他のコントロールにフォーカスが移動する際に発生するRowValidating/RowValidated イベントを利用でき ます。チェックの結果、対象行から移動させないようにする場合は、Cancel 引数を True に設定します。 【実行例】 Visual Basic コードの書き方 Visual Basic 398 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Private Sub flex_RowValidating(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.RowValidating ' 1列目の値は100以上とします If flex(e.Row, 1) < 100 Then e.Cancel = True MessageBox.Show("データが不正です") End If End Sub C# コードの書き方 C# private void flex_RowValidating(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { // 1列目の値は100以上とします if (int.Parse(flex[e.Row, 1].ToString()) < 100) { e.Cancel = true; MessageBox.Show("データが不正です"); } } 左右の矢印キーによる編集の終了を無効にする EditOptions プロパティの ExitOnLeftRightKeys フラグを False にします。 このフラグが True に設定されている場合(デフォルトの設定)、組み込みの編集エディタは、キャレットが先頭位置にある状態 でユーザーが左矢印キーを押したとき、またはキャレットが末尾位置(TextLengthの位置)にある状態でユーザーが右矢印 キーを押したとき、編集モードを抜けます。 このフラグが False に設定されている場合、組み込みの編集エディタは、ユーザーが[Enter]キーを押すか、または別なセル をクリックする、上下の矢印キーで隣接する行に移動するまで、編集モードを抜けません。 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 全部のフラグを False にします flex.EditOptions = C1.Win.C1FlexGrid.EditFlags.None ' ExitOnLeftRightKeysのみをFalseにします flex.EditOptions = C1.Win.C1FlexGrid.EditFlags.AutoSearch Or _ C1.Win.C1FlexGrid.EditFlags.CycleOnDoubleClick Or _ C1.Win.C1FlexGrid.EditFlags.DelayedCommit Or _ C1.Win.C1FlexGrid.EditFlags.EditOnRequest Or _ C1.Win.C1FlexGrid.EditFlags.MultiCheck Or _ C1.Win.C1FlexGrid.EditFlags.UseNumericEditor End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) 399 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms { // 全部のフラグを False にします flex.EditOptions = C1.Win.C1FlexGrid.EditFlags.None; // ExitOnLeftRightKeysのみをFalseにします flex.EditOptions = C1.Win.C1FlexGrid.EditFlags.AutoSearch | C1.Win.C1FlexGrid.EditFlags.CycleOnDoubleClick | C1.Win.C1FlexGrid.EditFlags.DelayedCommit | C1.Win.C1FlexGrid.EditFlags.EditOnRequest | C1.Win.C1FlexGrid.EditFlags.MultiCheck | C1.Win.C1FlexGrid.EditFlags.UseNumericEditor; } セル編集時の改行を禁止する デフォルトではセル編集時に [Alt]+[Enter]、または [Ctrl]+[Enter]、 または [Shift]+[Enter]、[Ctrl]+[J]、[Ctrl]+[Shift]+ [J])で、テキストを改行することができます。この動作を禁止するには、KeyDownEdit/KeyPressEdit イベントを使用して キー入力を無効にします。 Visual Basic コードの書き方 Visual Basic ' キー入力無効用のフラグ Dim key_flag As Boolean = False Private Sub flex_KeyDownEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.KeyEditEventArgs) Handles flex.KeyDownEdit ' [Alt]+[Enter]のキー入力を無効にします If e.Alt = True And e.KeyCode = Keys.Enter Then e.Handled = True End If ' 次のキー入力はKeyPressEditイベントで無効にします If e.Shift = True And e.KeyCode = Keys.Enter Or _ e.Control = True And e.KeyCode = Keys.Enter Or _ e.Control = True And e.KeyCode = Keys.J Or _ e.Control = True And e.KeyCode = Keys.J And e.Shift = True Then key_flag = True End If End Sub Private Sub flex_KeyPressEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.KeyPressEditEventArgs) Handles flex.KeyPressEdit If key_flag = True Then e.Handled = True key_flag = False End If End Sub C# コードの書き方 C# // キー入力無効用のフラグ bool key_flag = false; private void flex_KeyDownEdit(object sender, C1.Win.C1FlexGrid.KeyEditEventArgs e) { 400 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // [Alt]+[Enter]のキー入力を無効にします if ((e.Alt == true) && (e.KeyCode == Keys.Enter)) { e.Handled = true; } // 次のキー入力はKeyPressEditイベントで無効にします else if (((e.Shift == true) && (e.KeyCode == Keys.Enter)) || ((e.Control == true) && (e.KeyCode == Keys.Enter)) || ((e.Control == true) && (e.KeyCode == Keys.J)) || ((e.Control == true) && (e.KeyCode == Keys.J) && (e.Shift == true))) { key_flag = true; } } private void flex_KeyPressEdit(object sender, C1.Win.C1FlexGrid.KeyPressEditEventArgs e) { if (key_flag == true) { e.Handled = true; key_flag = false; } } 注意: 注意:EditOptions プロパティは、プロパティページからも設定できます。 文字数単位で入力を制限する 入力文字数を制限する方法としては、下記の方法があります。 EditMask プロパティを使用する たとえば下記のコードでは、1列目の入力文字数を7文字に制限しています。EditMask プロパティは、郵便番号や電話番号な ど、桁数が固定されているデータを入力する場合に有効です。 Visual Basic コードの書き方 Visual Basic ' 下線を表示 flex.Cols(1).EditMask = "&&&&&&&&" ' 下線を表示しない flex.Cols(2).EditMask = "&&&&&&&&; " ' 電話番号 flex.Cols(3).EditMask = "(000)-(000)-0000" C# コードの書き方 C# // 下線を表示 flex.Cols[1].EditMask = "&&&&&&&&"; // 下線を表示しない flex.Cols[2].EditMask = "&&&&&&&&; "; // 電話番号 401 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.Cols[3].EditMask = "(000)-(000)-0000"; 注意: 注意:EditMask プロパティを使用した入力マスクの設定は、設計時に Column タスク メニューや 列エディタ からも設定 できます。 カスタムエディタに TextBox コントロールを使用する カスタムエディタの機能を使用して、エディタとして TextBox コントロールを使用します。また、TextBox コントロールの MaxLength プロパティにより入力文字数を制限します。この方法は、桁数が可変のデータを入力制御する目的の場合に適し ています。 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim tb As TextBox = New TextBox ' 入力を7文字に制限 tb.MaxLength = 7 ' カスタムエディタに設定 flex.Cols(1).Editor = tb End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { TextBox tb = new TextBox(); // 入力を7文字に制限 tb.MaxLength = 7; // カスタムエディタに設定 flex.Cols[1].Editor = tb; } SetupEditor イベントを使用する SetupEditor イベント内で、編集用エディタを TextBox クラスのオブジェクトにセット(変換)し、MaxLength プロパティを設定 することで、入力制御を行うことも可能です。この方法は、桁数が可変のデータを入力制御する目的の場合に適しています。 Visual Basic コードの書き方 Visual Basic Private Sub flex_SetupEditor(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.SetupEditor ' 1列目のみ入力制限 If e.Col = 1 Then ' 入力を7文字に制限 Dim tb As TextBox = CType(flex.Editor, TextBox) tb.MaxLength = 7 End If End Sub 402 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# private void flex_SetupEditor(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { // 1列目のみ入力制限 if (e.Col == 1) { // 入力を7文字に制限 TextBox tb = (TextBox)flex.Editor; tb.MaxLength = 7; } } ChangeEdit イベントを使用する セルの値が変更された際には、ChangeEdit イベントが発生します。このイベント内で入力された文字数を判別し、指定文字 数以上の場合は入力文字をカットするような制御方法です。この方法は、桁数が可変のデータを入力制御する目的の場合に 適しています。 Visual Basic コードの書き方 Visual Basic Private Sub flex_ChangeEdit(ByVal sender As Object, ByVal e As System.EventArgs) Handles flex.ChangeEdit ' 1列目のみ If flex.Col = 1 Then Dim tb As TextBox = CType(flex.Editor, TextBox) ' 7文字以上が入力された場合 If tb.TextLength > 7 Then ' 先頭から7文字のみをエディタに設定 flex.Editor.Text = Mid(tb.Text, 1, 7) tb.SelectionStart = tb.TextLength End If End If End Sub C# コードの書き方 C# private void flex_ChangeEdit(object sender, EventArgs e) { // 1列目のみ if (flex.Col == 1) { TextBox tb = (TextBox)flex.Editor; // 7文字以上が入力された場合 if (tb.TextLength > 7) { // 先頭から7文字のみをエディタに設定 flex.Editor.Text = flex.Editor.Text.Substring(0, 7); tb.SelectionStart = tb.TextLength; 403 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms } } } バイト単位で入力を制限する セルの内容を変更すると発生するChangeEdit イベントを使用します。バイト関連の処理は(.NET Framework)Encoding クラ スの GetByte、GetByteCount、GetString メソッドを使用します。下記のコードでは、10バイト以上が入力された場合に、先 頭から10バイト分のみを有効にしています。 Visual Basic コードの書き方 Visual Basic ' 入力を10バイトに制限 Private Sub flex_ChangeEdit(ByVal sender As Object, ByVal e As System.EventArgs) Handles flex.ChangeEdit ' 1列目のみチェック If flex.Col = 1 Then Dim enc As System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift-jis") Dim tb As TextBox = Ctype(flex.Editor, TextBox) ' 10バイト以上が入力された場合 If enc.GetByteCount(tb.Text) > 10 Then ' 先頭から10バイトのみをエディタに設定 flex.Editor.Text = enc.GetString(enc.GetBytes(tb.Text), 0, 10) tb.SelectionStart = tb.TextLength End If End If End Sub C# コードの書き方 C# // 入力を10バイトに制限 private void flex_ChangeEdit(object sender, EventArgs e) { // 1列目のみチェック if (flex.Col == 1) { System.Text.Encoding enc; enc = System.Text.Encoding.GetEncoding("shift-jis"); TextBox tb = (TextBox)flex.Editor; // 10バイト以上が入力された場合 if (enc.GetByteCount(tb.Text) > 10) { // 先頭から10バイトのみをエディタに設定 flex.Editor.Text = enc.GetString(enc.GetBytes(tb.Text), 0, 10); tb.SelectionStart = tb.TextLength; } } } 404 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 注意: 注意:クラスや GetByte メソッドなどの詳細は、MSDN をご覧ください。 数値のみの入力を許可する セルに数値のみの入力を許可するには、KeyPressEdit イベントを使用し、無効なキーに対して e.Handled パラメータを True に設定します。以下のコードを使用し、4番目の列を数値、[Back Space]、[Del]、[.]キーのみを受け付けるように設定しま す。 Visual Basic コードの書き方 Visual Basic Private Sub flex_KeyPressEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.KeyPressEditEventArgs) Handles flex.KeyPressEdit If e.Col = 3 Then ' 0-9、ピリオド、DELETE、BACKSPACEキー以外の入力を不可にします If Not (e.KeyChar = Chr(48) Or e.KeyChar = Chr(49) Or _ e.KeyChar = Chr(50) Or e.KeyChar = Chr(51) Or _ e.KeyChar = Chr(52) Or e.KeyChar = Chr(53) Or _ e.KeyChar = Chr(54) Or e.KeyChar = Chr(55) Or _ e.KeyChar = Chr(56) Or e.KeyChar = Chr(57) Or _ e.KeyChar = Chr(46) Or e.KeyChar = Chr(127) Or _ e.KeyChar = Chr(8)) Then ' 不正な値として入力をキャンセル e.Handled = True End If End If End Sub C# コードの書き方 C# private void flex_KeyPressEdit(object sender, C1.Win.C1FlexGrid.KeyPressEditEventArgs e) { if (e.Col == 3) { // 0-9、ピリオド、DELETE、BACKSPACEキー以外の入力を不可にします if (!((e.KeyChar == 48) || (e.KeyChar == 49) || (e.KeyChar == 50) || (e.KeyChar == 51) || (e.KeyChar == 52) || (e.KeyChar == 53) || (e.KeyChar == 54) || (e.KeyChar == 55) || (e.KeyChar == 56) || (e.KeyChar == 57) || (e.KeyChar == 46) || (e.KeyChar == 127) | // 不正な値として入力をキャンセル e.Handled = true; } } 注意: 注意:セルのデータ型が数値型の場合、デフォルトで組み込み数値型エディタが使用され、数値以外の入力は禁止され ます。 カスタムエディタを設定する 405 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 行や列単位でカスタムエディタを設定する場合はEditor プロパティを、スタイルごとに設定する場合は Editor プロパティを使 用して任意のコントロールを設定します。また、SetupEditor イベントを使用してセル単位での設定も可能です。 注意: 注意:設計時は、列エディタを使用してカスタムエディタ の設定を行えます。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' カスタムエディタを作成します Dim editor As New NumericUpDown() editor.BorderStyle = BorderStyle.None ' カスタムエディタを1列目に割り当てます flex.Cols(1).Editor = editor End Sub Private Sub flex_StartEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.StartEdit ' 2行1列目のセルではTextBoxをカスタムエディタに割り当てます If e.Row = 2 And e.Col = 1 Then Dim tb As New TextBox tb.BackColor = Color.Yellow flex.Editor = tb End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // カスタムエディタを作成します NumericUpDown editor = new NumericUpDown(); editor.BorderStyle = BorderStyle.None; // カスタムエディタを1列目に割り当てます flex.Cols[1].Editor = editor; } 406 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms private void flex_StartEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { // 2行1列目のセルではTextBoxをカスタムエディタに割り当てます if((e.Row == 2) && (e.Col == 1)) { TextBox tb = new TextBox(); tb.BackColor = Color.Yellow; flex.Editor = tb; } } 入力マスクを設定する グリッド全体ではEditMask プロパティを、行や列単位では EditMask プロパティを、スタイルごとの場合は EditMask プロパ ティを使用します。 注意: 設計時は、[定型入力]ダイアログボックスを使用して入力マスクの設定を行えます。 入力マスクの詳細は「マスク」を参照してください。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 電話番号を入力するためのマスクを1列目に設定します flex.Cols(1).EditMask = "(999) 999-9999" End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { 407 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // 電話番号を入力するためのマスクを設定します flex.Cols[1].EditMask = "(999) 999-9999; } パスワード入力を行う パスワードの入力に使用するセルにプレースホルダ文字(*)を表示するには、SetupEditor イベントを使用します。 【実行例】 ユーザーがパスワード列に入力すると、テキストは自動的にアスタリスク(*)に変換されます。入力中もアスタリスク(*)で表示 されます。 1. グリッドにパスワード用の列を作成し、描画モードを設定します。 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex.Cols(0).Width = flex.Rows(0).HeightDisplay flex.ShowCursor = True flex.Cols(1).Caption = "パスワード" flex.Cols(1).Name = "パスワード" flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex.Cols[0].Width = flex.Rows[0].HeightDisplay; flex.ShowCursor = true; flex.Cols[1].Caption = flex.Cols[1].Name = "パスワード"; flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw; } 2. 次のコードを SetupEditor イベントに追加します。このコードは、ユーザーが入力中のテキストを自動的にアスタリスク 408 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms (*)に変換します。 Visual Basic コードの書き方 Visual Basic Private Sub flex_SetupEditor(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.SetupEditor Dim tb As TextBox = flex.Editor If Not (tb Is Nothing) Then If flex.Cols(e.Col).Name = "パスワード" Then tb.PasswordChar = "*"c Else tb.PasswordChar = CChar(ChrW(0)) End If End If End Sub C# コードの書き方 C# private void flex_SetupEditor(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { TextBox tb = flex.Editor as TextBox; if (tb != null) { if (flex.Cols[e.Col].Name == "パスワード") tb.PasswordChar = '*'; else tb.PasswordChar = (char)0; } } 3. 次のコードを OwnerDrawCell イベントに追加します。このコードにより入力後のテキストを自動的にアスタリスク(*)に 変換し、非表示にします。 Visual Basic コードの書き方 Visual Basic Private Sub flex_OwnerDrawCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles flex.OwnerDrawCell If e.Row >= flex.Rows.Fixed And flex.Cols(e.Col).Name = "パスワード" Then e.Text = New String("*"c, e.Text.Length) End If End Sub C# コードの書き方 C# private void flex_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e) { 409 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms if (e.Row >= flex.Rows.Fixed && flex.Cols[e.Col].Name == "パスワード") { e.Text = new string('*', e.Text.Length); } } 大文字に変換して入力する 列に入力されたテキストを自動的に小文字から大文字にするには、SetupEditorイベントにて編集エディタを TextBox に変 換し、CharacterCasing プロパティを使用します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub flex_SetupEditor(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.SetupEditor ' UCASECOL列では、大文字に変換して入力します If flex.Cols(e.Col).Name = "UCASECOL" Then Dim tb As TextBox = flex.Editor tb.CharacterCasing = CharacterCasing.Upper End If End Sub C# コードの書き方 C# private void flex_SetupEditor(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { // UCASECOL列では、大文字に変換して入力します if (flex.Cols[e.Col].Name == "UCASECOL") { TextBox tb = flex.Editor as TextBox; tb.CharacterCasing = CharacterCasing.Upper; } } 410 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 注意: 注意:TextBox コントロールや CharacterCasing プロパティの詳細は、MSDN を参照してください。 セルボタン/コンボボックス セルボタンやコンボボックスに関するタスクを紹介します。 関連項目 リストボックスとコンボボックス | セルボタン セルボタンを表示する グリッドの ComboList、行・列の ComboList、スタイルの ComboList プロパティの何れかに省略符号("...")を設定します。 注意: セルボタンのセルで入力を許可する場合は、省略符号("...")前にパイプ文字を追加します。 セルボタンは、設計時に 列エディタ や Column タスク から設定することもできます。「リストボックスとコンボボック ス」の項目も参照してください。 【実行例】 Visual Basic コードの書き方 Visual Basic flex.Cols(2).Caption = "セルボタン編集不可" flex.Cols(3).Caption = "セルボタン編集可" ' 編集不可のセルボタン flex.Cols(2).ComboList = "..." ' 編集可能なセルボタン flex.Cols(3).ComboList = " ' 常にセルボタンを表示 flex.ShowButtons = C1.Win.C1FlexGrid.ShowThemedHeadersEnum.NoneAlways 411 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# flex.Cols[2].Caption = "セルボタン編集不可"; flex.Cols[3].Caption = "セルボタン編集可"; // 編集不可のセルボタン flex.Cols[2].ComboList = "..."; // 編集可能なセルボタン flex.Cols[3].ComboList = " // 常にセルボタンを表示 flex.ShowButtons = C1.Win.C1FlexGrid.ShowThemedHeadersEnum.NoneAlways; セルボタンの画像を変更する CellButtonImage プロパティに任意の画像を設定します。 【実行例】 Visual Basic コードの書き方 Visual Basic flex.Cols(2).Caption = "セルボタン" ' セルボタンを表示 flex.Cols(2).ComboList = "..." ' セルボタンの画像を変更 flex.CellButtonImage = Image.FromFile("Mycellbutton.ico") ' 常にセルボタンを表示 flex.ShowButtons = C1.Win.C1FlexGrid.ShowThemedHeadersEnum.Always C# コードの書き方 C# flex.Cols[2].Caption = "セルボタン"; 412 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // セルボタンを表示 flex.Cols[2].ComboList = "..."; // セルボタンの画像を変更 flex.CellButtonImage = Image.FromFile("Mycellbutton.ico"); // 常にセルボタンを表示 flex.ShowButtons = C1.Win.C1FlexGrid.ShowButtonsEnum.Always; 注意: 注意:行や列、セルごとに表示するセルボタンのイメージを変更する場合は、BeforeEdit イベントを使用します。(参照: 行や列、セルごとにセルボタンのイメージを変更する) コンボボックスを表示する グリッドの ComboList、行・列の ComboList、スタイルの ComboList プロパティの何れかにパイプ文字で区切った文字列を 設定します。 注意: リスト以外の入力を許可する(ドロップダウンコンボ)場合は、文字列の先頭にパイプ文字を追加します。 コンボボックスは、設計時に 列エディタ や Column タスク から設定することもできます。「リストボックスとコンボ ボックス」の項目も参照してください。 【実行例】 Visual Basic コードの書き方 Visual Basic ' リストから選択のみのコンボボックス flex.Cols(2).Caption = "ドロップダウンリスト" flex.Cols(2).ComboList = "Red|Blue ' リスト以外の入力を許可するコンボボックス flex.Cols(3).Caption = "ドロップダウンコンボ" flex.Cols(3).ComboList = "|Red|Blue C# コードの書き方 413 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# // リストから選択のみのコンボボックス flex.Cols[2].Caption = "ドロップダウンリスト"; flex.Cols[2].ComboList = "Red|Blue // リスト以外の入力を許可するコンボボックス flex.Cols[3].Caption = "ドロップダウンコンボ"; flex.Cols[3].ComboList = "|Red|Blue コンボボックスの背景色を変更する グリッドが編集モードに入る前に発生するStartEdit イベントにおいて、組み込み CellStyle.Editor プロパティの背景色を設定 します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 1列目にコンボボックスを表示 flex.Cols(1).ComboList = "リスト1|リスト2 End Sub Private Sub flex_StartEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.StartEdit If e.Col = 1 Then flex.Styles.Editor.BackColor = Color.AliceBlue Else flex.Styles.Editor.Clear(C1.Win.C1FlexGrid.StyleElementFlags.BackColor) End If End Sub 414 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 1列目にコンボボックスを表示 flex.Cols[1].ComboList = "リスト1|リスト2 } private void flex_StartEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { if(e.Col == 1) { flex.Styles.Editor.BackColor = Color.AliceBlue; } else { flex.Styles.Editor.Clear(C1.Win.C1FlexGrid.StyleElementFlags.BackColor); } } リストにアイコンを表示させる イメージマップの機能を使用します。行や列の ImageMap または、スタイルの ImageMap プロパティを使用することでリスト にアイコンを表示できます。イメージマップは、特定のセル値に画像を関連付けます。セルの内容が変更されると、画像も自動 的に更新されます。 【実行例】 Visual Basic コードの書き方 Visual Basic ' イメージマップを設定 Dim imgMap As New Hashtable 415 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms imgMap.Add("サッカー", Image.FromFile("soccer.gif")) imgMap.Add("野球", Image.FromFile("baseball.gif")) imgMap.Add("バスケット", Image.FromFile("basketball.gif")) imgMap.Add("ギター", Image.FromFile("guitar.gif")) imgMap.Add("マイク", Image.FromFile("mike.gif")) flex.Cols(1).ComboList = "|サッカー|野球|バスケット|ギター flex.Cols(1).ImageMap = imgMap flex.Cols(1).ImageAndText = True flex.Cols(1).ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.LeftCenter flex.Cols(1).ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.LeftCenter C# コードの書き方 C# // イメージマップを設定 Hashtable imgMap = new Hashtable(); imgMap.Add("サッカー", Image.FromFile("soccer.gif")); imgMap.Add("野球", Image.FromFile("baseball.gif")); imgMap.Add("バスケット", Image.FromFile("basketball.gif")); imgMap.Add("ギター", Image.FromFile("guitar.gif")); imgMap.Add("マイク", Image.FromFile("mike.gif")); flex.Cols[1].ComboList = "サッカー|野球|バスケット|ギター flex.Cols[1].ImageMap = imgMap; flex.Cols[1].ImageAndText = true; flex.Cols[1].ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.LeftCenter; flex.Cols[1].TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.LeftCenter; 注意: 注意:ImageAndText プロパティを使用して、セルにテキストと画像を表示するか、画像のみを表示するかを指定できま す。 表示値/実値のように2種類のデータを持たせる データマップの機能を使用します。行や列のDataMap または、スタイルの DataMap プロパティを使用することでグリッド上 に表示する値と、実際に設定される値を別々に持たせることができます。 また、GetDataDisplay/GetData メソッドを使用することで表示値と実値を取得できます。 【実行例】 416 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim dtMap As Hashtable = New Hashtable() dtMap.Add("001", "東京") dtMap.Add("002", "仙台") dtMap.Add("003", "大坂") flex.Cols(1).DataMap = dtMap flex.Cols(1).Caption = "データマップ" End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click MessageBox.Show("実値:" & flex.GetData(flex.Row, flex.Col) & vbCrLf & _ "表示値:" & flex.GetDataDisplay(flex.Row, flex.Col)) 417 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { System.Collections.Hashtable dtMap; dtMap = new System.Collections.Hashtable(); dtMap.Add("001", "東京"); dtMap.Add("002", "仙台"); dtMap.Add("003", "大坂"); flex.Cols[1].DataMap = dtMap; flex.Cols[1].Caption = "データマップ"; } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("実値:" + flex.GetData(flex.Row, flex.Col) + "\n" + "表示値:" + flex.GetDataDisplay(flex.Row, flex.Col)); } 注意: 「マップリスト」も参照してください。 クリップボードの自動処理(AutoClipboard プロパティを True に設定)で対象となるのは、表示値になります。 選択されたインデックスを取得する 選択されたインデックスは、SelectedIndex プロパティで、アイテムはSelectedItem プロパティで取得します。 【実行例】 Visual Basic コードの書き方 418 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' コンボボックスを設定 flex.Cols(2).Caption = "ドロップダウンリスト" flex.Cols(2).ComboList = "東京|仙台 End Sub Private Sub flex_ComboCloseUp(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.ComboCloseUp MessageBox.Show("選択されたインデックス:" & _ flex.ComboBoxEditor.SelectedIndex & vbCrLf & _ "選択されたアイテム:" & _ flex.ComboBoxEditor.SelectedItem) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // コンボボックスを設定 flex.Cols[2].Caption = "ドロップダウンリスト"; flex.Cols[2].ComboList = "東京|仙台 } private void flex_ComboCloseUp(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { MessageBox.Show("選択されたインデックス:" + flex.ComboBoxEditor.SelectedIndex + "\n" + "選択されたアイテム:" + flex.ComboBoxEditor.SelectedItem); } 注意: 注意:ComboBoxEditor プロパティはコンボボックスがアクティブではない場合、null または -1 を返します。 マルチカラムコンボボックスを表示する MultiColumnDictionary クラスを使用します。 【実行例】 419 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 文字列に基づくMultiColumnDictionaryを作成 ' 表示値:0列目、実値:自動生成される int 型のキー Dim s As String = "泉スタジアム" & vbTab & "泉区|" & _ "紫山武道館" & vbTab & "富谷|" & _ "新劇場" & vbTab & "仙台区|" & _ "GCスタジアム" & vbTab & "長町" Dim map As C1.Win.C1FlexGrid.MultiColumnDictionary map = New C1.Win.C1FlexGrid.MultiColumnDictionary(s, 0, True) flex.Cols(2).DataMap = map flex.Cols(2).Caption = "マルチカラムコンボ" ' イメージマップを設定 420 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Dim imgMap As New Hashtable imgMap.Add(0, Image.FromFile("soccer.gif")) imgMap.Add(1, Image.FromFile("guitar.gif")) imgMap.Add(2, Image.FromFile("mike.gif")) imgMap.Add(3, Image.FromFile("baseball.gif")) flex.Cols(2).ImageMap = imgMap End Sub Private Sub flex_ComboCloseUp(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.ComboCloseUp Console.WriteLine("選択されたインデックス:" & _ flex.ComboBoxEditor.SelectedIndex & vbCrLf & _ "選択されたアイテム:" & _ flex.ComboBoxEditor.SelectedItem) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click MessageBox.Show("実値:" & flex.GetData(flex.Row, flex.Col) & vbCrLf & _ "表示値:" & flex.GetDataDisplay(flex.Row, flex.Col)) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 文字列に基づくMultiColumnDictionaryを作成 // 表示値:0列目、実値:自動生成される int 型のキー String s = "泉スタジアム\t泉区 "紫山武道館\t富谷 "新劇場\t仙台区 "GCスタジアム\t長町"; C1.Win.C1FlexGrid.MultiColumnDictionary map; map = new C1.Win.C1FlexGrid.MultiColumnDictionary(s, 0, true); flex.Cols[2].DataMap = map; flex.Cols[2].Caption = "マルチカラムコンボ"; // イメージマップを設定 System.Collections.Hashtable imgMap; imgMap = new System.Collections.Hashtable(); imgMap.Add(0, Image.FromFile("soccer.gif")); imgMap.Add(1, Image.FromFile("guitar.gif")); imgMap.Add(2, Image.FromFile("mike.gif")); imgMap.Add(3, Image.FromFile("baseball.gif")); flex.Cols[2].ImageMap = imgMap; } private void flex_ComboCloseUp(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { Console.WriteLine("選択されたインデックス:" + flex.ComboBoxEditor.SelectedIndex + "\n" + "選択されたアイテム:" + flex.ComboBoxEditor.SelectedItem); } private void button1_Click(object sender, EventArgs e) 421 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms { MessageBox.Show("実値:" + flex.GetData(flex.Row, flex.Col) + "\n" + "表示値:" + flex.GetDataDisplay(flex.Row, flex.Col)); } 注意: 注意:製品付属の MultiColumnDropDown サンプルも参照してください。 コンボボタン/セルボタンを表示するタイミングを変更する コンボボタンやセルボタンを表示するタイミングは、ShowButtons プロパティで設定します。(デフォルト はShowButtonsEnum.WithFocus) 【実行例】 常に表示(ShowButtonsEnum.Always) Visual Basic コードの書き方 Visual Basic ' コンボボックスを表示 flex.Cols(2).Caption = "コンボボックス" flex.Cols(2).ComboList = "Red|Blue ' セルボタンを表示 flex.Cols(3).Caption = "セルボタン" flex.Cols(3).ComboList = "..." ' コンボボタン・セルボタンを表示するタイミングを変更 flex.ShowButtons = C1.Win.C1FlexGrid.ShowButtonsEnum.Always C# コードの書き方 C# // コンボボックスを表示 flex.Cols[2].Caption = "コンボボックス"; flex.Cols[2].ComboList = "Red|Blue 422 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // セルボタンを表示 flex.Cols[3].Caption = "セルボタン"; flex.Cols[3].ComboList = "..."; // コンボボタン・セルボタンを表示するタイミングを変更 flex.ShowButtons = C1.Win.C1FlexGrid.ShowButtonsEnum.Always; 注意: 注意:行や列単位で表示するタイミングを変更する機能は用意されていません。ShowButtons プロパティの設定は、グ リッド全体に影響します。 コンボボックスの幅を設定する 編集用のエディタ(コンボボックス)が表示される前に発生するSetupEditor イベントにおいて、組み込みエディタを ComboBox 型の変数に設定した上で、DropDownWidth プロパティにて指定します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 1列目にコンボボックスを表示 flex.Cols(1).ComboList = "リスト1|リスト2 End Sub Private Sub flex_SetupEditor(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.SetupEditor If e.Col = 1 Then Dim cb As ComboBox = CType(flex.Editor, ComboBox) ' コンボボックスの幅を250pxにします cb.DropDownWidth = 250 End If End Sub C# コードの書き方 423 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# private void Form1_Load(object sender, EventArgs e) { // 1列目にコンボボックスを表示 flex.Cols[1].ComboList = "リスト1|リスト2 } private void flex_SetupEditor(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { if(e.Col == 1) { // コンボボックスの幅を250pxにします ComboBox cb = (ComboBox)flex.Editor; cb.DropDownWidth = 250; } } 注意: 注意:ComboBox.DropDownWidth プロパティ(System.Windows.Forms)の詳細は、MSDN を参照してください。 表示するリストの数を変更する SetupEditor イベント内で編集用エディタを取得、ComboBox クラスのオブジェクトに設定した上で、(ComboBox クラス の)MaxDropDownItems プロパティを使用します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex.Cols(1).ComboList = "|item1|item2|item3|item4|item5|item6|item7|item8|item9 End Sub Private Sub flex_SetupEditor(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.SetupEditor 424 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms If e.Col = 1 Then CType(flex.Editor, ComboBox).MaxDropDownItems = 4 End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex.Cols[1].ComboList = "|item1|item2|item3|item4|item5|item6|item7|item8|item9 } private void flex_SetupEditor(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { if(e.Col == 1) { ((ComboBox)flex.Editor).MaxDropDownItems = 4; } } 注意: 注意:ComboBox クラスの MaxDropDownItems プロパティなどの詳細は、MSDN を参照してください。 表示するリストの順番を設定する ComboList プロパティを使用した場合は文字列順にリストが表示されます。また、DataMap プロパティを使用する場合 は、Hashtable クラスではなく、SortedList/ /ListDictionary クラスを使用することで、コンボリスト内のデータ並び順を設定 することが可能です。 注意: 注意:Hashtable、SortedList、ListDictionary クラスの詳細は、MSDN を参照してください。 SortedList クラス SortedList クラスを使用することで、コンボリスト内のデータをキーの昇順でソートできます。 【実行例】 425 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' SortedListにデータを追加 ' キーで項目をソート Dim sl As SortedList = New SortedList sl.Add(3, "three") sl.Add(5, "five") sl.Add(2, "two") sl.Add(1, "one") sl.Add(4, "four") ' 列のデータ型を設定 flex.Cols(1).DataType = GetType(Integer) ' データマップを使用 flex.Cols(1).DataMap = sl End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // SortedListにデータを追加 // キーで項目をソート System.Collections.SortedList sl = new System.Collections.SortedList(); sl.Add(3, "three"); sl.Add(5, "five"); sl.Add(2, "two"); sl.Add(1, "one"); sl.Add(4, "four"); // 列のデータ型を設定 flex.Cols[1].DataType = typeof(int); 426 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // データマップを使用 flex.Cols[1].DataMap = sl; } ListDictionary クラス ListDictionary クラスを使用することで、コンボボックス内の並び順序をデータを追加した順番にすることができます。詳細につ いては、製品ヘルプの下記項目をご参照ください。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' ListDictionaryにデータを追加 ' リストに追加された順序を維持 Dim ld As New Specialized.ListDictionary() ld.Add(3, "three") ld.Add(5, "five") ld.Add(2, "two") ld.Add(1, "one") ld.Add(4, "four") ' 列のデータ型を設定 flex.Cols(1).DataType = GetType(Integer) ' データマップを使用 flex.Cols(1).DataMap = ld End Sub C# コードの書き方 C# 427 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms private void Form1_Load(object sender, EventArgs e) { // ListDictionaryにデータを追加 // リストに追加された順序を維持 System.Collections.Specialized.ListDictionary ld; ld = new System.Collections.Specialized.ListDictionary(); ld.Add(3, "three"); ld.Add(5, "five"); ld.Add(2, "two"); ld.Add(1, "one"); ld.Add(4, "four"); // 列のデータ型を設定 flex.Cols[1].DataType = typeof(int); // データマップを使用 flex.Cols[1].DataMap = ld; } 関連項目 マップリスト リストの内容を行ごとに変更する SetupEditor イベントを使用して動的にComboList プロパティの値を変更します。 【実行例】 奇数行と偶数行でリストを変更 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 1列目にコンボボックスを表示 428 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.Cols(1).Caption = "コンボボックス" flex.Cols(1).ComboList = "奇数行1|奇数行2 End Sub Private Sub flex_StartEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.StartEdit If e.Col = 1 Then If e.Row Mod 2 = 0 Then ' 偶数行の設定 flex.Cols(1).ComboList = "偶数行1|偶数行2 Else ' 奇数行の設定 flex.Cols(1).ComboList = "奇数行1|奇数行2 End If End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 1列目にコンボボックスを表示 flex.Cols[1].Caption = "コンボボックス"; flex.Cols[1].ComboList = "奇数行1|奇数行2 } private void flex_StartEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { if(e.Col == 1) { if(e.Row % 2 == 0) { // 偶数行の設定 flex.Cols[1].ComboList = "偶数行1|偶数行2 } else { // 奇数行の設定 flex.Cols[1].ComboList = "奇数行1|奇数行2 } } } 注意: 注意:表示したいリストごとにカスタムスタイルを作成し、ComboList プロパティを設定、任意のセルに割り当てる方法で も可能です。カスタムスタイルを使用した方法については、「セルごとにコンボボックスを設定する」を参照してください。 データマップの内容を行ごとに変更する 列内でデータマップの内容を変更する場合は、カスタムスタイルを作成してCellStyle クラスの DataMap プロパティを使用す る必要があります。通常のコンボボックスのように行・列のDataMap プロパティを変更してしまうと、表示値-実値のマッピング ができなくなってしまうためです。 【実行例】 429 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 奇数行と偶数行でデータマップを変更 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' カスタムスタイルを作成し、DataMap1を設定 Dim dtMap1 As Specialized.ListDictionary dtMap1 = New Specialized.ListDictionary dtMap1.Add("001", "青森") dtMap1.Add("002", "秋田") dtMap1.Add("003", "宮城") flex.Styles.Add("DataMap1") flex.Styles("DataMap1").DataMap = dtMap1 ' 別のカスタムスタイルを作成し、DataMap2を設定 Dim dtMap2 As Specialized.ListDictionary dtMap2 = New Specialized.ListDictionary dtMap2.Add("004", "東京") dtMap2.Add("005", "神奈川") dtMap2.Add("006", "千葉") flex.Styles.Add("DataMap2") flex.Styles("DataMap2").DataMap = dtMap2 ' 2列目のスタイルにDataMap1を設定 flex.Cols(1).Style = flex.Styles("DataMap1") ' 奇数行にはDataMap2を設定 For i As Integer = flex.Rows.Fixed To flex.Rows.Count - 1 If i Mod 2 = 1 Then flex.SetCellStyle(i, 1, flex.Styles("DataMap2")) End If Next flex.Cols(1).Caption = "データマップ" End Sub 430 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // カスタムスタイルを作成し、DataMap1を設定 System.Collections.Specialized.ListDictionary dtMap1; dtMap1 = new System.Collections.Specialized.ListDictionary(); dtMap1.Add("001", "青森"); dtMap1.Add("002", "秋田"); dtMap1.Add("003", "宮城"); flex.Styles.Add("DataMap1"); flex.Styles["DataMap1"].DataMap = dtMap1; // 別のカスタムスタイルを作成し、DataMap2を設定 System.Collections.Specialized.ListDictionary dtMap2; dtMap2 = new System.Collections.Specialized.ListDictionary(); dtMap2.Add("004", "東京"); dtMap2.Add("005", "神奈川"); dtMap2.Add("006", "千葉"); flex.Styles.Add("DataMap2"); flex.Styles["DataMap2"].DataMap = dtMap2; // 2列目のスタイルにDataMap1を設定 flex.Cols[1].Style = flex.Styles["DataMap1"]; // 奇数行にはDataMap2を設定 for (int i = flex.Rows.Fixed; i < flex.Rows.Count; i++) { if (i % 2 == 1) { flex.SetCellStyle(i, 1, "DataMap2"); } } flex.Cols[1].Caption = "データマップ"; } セルごとにコンボボックスを設定する カスタムスタイルを使用します。カスタムスタイルのComboList プロパティを設定し、作成したスタイルを任意の行や列、セル (範囲)に割りあってることで、任意のセルにコンボボックスを表示することができます。 【実行例】 431 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' カスタムスタイル"Combo1"を作成、 ' ComboListプロパティを設定 flex.Styles.Add("Combo1") flex.Styles("Combo1").ComboList = "東京|神奈川 flex.Styles("Combo1").BackColor = Color.AliceBlue flex.Styles("Combo1").ForeColor = Color.Blue ' カスタムスタイル"Combo2"を作成、 ' ComboListプロパティを設定 flex.Styles.Add("Combo2") flex.Styles("Combo2").ComboList = "京都|大阪 flex.Styles("Combo2").BackColor = Color.YellowGreen flex.Styles("Combo2").ForeColor = Color.Yellow ' カスタムスタイル"Combo3"を作成、 ' ComboListプロパティを設定 flex.Styles.Add("Combo3") flex.Styles("Combo3").ComboList = "青森|秋田 flex.Styles("Combo3").BackColor = Color.Beige ' 2行目全体にカスタムスタイル"Combo1"を設定 flex.Rows(2).Style = flex.Styles("Combo1") ' 4列目全体にカスタムスタイル"Combo2"を設定 flex.Cols(4).Style = flex.Styles("Combo2") ' 9行1列-10行2列目のセル範囲にカスタムスタイル"Combo3"を設定 Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetCellRange(9, 1, 10, 2) cr.Style = flex.Styles("Combo3") ' 4行1列目のセルにカスタムスタイル"Combo3"を設定 flex.SetCellStyle(4, 1, flex.Styles("Combo3")) End Sub 432 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // カスタムスタイル"Combo1"を作成、 // ComboListプロパティを設定 flex.Styles.Add("Combo1"); flex.Styles["Combo1"].ComboList = "東京|神奈川 flex.Styles["Combo1"].BackColor = Color.AliceBlue; flex.Styles["Combo1"].ForeColor = Color.Blue; // カスタムスタイル"Combo2"を作成、 // ComboListプロパティを設定 flex.Styles.Add("Combo2"); flex.Styles["Combo2"].ComboList = "京都|大阪 flex.Styles["Combo2"].BackColor = Color.YellowGreen; flex.Styles["Combo2"].ForeColor = Color.Yellow; // カスタムスタイル"Combo3"を作成、 // ComboListプロパティを設定 flex.Styles.Add("Combo3"); flex.Styles["Combo3"].ComboList = "青森|秋田 flex.Styles["Combo3"].BackColor = Color.Beige; // 2行目全体にカスタムスタイル"Combo1"を設定 flex.Rows[2].Style = flex.Styles["Combo1"]; // 4列目全体にカスタムスタイル"Combo2"を設定 flex.Cols[4].Style = flex.Styles["Combo2"]; // 9行1列-10行2列目のセル範囲にカスタムスタイル"Combo3"を設定 C1.Win.C1FlexGrid.CellRange cr; cr = flex.GetCellRange(9, 1, 10, 2); cr.Style = flex.Styles["Combo3"]; // 4行1列目のセルにカスタムスタイル"Combo3"を設定 flex.SetCellStyle(4, 1, flex.Styles["Combo3"]); } 注意: カスタムスタイルを使用すれば、コンボボックス以外にもデータマップや背景色など、さまざまな要素をセル単位で 設定することができます。 行・列のスタイルを両方とも設定したセルでは、列に適用したスタイルが優先されます。 チェックボックス チェックボックスに関するタスクを紹介します。 関連項目 チェックボックス(セルの編集) チェックボックスを表示する セルに適用されているスタイルのデータ型(DataType)や、行や列のデータ型(DataType)がブール型であれば、自動的に チェックボックスが表示されます。 433 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 1列目のデータ型をブール型に設定 flex.Cols(1).DataType = GetType(Boolean) flex.Cols(1).Caption = "チェックボックス" ' カスタムスタイル"CheckBox1"を作成、 ' データ型をブール型に設定 flex.Styles.Add("CheckBox1") flex.Styles("CheckBox1").DataType = GetType(Boolean) flex.Styles("CheckBox1").BackColor = Color.AliceBlue flex.Styles("CheckBox1").ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.CenterCenter ' 4行3列-5行4列目のセル範囲にカスタムスタイル"CheckBox1"を適用 Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetCellRange(4, 3, 5, 4) cr.Style = flex.Styles("CheckBox1") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 1列目のデータ型をブール型に設定 flex.Cols[1].DataType = typeof(bool); flex.Cols[1].Caption = "チェックボックス"; // カスタムスタイル"CheckBox1"を作成、 // データ型をブール型に設定 434 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.Styles.Add("CheckBox1"); flex.Styles["CheckBox1"].DataType = typeof(bool); flex.Styles["CheckBox1"].BackColor = Color.AliceBlue; flex.Styles["CheckBox1"].ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.CenterCenter; // 4行3列-5行4列目のセル範囲にカスタムスタイル"CheckBox1"を適用 C1.Win.C1FlexGrid.CellRange cr; cr = flex.GetCellRange(4, 3, 5, 4); cr.Style = flex.Styles["CheckBox1"]; } 注意: 注意:連結(バウンド)モードのグリッドにおける列のデータ型は、FlexGridと接続しているデータソースに依存します。 チェックボックスを表示する(SetCellCheck) SetCellCheck メソッドを使用してセルにチェックボックスを表示します。この場合、セルのデータ型をブール型にする必要はあ りません。チェックボックスとテキストの両方を表示することもできます。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 3行2列目のセルにチェックボックス(Checked)を設定 flex.SetCellCheck(3, 2, C1.Win.C1FlexGrid.CheckEnum.Checked) ' 3行2列目のセルにデータを設定 flex(3, 2) = "チェック" ' 3行3列目のセルにチェックボックス(Unchecked)を設定 flex.SetCellCheck(3, 3, C1.Win.C1FlexGrid.CheckEnum.Unchecked) ' 3行3列目のセルにデータを設定 flex(3, 3) = "未チェック" ' 4行2列目のセルにチェックボックス(TSChecked)を設定 435 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.SetCellCheck(4, 2, C1.Win.C1FlexGrid.CheckEnum.TSChecked) ' 4行2列目のセルにデータを設定 flex(4, 2) = "チェック" ' 4行3列目のセルにチェックボックス(TSUnchecked)を設定 flex.SetCellCheck(4, 3, C1.Win.C1FlexGrid.CheckEnum.TSUnchecked) ' 4行3列目のセルにデータを設定 flex(4, 3) = "未チェック" ' 4行4列目のセルにチェックボックス(TSGrayed)を設定 flex.SetCellCheck(4, 4, C1.Win.C1FlexGrid.CheckEnum.TSGrayed) ' 4行4列目のセルにデータを設定 flex(4, 4) = "グレー" End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 3行2列目のセルにチェックボックス(Checked)を設定 flex.SetCellCheck(3, 2, C1.Win.C1FlexGrid.CheckEnum.Checked); // 3行2列目のセルにデータを設定 flex[3, 2] = "チェック"; // 3行3列目のセルにチェックボックス(Unchecked)を設定 flex.SetCellCheck(3, 3, C1.Win.C1FlexGrid.CheckEnum.Unchecked); // 3行3列目のセルにデータを設定 flex[3, 3] = "未チェック"; // 4行2列目のセルにチェックボックス(TSChecked)を設定 flex.SetCellCheck(4, 2, C1.Win.C1FlexGrid.CheckEnum.TSChecked); // 4行2列目のセルにデータを設定 flex[4, 2] = "チェック"; // 4行3列目のセルにチェックボックス(TSUnchecked)を設定 flex.SetCellCheck(4, 3, C1.Win.C1FlexGrid.CheckEnum.TSUnchecked); // 4行3列目のセルにデータを設定 flex[4, 3] = "未チェック"; // 4行4列目のセルにチェックボックス(TSGrayed)を設定 flex.SetCellCheck(4, 4, C1.Win.C1FlexGrid.CheckEnum.TSGrayed); // 4行4列目のセルにデータを設定 flex[4, 4] = "グレー"; } チェックボックスのイメージを変更する Glyphs プロパティでGlyphEnum.Checked/GlyphEnum.Unchecked を指定して変更します。 【実行例】 436 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 1列目のデータ型をブール型にしてチェックボックスを表示 flex.Cols(1).DataType = GetType(Boolean) flex.Cols(1).Caption = "チェックボックス" ' 3行3列目のセルにチェックボックス(Checked)を設定 flex.SetCellCheck(3, 3, C1.Win.C1FlexGrid.CheckEnum.Checked) flex(3, 3) = "オン" ' 3行4列目のセルにチェックボックス(Unchecked)を設定 flex.SetCellCheck(3, 4, C1.Win.C1FlexGrid.CheckEnum.Unchecked) flex(3, 4) = "オフ" ' オンのチェックボックスイメージを変更 flex.Glyphs(C1.Win.C1FlexGrid.GlyphEnum.Checked) = New Bitmap("ok.gif") ' オフのチェックボックスイメージを変更 flex.Glyphs(C1.Win.C1FlexGrid.GlyphEnum.Unchecked) = New Bitmap("cancel.gif") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 1列目のデータ型をブール型にしてチェックボックスを表示 flex.Cols[1].DataType = typeof(bool); flex.Cols[1].Caption = "チェックボックス"; // 3行3列目のセルにチェックボックス(Checked)を設定 flex.SetCellCheck(3, 3, C1.Win.C1FlexGrid.CheckEnum.Checked); flex[3, 3] = "オン"; // 3行4列目のセルにチェックボックス(Unchecked)を設定 flex.SetCellCheck(3, 4, C1.Win.C1FlexGrid.CheckEnum.Unchecked); 437 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex[3, 4] = "オフ"; // オンのチェックボックスイメージを変更 flex.Glyphs[C1.Win.C1FlexGrid.GlyphEnum.Checked] = new Bitmap("ok.gif"); // オフのチェックボックスイメージを変更 flex.Glyphs[C1.Win.C1FlexGrid.GlyphEnum.Unchecked] = new Bitmap("cancel.gif"); } チェックボックスのセルにテキストを表示する SetCellCheck メソッドを使用するか、オーナー描画の機能を使用します。オーナー描画を使用すると、チェックボックスの値に 応じてテキストを表示することもできます。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 1列目のデータ型をブール型にしてチェックボックスを表示 flex.Cols(1).DataType = GetType(Boolean) flex.Cols(1).Caption = "チェックボックス" flex.Cols(1).Style.Display = C1.Win.C1FlexGrid.DisplayEnum.Stack flex.Cols(1).Style.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.LeftCenter flex.Cols(1).Style.ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.LeftCenter ' オーナー描画 flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw End Sub Private Sub flex_OwnerDrawCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles flex.OwnerDrawCell If e.Row >= flex.Rows.Fixed And e.Col = 1 Then ' True/Falseで異なるデータを表示 If flex(e.Row, e.Col) Is Nothing Or flex(e.Row, e.Col) = "False" Then e.Text = "OFF" 438 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Else e.Text = "ON" End If End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 1列目のデータ型をブール型にしてチェックボックスを表示 flex.Cols[1].DataType = typeof(bool); flex.Cols[1].Caption = "チェックボックス"; flex.Cols[1].Style.Display = C1.Win.C1FlexGrid.DisplayEnum.Stack; flex.Cols[1].Style.TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.LeftCenter; flex.Cols[1].Style.ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.LeftCenter; // オーナー描画 flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw; } private void flex_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e) { if ((e.Row >= flex.Rows.Fixed) && (e.Col == 1)) { // True/Falseで異なるデータを表示 if ((flex[e.Row, e.Col] == null) | { e.Text = "OFF"; } else { e.Text = "ON"; } } 注意: 注意:SetCellCheck メソッドを使用する方法については、「チェックボックスを表示する(SetCellCheck)」を参照してくださ い。 日付型セル 日付型に設定されたセルにおけるタスクを紹介します。 カレンダーコントロールを使用して日付の入力を行う セルに適用されているスタイルのデータ型(DataType)や、行や列のデータ型(DataType)が日付型であれば、自動的にカレ ンダー(DateTimePicker)コントロールによる入力ができます。 【実行例】 439 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 1列目のデータ型を日付型に設定 flex.Cols(1).DataType = GetType(Date) flex.Cols(1).Caption = "日付" ' カスタムスタイル"DatePicker1"を作成、 ' データ型を日付型に設定 flex.Styles.Add("DatePicker1") flex.Styles("DatePicker1").DataType = GetType(Date) flex.Styles("DatePicker1").BackColor = Color.AliceBlue ' 4行3列-5行4列目のセル範囲にカスタムスタイル"DatePicker1"を適用 Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetCellRange(4, 3, 5, 4) cr.Style = flex.Styles("DatePicker1") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 1列目のデータ型を日付型に設定 flex.Cols[1].DataType = typeof(DateTime); flex.Cols[1].Caption = "日付"; // カスタムスタイル"DatePicker1"を作成、 // データ型を日付型に設定 flex.Styles.Add("DatePicker1"); flex.Styles["DatePicker1"].DataType = typeof(DateTime); flex.Styles["DatePicker1"].BackColor = Color.AliceBlue; // 4行3列-5行4列目のセル範囲にカスタムスタイル"DatePicker1"を適用 440 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C1.Win.C1FlexGrid.CellRange cr; cr = flex.GetCellRange(4, 3, 5, 4); cr.Style = flex.Styles["DatePicker1"]; } 注意: 注意:連結(バウンド)モードのグリッドにおける列のデータ型は、C1FlexGrid コントロールと接続しているデータソースに 依存します。 カレンダーコントロールを表示しない 「カレンダーコントロールを使用して日付の入力を行う」にもありますが、セルのデータ型が日付型に設定されていれば、セル 編集時、自動的にカレンダーコントロールが表示されます。カレンダーコントロールを表示しないようにするには、「スピンボタン を使用して日付の入力を行う」方法に加えて、EditMask プロパティにてセルにマスクを設定する方法があります。日付として 正しい入力かどうかは、ValidateEdit イベントを使用してチェック可能です。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 列のデータ型を Date 型に設定 flex.Cols(1).DataType = GetType(Date) ' マスクを設定 flex.Cols(1).EditMask = "0000/00/00" End Sub ' 入力チェック Private Sub flex_ValidateEdit(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.ValidateEditEventArgs) Handles flex.ValidateEdit If e.Col = 1 Then Dim d As Date If Date.TryParse(flex.Editor.Text, d) = False Then e.Cancel = True MessageBox.Show("無効な日付です") 441 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms End If End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 列のデータ型を Date 型に設定 flex.Cols[1].DataType = typeof(DateTime); // マスクを設定 flex.Cols[1].EditMask = "0000/00/00"; } // 入力チェック private void flex_ValidateEdit(object sender, C1.Win.C1FlexGrid.ValidateEditEventArgs e) { if (e.Col == 1) { DateTime d; if (DateTime.TryParse(flex.Editor.Text, out d) == false) { e.Cancel = true; MessageBox.Show("無効な日付です"); } } } 注意: 注意:連結(バウンド)モードのグリッドにおける列のデータ型は、C1FlexGrid コントロールと接続しているデータソースに 依存します。 関連項目 カレンダーコントロールを使用して日付の入力を行う スピンボタンを使用して日付の入力を行う スピンボタンを使用して日付の入力を行う SetupEditor イベントを使用し、日付型セルで編集用エディタを DateTimePicker に変換した上で、ShowUpDown プロパ ティを True に設定します。 【実行例】 442 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Pivate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 1列目のデータ型を日付型に設定 flex.Cols(1).DataType = GetType(Date) flex.Cols(1).Caption = "日付" End Sub Private Sub flex_SetupEditor(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.SetupEditor If e.Col = 1 Then ' 編集エディタをDateTimePickerに変換 Dim dt As DateTimePicker dt = CType(flex.Editor, DateTimePicker) ' スピンボタンを表示 dt.ShowUpDown = True End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 1列目のデータ型を日付型に設定 flex.Cols[1].DataType = typeof(DateTime); flex.Cols[1].Caption = "日付"; } private void flex_SetupEditor(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { if(e.Col == 1) { 443 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // 編集エディタをDateTimePickerに変換 DateTimePicker dt; dt = (DateTimePicker)flex.Editor; // スピンボタンを表示 dt.ShowUpDown = true; } } 注意: DateTimePicker コントロールの詳細については、MSDN を参照してください。 連結(バウンド)モードのグリッドにおける列のデータ型は、C1FlexGrid コントロールと接続しているデータソースに 依存します。 日付の書式を設定する 日付型セルの書式を設定するには、セルに適用されているスタイルのFormat や、行や列の Format を設定します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 1列目のデータ型を日付型に設定 flex.Cols(1).DataType = GetType(Date) flex.Cols(1).Caption = "日付" ' 日付の書式を設定:Long Date(長い日付) flex.Cols(1).Format = "D" ' カスタムスタイル"Date1"を作成、 ' データ型、書式を設定 flex.Styles.Add("Date1") flex.Styles("Date1").DataType = GetType(Date) 444 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ' 日付の書式を設定:カスタムDateTime書式指定文字列 flex.Styles("Date1").Format = "yyyy年MM月dd日" flex.Styles("Date1").BackColor = Color.AliceBlue ' 4行3列-5行4列目のセル範囲にカスタムスタイル"Date1"を適用 Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.GetCellRange(4, 3, 5, 4) cr.Style = flex.Styles("Date1") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 1列目のデータ型を日付型に設定 flex.Cols[1].DataType = typeof(DateTime); flex.Cols[1].Caption = "日付"; // 日付の書式を設定:Long Date(長い日付) flex.Cols[1].Format = "D"; // カスタムスタイル"Date1"を作成、 // データ型、書式を設定 flex.Styles.Add("Date1"); flex.Styles["Date1"].DataType = typeof(DateTime); // 日付の書式を設定:カスタムDateTime書式指定文字列 flex.Styles["Date1"].Format = "yyyy年MM月dd日"; flex.Styles["Date1"].BackColor = Color.AliceBlue; // 4行3列-5行4列目のセル範囲にカスタムスタイル"Date1"を適用 C1.Win.C1FlexGrid.CellRange cr; cr = flex.GetCellRange(4, 3, 5, 4); cr.Style = flex.Styles["Date1"]; } 注意: 列の書式設定は、設計時に Column タスク メニューや 列エディタ からも設定できます。 連結(バウンド)モードのグリッドにおける列のデータ型は、C1FlexGrid コントロールと接続しているデータソースに 依存します。 和暦で表示する C1FlexGrid コントロールの書式設定に和暦表示はありません。そのため、JapaneseCalendarクラスを使用して和暦に変換 し、オーナー描画にて表示します。 【実行例】 445 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Dim c As System.Globalization.CultureInfo Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 1、2列目のデータ型を日付型に設定 flex.Cols(1).DataType = GetType(Date) flex.Cols(1).Caption = "日付" flex.Cols(2).DataType = GetType(Date) flex.Cols(2).Caption = "和暦表示" ' データの設定 flex(1, 1) = "2007/09/16" flex(1, 2) = "2007/09/16" flex(2, 1) = "2010/09/21" flex(2, 2) = "2010/09/21" flex(3, 1) = "2008/02/29" flex(3, 2) = "2008/02/29" flex(4, 1) = "1973/09/01" flex(4, 2) = "1973/09/01" flex(5, 1) = "1895/12/24" flex(5, 2) = "1895/12/24" flex(6, 1) = "1994/05/13" flex(6, 2) = "1994/05/13" ' オーナー描画 flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw flex.AutoSizeCol(2) ' JapanseCalendarクラスを使用 c = New System.Globalization.CultureInfo("ja-JP") c.DateTimeFormat.Calendar = New System.Globalization.JapaneseCalendar End Sub Private Sub flex_OwnerDrawCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles flex.OwnerDrawCell ' 2列目を和暦で表示 446 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms If e.Col = 2 And e.Row > 0 Then If e.Text = "" Or e.Text Is Nothing Then Return End If ' 表示データの設定(和暦表示) e.Text = Date.Parse(e.Text).ToString("ggyy年MM月dd日(dddd)", c) End If End Sub C# コードの書き方 C# System.Globalization.CultureInfo c; Private void Form1_Load(object sender, EventArgs e) { // 1、2列目のデータ型を日付型に設定 flex.Cols[1].DataType = typeof(DateTime); flex.Cols[1].Caption = "日付"; flex.Cols[2].DataType = typeof(DateTime); flex.Cols[2].Caption = "和暦表示"; // データの設定 flex[1, 1] = "2007/09/16"; flex[1, 2] = "2007/09/16"; flex[2, 1] = "2010/09/21"; flex[2, 2] = "2010/09/21"; flex[3, 1] = "2008/02/29"; flex[3, 2] = "2008/02/29"; flex[4, 1] = "1973/09/01"; flex[4, 2] = "1973/09/01"; flex[5, 1] = "1895/12/24"; flex[5, 2] = "1895/12/24"; flex[6, 1] = "1994/05/13"; flex[6, 2] = "1994/05/13"; // オーナー描画 flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw; flex.AutoSizeCol(2); // JapanseCalendarクラスを使用 c = new System.Globalization.CultureInfo("ja-JP"); c.DateTimeFormat.Calendar = new System.Globalization.JapaneseCalendar(); } private void flex_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e) { // 2列目を和暦で表示 if ((e.Col == 2) && (e.Row > 0)) { if((e.Text == "") | { return; } // 表示データの設定(和暦表示) e.Text = DateTime.Parse(e.Text).ToString("ggyy年MM月dd日(dddd)", c); 447 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms } } 注意: JapaneseCalendar クラスの詳細は、MSDN を参照してください。 連結(バウンド)モードのグリッドにおける列のデータ型は、C1FlexGrid コントロールと接続しているデータソースに 依存します。 時刻のみを表示する 日付型のセルで時刻のみを表示するには、セルに適用されているスタイルのFormat や、行や列の Format をShort Time(短い時刻)やLong Time(長い時刻)に設定し、スピンボタンにより編集します。 【実行例】 Visual Basic コードの書き方 Visual Basic ' Short Time(短い時刻) flex.Cols(1).DataType = GetType(Date) flex.Cols(1).Format = "t" C# コードの書き方 C# // Short Time(短い時刻) flex.Cols[1].DataType = typeof(DateTime); flex.Cols[1].Format = "t"; 注意: 列の書式設定は、設計時に Column タスク メニューや 列エディタ からも設定できます。 連結(バウンド)モードのグリッドにおける列のデータ型は、C1FlexGrid コントロールと接続しているデータソースに 依存します。 448 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 入力可能な日付を設定する SetupEditor イベントを使用して、日付型セルの編集用エディタを DateTimePicker に変換した上で、DateTimePicker クラス の MinDate/MaxDate プロパティを設定します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 列のデータ型を Date 型に設定 flex.Cols(1).DataType = GetType(Date) End Sub Private Sub flex_SetupEditor(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.RowColEventArgs) Handles flex.SetupEditor If e.Col = 1 Then Dim dt As DateTimePicker = CType(flex.Editor, DateTimePicker) dt.MinDate = "2009/02/08" dt.MaxDate = "2009/02/21" End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 列のデータ型を Date 型に設定 flex.Cols[1].DataType = typeof(DateTime); } private void flex_SetupEditor(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { 449 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms if (e.Col == 1) { DateTimePicker dt; dt = (DateTimePicker)flex.Editor; dt.MinDate = DateTime.Parse("2009/02/08"); dt.MaxDate = DateTime.Parse("2009/02/21"); } } 注意: DateTimePicker コントロールの詳細は、MSDN を参照してください。 連結(バウンド)モードのグリッドにおける列のデータ型は、C1FlexGrid コントロールと接続しているデータソースに 依存します。 数値型セル 数値型に設定されたセルにおけるタスクを紹介します。 数値エディタを使用する EditOptions プロパティにUseNumericEditor フラグを追加します。 組み込みの数値エディタには、下記の特長があります。 数値エディタはスタイルや列に割り当てられた Format プロパティを使用して入力中の書式設定を行います。そのた め、入力中に3桁区切りでカンマを表示するといった動作が可能です。 数値エディタはキーチェックを行うため、数値型のセルで文字列が入力されることを防ぎます。 数値エディタはデータ型に応じた範囲チェックを提供します。Intege r 型のセルでは、Integer 型の最小値から最大値 までの入力のみを提供します。 EditFlags 列挙体に UseNumericEditor フラグを含めないことで、組み込み数値エディタを無効にできます。 デザイナの場合 プロパティページで EditOptions プロパティを選択し、All をチェックするか、UseNumericEditor をチェックします。 コードの場合 Visual Basic コードの書き方 Visual Basic flex.EditOptions = C1.Win.C1FlexGrid.EditFlags.All ' UseNumericEditorとCycleOnDoubleClickのみ ' flex.EditOptions = C1.Win.C1FlexGrid.EditFlags.UseNumericEditor Or _ ' C1.Win.C1FlexGrid.EditFlags.CycleOnDoubleClick 450 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# コードの書き方 C# flex.EditOptions = C1.Win.C1FlexGrid.EditFlags.All; // UseNumericEditorとCycleOnDoubleClickのみ // flex.EditOptions = C1.Win.C1FlexGrid.EditFlags.UseNumericEditor | // C1.Win.C1FlexGrid.EditFlags.CycleOnDoubleClick; 数値型セルの書式を設定する 行や列、各スタイルの Format プロパティを使用して書式を設定します。また、EditOptions プロパティにUseNumericEditor フラグを追加して数値エディタを使用することで、編集中も書式設定が有効になります。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 組み込みの数値エディタを使用 flex.EditOptions = C1.Win.C1FlexGrid.EditFlags.All ' 1列目のデータ型を数値型に設定 flex.Cols(1).DataType = GetType(Decimal) ' 1列目の書式を設定 flex.Cols(1).Format = "C" End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 組み込みの数値エディタを使用 flex.EditOptions = C1.Win.C1FlexGrid.EditFlags.All; // 1列目のデータ型を数値型に設定 451 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.Cols[1].DataType = typeof(decimal); // 1列目の書式を設定 flex.Cols[1].Format = "C"; } 注意: 列の書式設定は、設計時に Column タスク メニューや 列エディタ からも設定できます。 行や列単位で書式を設定する方法は、「行列の書式を設定する」を参照してください。 スタイルを使用して書式を設定する方法は、「書式を設定する」を参照してください。 ツリー表示/小計行 アウトラインツリーや小計行に関するタスクを紹介します。 小計行を表示する 小計行は、Subtotal メソッドを使用して表示します。小計行の表示位置は、SubtotalPosition プロパティで上下どちらかに 設定することができます。 【実行例】 Visual Basic コードの書き方 Visual Basic Prvate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex(1, 2) = 180 flex(2, 2) = 20 flex(3, 2) = 74 ' 2列目を合計した小計行を表示 ' 計算:合計、レベル:-1(総計行)、境界の開始列:-1(なし)、計算対象の列:2 flex.Subtotal(C1.Win.C1FlexGrid.AggregateEnum.Sum, -1, -1, 2) ' 総計行の組み込みスタイルを変更 flex.Styles("GrandTotal").BackColor = Color.YellowGreen flex.Styles("GrandTotal").ForeColor = Color.Red 452 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex[1, 2] = 180; flex[2, 2] = 20; flex[3, 2] = 74; // 2列目を合計した小計行を表示 // 計算:合計、レベル:-1(総計行)、境界の開始列:-1(なし)、計算対象の列:2 flex.Subtotal(C1.Win.C1FlexGrid.AggregateEnum.Sum, -1, -1, 2); // 総計行の組み込みスタイルを変更 flex.Styles["GrandTotal"].BackColor = Color.YellowGreen; flex.Styles["GrandTotal"].ForeColor = Color.Red; } 関連項目 組み込みスタイルの位置について 小計行をカスタマイズして表示する Subtotal メソッドを使用すると、BeforeSubtotal/AfterSubtotal イベントが発生します。これらのイベントを使用して新しい 小計行で使用されるキャプション、スタイル、および集計値をカスタマイズできます。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex(1, 2) = 180 flex(2, 2) = 20 flex(3, 2) = 74 453 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ' 2列目を合計した小計行を表示 ' 計算:合計、レベル:-1(総計行)、境界の開始列:-1(なし)、計算対象の列:2 flex.Subtotal(C1.Win.C1FlexGrid.AggregateEnum.Sum, -1, -1, 2) ' 総計行の組み込みスタイルを変更 flex.Styles("GrandTotal").BackColor = Color.YellowGreen flex.Styles("GrandTotal").ForeColor = Color.Yellow flex.Styles("GrandTotal").TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.RightCenter End Sub Private Sub flex_BeforeSubtotal(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.SubtotalEventArgs) Handles flex.BeforeSubtotal e.AggregateValue = "<" & e.AggregateValue & ">" End Sub Private Sub flex_AfterSubtotal(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.SubtotalEventArgs) Handles flex.AfterSubtotal flex(e.NewRowIndex, 1) = "合計:" End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex[1, 2] = 180; flex[2, 2] = 20; flex[3, 2] = 74; // 2列目を合計した小計行を表示 // 計算:合計、レベル:-1(総計行)、境界の開始列:-1(なし)、計算対象の列:2 flex.Subtotal(C1.Win.C1FlexGrid.AggregateEnum.Sum, -1, -1, 2); // 総計行の組み込みスタイルを変更 flex.Styles["GrandTotal"].BackColor = Color.YellowGreen; flex.Styles["GrandTotal"].ForeColor = Color.Yellow; flex.Styles["GrandTotal"].TextAlign = C1.Win.C1FlexGrid.TextAlignEnum.RightCenter; } private void flex_BeforeSubtotal(object sender, C1.Win.C1FlexGrid.SubtotalEventArgs e) { e.AggregateValue = "<" + e.AggregateValue + ">"; } private void flex_AfterSubtotal(object sender, C1.Win.C1FlexGrid.SubtotalEventArgs e) { flex[e.NewRowIndex, 1] = "合計:"; } 関連項目 組み込みスタイルの位置について 小計行を使用してアウトラインツリーを表示する Column プロパティでツリーが表示される列を、Style プロパティでツリーの外観を指定します。その上で、Subtotal メソッドを 使用して小計行を表示します。小計行の表示位置は、SubtotalPosition プロパティで上下どちらかに設定することができま す。 454 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex(1, 0) = "AAA" flex(1, 1) = 10 flex(2, 0) = "AAA" flex(2, 1) = 20 flex(3, 0) = "BBB" flex(3, 1) = 30 flex(4, 0) = "BBB" flex(4, 1) = 40 flex(5, 0) = "BBB" flex(5, 1) = 50 ' 固定列:0 flex.Cols.Fixed = 0 ' ツリー列:0 flex.Tree.Column = 0 ' ツリースタイルを設定 flex.Tree.Style = C1.Win.C1FlexGrid.TreeStyleFlags.SimpleLeaf ' 小計行(全ての合計)を表示 ' 計算:合計、レベル:0、境界の開始列:-1(なし)、計算対象の列:1, キャプション flex.Subtotal(C1.Win.C1FlexGrid.AggregateEnum.Sum, 0, -1, 1, "全ての合計") ' 小計行(0列目ごとの合計)を表示 ' 計算:合計、レベル:1、境界の開始列:0、計算対象の列:1, キャプション flex.Subtotal(C1.Win.C1FlexGrid.AggregateEnum.Sum, 1, 0, 1, "{0}の合計") ' レベル0の組み込みスタイルを変更 flex.Styles2("Subtotal0").BackColor = Color.YellowGreen flex.Styles("Subtotal0").ForeColor = Color.Red ' レベル1の組み込みスタイルを変更 flex.Styles("Subtotal1").BackColor = Color.AliceBlue 455 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.Styles("Subtotal1").ForeColor = Color.Green ' 列幅の自動調整 flex.AutoSizeCol(0) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex[1, 0] = "AAA"; flex[1, 1] = 10; flex[2, 0] = "AAA"; flex[2, 1] = 20; flex[3, 0] = "BBB"; flex[3, 1] = 30; flex[4, 0] = "BBB"; flex[4, 1] = 40; flex[5, 0] = "BBB"; flex[5, 1] = 50; // 固定列:0 flex.Cols.Fixed = 0; // ツリー列:0 flex.Tree.Column = 0; // ツリースタイルを設定 flex.Tree.Style = C1.Win.C1FlexGrid.TreeStyleFlags.SimpleLeaf; // 小計行(全ての合計)を表示 // 計算:合計、レベル:0、境界の開始列:-1(なし)、計算対象の列:1, キャプション flex.Subtotal(C1.Win.C1FlexGrid.AggregateEnum.Sum, 0, -1, 1, "全ての合計"); // 小計行(0列目ごとの合計)を表示 // 計算:合計、レベル:1、境界の開始列:0、計算対象の列:1, キャプション flex.Subtotal(C1.Win.C1FlexGrid.AggregateEnum.Sum, 1, 0, 1, "{0}の合計"); // レベル0の組み込みスタイルを変更 flex.Styles["Subtotal0"].BackColor = Color.YellowGreen; flex.Styles["Subtotal0"].ForeColor = Color.Red; // レベル1の組み込みスタイルを変更 flex.Styles["Subtotal1"].BackColor = Color.AliceBlue; flex.Styles["Subtotal1"].ForeColor = Color.Green; // 列幅の自動調整 flex.AutoSizeCol(0); } 関連項目 関連項目組み込みスタイルの位置について 組み込みスタイルの位置について組み込みスタイルの位置について データにあわせて行/列のサイズを調整する ノード行を指定してアウトラインツリーを表示する Column プロパティでツリーが表示される列を、Style プロパティでツリーの外観を指定します。また、任意の行のIsNode プロ パティを True にしてノード行とすることでアウトラインツリーを表示します。ノード行の階層レベルは、各ノード行のNode オブ ジェクトを取得し、そのLevel プロパティを設定することで定義します。大きい値ほど、アウトラインツリー上のより深い(よりイン デントした)階層レベルを意味します。 456 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 注意: 注意:IsNode プロパティは、非連結時のみ設定可能です。連結モード時は使用できません。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 固定列:0 flex.Cols.Fixed = 0 ' ツリー列:0 flex.Tree.Column = 0 ' ツリースタイルを設定 flex.Tree.Style = C1.Win.C1FlexGrid.TreeStyleFlags.SimpleLeaf ' 1行目をノード行に設定 flex.Rows(1).IsNode = True ' 階層レベルを0に設定 flex.Rows(1).Node.Level = 0 ' 3行目をノード行に設定 flex.Rows(3).IsNode = True ' 階層レベルを0に設定 flex.Rows(3).Node.Level = 0 flex(1, 0) = "ノード行1" flex(3, 0) = "ノード行2" End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 固定列:0 457 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.Cols.Fixed = 0; // ツリー列:0 flex.Tree.Column = 0; // ツリースタイルを設定 flex.Tree.Style = C1.Win.C1FlexGrid.TreeStyleFlags.SimpleLeaf; // 1行目をノード行に設定 flex.Rows[1].IsNode = true; // 階層レベルを0に設定 flex.Rows[1].Node.Level = 0; // 3行目をノード行に設定 flex.Rows[3].IsNode = true; // 階層レベルを0に設定 flex.Rows[3].Node.Level = 0; flex[1, 0] = "ノード行1"; flex[3, 0] = "ノード行2"; } 連結グリッドでアウトラインツリーを表示する IsNode プロパティは連結時に使用できないため、InsertNode メソッドでノード行を挿入してアウトラインツリーを表示します。 階層レベルは、InsertNode メソッドの引数で指定します。大きい値ほど、アウトラインツリー上のより深い(よりインデントした) 階層レベルを意味します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ... ' 連結グリッド flex.DataSource = dt ' 固定列:0 458 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.Cols.Fixed = 0 ' ツリー列:0 flex.Tree.Column = 0 ' ツリースタイルを設定 flex.Tree.Style = C1.Win.C1FlexGrid.TreeStyleFlags.SimpleLeaf ' ノード行を挿入(レベル:0) Dim n As C1.Win.C1FlexGrid.Node n = flex.Rows.InsertNode(1, 0) n.Data = "A~B" n = flex.Rows.InsertNode(13, 0) n.Data = "C~F" End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { ... // 連結グリッド flex.DataSource = dt; // 固定列:0 flex.Cols.Fixed = 0; // ツリー列:0 flex.Tree.Column = 0; // ツリースタイルを設定 flex.Tree.Style = C1.Win.C1FlexGrid.TreeStyleFlags.SimpleLeaf; // ノード行を挿入(レベル:0) C1.Win.C1FlexGrid.Node n; n = flex.Rows.InsertNode(1, 0); n.Data = "A~B"; n = flex.Rows.InsertNode(13, 0); n.Data = "C~F"; } ノード行にチェックボックスを表示する Checked プロパティ、または C1FlexGridBase.SetCellChecked メソッドを使用します。 【実行例】 459 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 固定列:0 flex.Cols.Fixed = 0 ' ツリー列:0 flex.Tree.C2olumn = 0 ' ツリースタイルを設定 flex.Tree.Style = C1.Win.C1FlexGrid.TreeStyleFlags.SimpleLeaf ' 1行目をノード行に設定 flex.Rows(1).IsNode = True ' 階層レベルを0に設定 flex.Rows(1).Node.Level = 0 ' 3行目をノード行に設定 flex.Rows(3).IsNode = True ' 階層レベルを1に設定 flex.Rows(3).Node.Level = 1 ' チェックボックスを表示 flex.Rows(3).Node.Checked = C1.Win.C1FlexGrid.CheckEnum.Checked flex(1, 0) = "ノード行1" flex(3, 0) = "ノード行2" End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 固定列:0 flex.Cols.Fixed = 0; // ツリー列:0 flex.Tree.Column = 0; 460 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // ツリースタイルを設定 flex.Tree.Style = C1.Win.C1FlexGrid.TreeStyleFlags.SimpleLeaf; // 1行目をノード行に設定 flex.Rows[1].IsNode = true; // 階層レベルを0に設定 flex.Rows[1].Node.Level = 0; // 3行目をノード行に設定 flex.Rows[3].IsNode = true; // 階層レベルを1に設定 flex.Rows[3].Node.Level = 1; // チェックボックスを表示 flex.Rows[3].Node.Checked = C1.Win.C1FlexGrid.CheckEnum.Checked; flex[1, 0] = "ノード行1"; flex[3, 0] = "ノード行2"; } 縮小・展開をコードで実行する Show メソッドを使用します。Show メソッドは、指定された階層レベルを折りたたみ、それより上位のレベルを展開します。各 ノード行が縮小・展開されているかどうかは、Expanded プロパティを使用して参照できます。 注意: 注意:Show メソッドによるノード行の展開/縮小は、Subtotal メソッドやIsNode プロパティ、InsertNode メソッドのい ずれの方法で作成したアウトラインツリー表示でも使用できます。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 固定列:0 flex.Cols.Fixed = 0 ' ツリー列:0 461 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.Tree.Column = 0 ' ツリースタイルを設定 flex.Tree.Style = C1.Win.C1FlexGrid.TreeStyleFlags.SimpleLeaf ' 1行目をノード行に設定 flex.Rows(1).IsNode = True ' 階層レベルを0に設定 flex.Rows(1).Node.Level = 0 ' 2行目をノード行に設定 flex.Rows(2).IsNode = True ' 階層レベルを1に設定 flex.Rows(2).Node.Level = 1 ' 3行目をノード行に設定 flex.Rows(3).IsNode = True ' 階層レベルを2に設定 flex.Rows(3).Node.Level = 2 flex(1, 0) = "階層レベル0" flex(2, 0) = "階層レベル1" flex(3, 0) = "階層レベル2" flex.AutoSizeCol(0) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 階層レベル1で縮小 flex.Tree.Show(1) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ' 全階層レベルを展開 flex.Tree.Show(flex.Tree.MaximumLevel + 1) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 固定列:0 flex.Cols.Fixed = 0; // ツリー列:0 flex.Tree.Column = 0; // ツリースタイルを設定 flex.Tree.Style = C1.Win.C1FlexGrid.TreeStyleFlags.SimpleLeaf; // 1行目をノード行に設定 flex.Rows[1].IsNode = true; // 階層レベルを0に設定 flex.Rows[1].Node.Level = 0; // 2行目をノード行に設定 flex.Rows[2].IsNode = true; // 階層レベルを1に設定 flex.Rows[2].Node.Level = 1; // 3行目をノード行に設定 flex.Rows[3].IsNode = true; 462 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // 階層レベルを2に設定 flex.Rows[3].Node.Level = 2; flex[1, 0] = "階層レベル0"; flex[2, 0] = "階層レベル1"; flex[3, 0] = "階層レベル2"; flex.AutoSizeCol(0); } private void button1_Click(object sender, EventArgs e) { // 階層レベル1で縮小 flex.Tree.Show(1); } private void button2_Click(object sender, EventArgs e) { // 全階層レベルを展開 flex.Tree.Show(flex.Tree.MaximumLevel + 1); } 縮小・展開イメージを変更する Glyphs プロパティで、展開の場合はGlyphEnum.Expanded を、縮小の場合はGlyphEnum.Collapsed を指定して変更しま す。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 固定列:0 flex.Cols.Fixed = 0 ' ツリー列:0 flex.Tree.Column = 0 463 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ' ツリースタイルを設定 flex.Tree.Style = C1.Win.C1FlexGrid.TreeStyleFlags.SimpleLeaf ' 1行目をノード行に設定 flex.Rows(12).IsNode = True ' 階層レベルを0に設定 flex.Rows(1).Node.Level = 0 ' 2行目をノード行に設定 flex.Rows(2).IsNode = True ' 階層レベルを1に設定 flex.Rows(2).Node.Level = 1 ' 3行目をノード行に設定 flex.Rows(3).IsNode = True ' 階層レベルを2に設定 flex.Rows(3).Node.Level = 2 flex(1, 0) = "階層レベル0" flex(2, 0) = "階層レベル1" flex(3, 0) = "階層レベル2" flex.AutoSizeCol(0) ' 展開のアイコンを変更 flex.Glyphs(C1.Win.C1FlexGrid.GlyphEnum.Expanded) = Image.FromFile("arrow.gif") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // 固定列:0 flex.Cols.Fixed = 0; // ツリー列:0 flex.Tree.Column = 0; // ツリースタイルを設定 flex.Tree.Style = C1.Win.C1FlexGrid.TreeStyleFlags.SimpleLeaf; // 1行目をノード行に設定 flex.Rows[1].IsNode = true; // 階層レベルを0に設定 flex.Rows[1].Node.Level = 0; // 2行目をノード行に設定 flex.Rows[2].IsNode = true; // 階層レベルを1に設定 flex.Rows[2].Node.Level = 1; // 3行目をノード行に設定 flex.Rows[3].IsNode = true; // 階層レベルを2に設定 flex.Rows[3].Node.Level = 2; flex[1, 0] = "階層レベル0"; flex[2, 0] = "階層レベル1"; flex[3, 0] = "階層レベル2"; flex.AutoSizeCol(0); // 展開のアイコンを変更 flex.Glyphs[C1.Win.C1FlexGrid.GlyphEnum.Expanded] = Image.FromFile("arrow.gif"); } 464 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 注意: 注意:Image.FromFile メソッドを使用すると、アプリケーション起動時に画像ファイルがロックされます。詳細は、MSDN などを参照してください。 フィルタリング フィルタリングにおけるタスクを紹介します。 ユーザーによるフィルタリングを許可する グリッドのAllowFiltering プロパティを True に変更します。また、列の AllowFiltering プロパティを None 以外に設定(デ フォルト値:Default)します。 データフィルタリング機能は、Windows7 や Vista において Microsoft が使用しているスタイルに従っています。ユーザーが列 ヘッダ上にマウスポインタを動かしたときに、グリッドはヘッダ上にフィルタボタンを表示します。フィルタボタンのクリックによ り、表示するデータを選択するフィルタエディタが起動します。また、フィルタが適用されている列には、マウスが列ヘッダ上に 置かれていないときでも、ヘッダにフィルタアイコンが表示されます。 【実行例】 値フィルタ+条件フィルタ( 値フィルタ+条件フィルタ(Default)) 465 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 条件フィルタ( 条件フィルタ(ByCondition)) ユーザーが“指定の値より大きい”、”指定の値を含む” といった条件を指定できる条件フィルタ 【実行例】 値フィルタ( 値フィルタ(ByValue)) ユーザーが表示する特定の値を選択できる値フィルタ 466 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 フィルタリングを許可しない( フィルタリングを許可しない(None)) Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' MDBファイルへの接続&データ取得(データセットの作成) Dim MDBFILE As String = "Nwind.mdbのパス名" Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + 467 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ";" Dim rs As String = "SELECT * FROM Customers" Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(rs, conn) Dim ds As DataSet = New DataSet() da.Fill(ds, "Customers") ' グリッドに接続します flex.DataSource = ds.Tables("Customers") ' グリッドのAllowFilteringプロパティをTrueに設定 flex.AllowFiltering = True ' 各列のAllowFilteringプロパティを設定 flex.Cols(1).AllowFiltering = C1.Win.C1FlexGrid.AllowFiltering.Default flex.Cols(2).AllowFiltering = C1.Win.C1FlexGrid.AllowFiltering.ByCondition flex.Cols(3).AllowFiltering = C1.Win.C1FlexGrid.AllowFiltering.ByValue flex.Cols(4).AllowFiltering = C1.Win.C1FlexGrid.AllowFiltering.None End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // MDBファイルへの接続&データ取得(データセットの作成) string MDBFILE = @"Nwind.mdbのパス名"; string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";"; string rs = "SELECT * FROM Customers"; System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(rs, conn); DataSet ds = new DataSet(); da.Fill(ds, " Customers "); // グリッドに接続します flex.DataSource = ds.Tables["Customers"]; // グリッドのAllowFilteringプロパティをTrueに設定 flex.AllowFiltering = true; // 各列のAllowFilteringプロパティを設定 flex.Cols[1].AllowFiltering = C1.Win.C1FlexGrid.AllowFiltering.Default; flex.Cols[2].AllowFiltering = C1.Win.C1FlexGrid.AllowFiltering.ByCondition; flex.Cols[3].AllowFiltering = C1.Win.C1FlexGrid.AllowFiltering.ByValue; flex.Cols[4].AllowFiltering = C1.Win.C1FlexGrid.AllowFiltering.None; } 注意: ユーザーによるフィルタリングの許可は、設計時にスマートタグの C1FlexGrid タスク や Column タスク メニュー からも設定できます。 任意の列でフィルタリングを禁止する場合は、AllowFiltering プロパティを None に設定します。 サンプルコードでは一般的なMDBサンプル(Nwind.mdb)の Customers テーブルに接続しています。実行の際 にはご利用の環境に適したパス名を設定する必要があります。 コードによりフィルタリングを適用する グリッドの AllowFiltering プロパティを True に変更した上で、ConditionFilter を作成し、フィルタ条件を指定します。ま た、ApplyFilters メソッドで作成したフィルタ条件をグリッドに適用します。 468 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' MDBファイルへの接続&データ取得(データセットの作成) Dim MDBFILE As String = "Nwind.mdbのパス名" Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";" Dim rs As String = "SELECT * FROM Customers" Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(rs, conn) Dim ds As DataSet = New DataSet() da.Fill(ds, "Customers") ' グリッドに接続します flex.DataSource = ds.Tables("Customers") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' グリッドのフィルタリングを有効にします flex.AllowFiltering = True ' 新しいConditionFilterを作成します Dim Filter = New C1.Win.C1FlexGrid.ConditionFilter() ' "C"で始まる要素を選択するフィルタを構成します Filter.Condition1.Operator = C1.Win.C1FlexGrid.ConditionOperator.BeginsWith Filter.Condition1.Parameter = "C" ' 新しいフィルタを"CustomerID"列に割り当てます flex.Cols("CustomerID").Filter = Filter ' フィルタ条件を適用します flex.ApplyFilters() End Sub C# コードの書き方 469 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C# private void Form1_Load(object sender, EventArgs e) { // MDBファイルへの接続&データ取得(データセットの作成) string MDBFILE = @"Nwind.mdbのパス名"; string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";"; string rs = "SELECT * FROM Customers"; System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(rs, conn); DataSet ds = new DataSet(); da.Fill(ds, " Customers "); // グリッドに接続します flex.DataSource = ds.Tables["Customers"]; } private void button1_Click(object sender, EventArgs e) { // グリッドのフィルタリングを有効にします flex.AllowFiltering = true; // 新しいConditionFilterを作成します C1.Win.C1FlexGrid.ConditionFilter Filter; Filter = new C1.Win.C1FlexGrid.ConditionFilter(); // "C"で始まる要素を選択するフィルタを構成します Filter.Condition1.Operator = C1.Win.C1FlexGrid.ConditionOperator.BeginsWith; Filter.Condition1.Parameter = "C"; // 新しいフィルタを"CustomerID"列に割り当てます flex.Cols["CustomerID"].Filter = Filter; // フィルタ条件を適用します flex.ApplyFilters(); } 注意: 任意の列でフィルタリングを禁止する場合は、AllowFiltering プロパティを None に設定します。 サンプルコードでは一般的なMDBサンプル(Nwind.mdb)の Customers テーブルに接続しています。実行の際 にはご利用の環境に適したパス名を設定する必要があります。 フィルタアイコンに独自のアイコンを表示する フィルタが適用されている列のヘッダに表示されるフィルタアイコンは、Glyphs プロパティで、GlyphEnum.FilteredColumn を指定して変更します。 【実行例】 470 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex(0, 1) = "苗字" flex(1, 1) = "山田" flex(2, 1) = "川田" flex(3, 1) = "尾田" flex(4, 1) = "竹中" flex(5, 1) = "皆藤" flex(6, 1) = "北島" flex(7, 1) = "小林" ' グリッドのフィルタリングを有効にします flex.AllowFiltering = True ' 新しいConditionFilterを作成します Dim Filter = New C1.Win.C1FlexGrid.ConditionFilter() ' "田"で終わる要素を選択するフィルタを構成します Filter.Condition1.Operator = C1.Win.C1FlexGrid.ConditionOperator.EndsWith Filter.Condition1.Parameter = "田" ' 新しいフィルタを1列目に割り当てます flex.Cols(1).Filter = Filter ' フィルタ条件を適用します flex.ApplyFilters() ' 独自のアイコンをフィルタアイコンに適用します flex.Glyphs(C1.Win.C1FlexGrid.GlyphEnum.FilteredColumn) = Image.FromFile("myBack.png") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { 471 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex[0, 1] = "苗字"; flex[1, 1] = "山田"; flex[2, 1] = "川田"; flex[3, 1] = "尾田"; flex[4, 1] = "竹中"; flex[5, 1] = "皆藤"; flex[6, 1] = "北島"; flex[7, 1] = "小林"; // グリッドのフィルタリングを有効にします flex.AllowFiltering = true; // 新しいConditionFilterを作成します C1.Win.C1FlexGrid.ConditionFilter Filter; Filter = new C1.Win.C1FlexGrid.ConditionFilter(); // 田"で終わる要素を選択するフィルタを構成します Filter.Condition1.Operator = C1.Win.C1FlexGrid.ConditionOperator.EndsWith; Filter.Condition1.Parameter = "田"; // 新しいフィルタを1列目に割り当てます flex.Cols["CustomerID"].Filter = Filter; // フィルタ条件を適用します flex.ApplyFilters(); // 独自のアイコンをフィルタアイコンに適用します flex.Glyphs[C1.Win.C1FlexGrid.GlyphEnum.FilteredColumn] = Image.FromFile("myBack.png"); } 注意: 注意:任意の列でフィルタリングを禁止する場合は、AllowFiltering プロパティを None に設定します。 フィルタボタンに独自のアイコンを表示する フィルタエディタを起動するフィルタボタンは、Glyphs プロパティで、GlyphEnum.FilterEditor を指定して変更します。 【実行例】 Visual Basic コードの書き方 472 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' MDBファイルへの接続&データ取得(データセットの作成) Dim MDBFILE As String = "Nwind.mdbのパス名" Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";" Dim rs As String = "SELECT * FROM Customers" Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(rs, conn) Dim ds As DataSet = New DataSet() da.Fill(ds, "Customers") ' グリッドに接続します flex.DataSource = ds.Tables("Customers") ' 独自のアイコンをフィルタボタンに適用します flex.Glyphs(C1.Win.C1FlexGrid.GlyphEnum.FilterEditor) = Image.FromFile("myNote.png") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // MDBファイルへの接続&データ取得(データセットの作成) string MDBFILE = @"Nwind.mdbのパス名"; string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";"; string rs = "SELECT * FROM Customers"; System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(rs, conn); DataSet ds = new DataSet(); da.Fill(ds, " Customers "); // グリッドに接続します flex.DataSource = ds.Tables["Customers"]; // 独自のアイコンをフィルタボタンに適用します flex.Glyphs[C1.Win.C1FlexGrid.GlyphEnum.FilterEditor] = Image.FromFile("myNote.png"); } 注意: フィルタボタンは、ユーザーが列ヘッダ上にマウスポインタを動かしたときに、ヘッダ上に表示されます。 任意の列でフィルタリングを禁止する場合は、AllowFiltering プロパティを None に設定します。 サンプルコードでは一般的なMDBサンプル(Nwind.mdb)の Customers テーブルに接続しています。実行の際 にはご利用の環境に適したパス名を設定する必要があります。 ソート ソートに関するタスクを紹介します。 ユーザーによるソートを許可する AllowSorting プロパティを AllowSortingEnum.SingleColumn(デフォルト) またはAllowSortingEnum.MultiColumn 473 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms に設定します。各列の AllowSorting プロパティを False にすることで、ユーザーが特定の列を基準にしたソートを不可にする ことができます。 【実行例】 Visual Basic コードの書き方 Visual Basic flex.AllowSorting = C1.Win.C1FlexGrid.AllowSortingEnum.SingleColumn C# コードの書き方 C# flex.AllowSorting = C1.Win.C1FlexGrid.AllowSortingEnum.SingleColumn; 注意: 注意:AllowSorting プロパティは、「C1FlexGrid タスク」や「Column タスク」からも設定できます。 関連項目 特定列でのソートを制限する 特定列でのソートを制限する 特定の列でソートを制限するには、デザイナまたはコードのいずれかで、AllowSorting プロパティを False に設定します。 【デザイナを使用する場合】 1. 編集するグリッドの列を選択します。その列の[列タスク 列タスク]メニューが開きます。 2. [ソートを有効にする ソートを有効にする]チェックボックスをオフにします。 474 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms または、C1FlexGrid 列エディタを使用して 列エディタを使用して、AllowSorting プロパティを設定することができます。 3. C1FlexGrid 列エディタを開きます。C1FlexGrid 列エディタにアクセスする方法について詳しくは、「列エディタにアクセ ス」を参照してください。 4. 右ペインから編集する列を選択し、左ペインで AllowSorting プロパティを False に設定します。 5. [OK]をクリックして、エディタを閉じます。 【コードを使用する場合】 次のコードを Form_Load イベントに追加して、[AtomicNumber]列のソートを制限します。 Visual Basic コードの書き方 Visual Basic flex.Cols("AtomicNumber").AllowSorting = False ' 同じです: flex.Cols(1).AllowEditing = False C# コードの書き方 C# flex.Cols["AtomicNumber"].AllowSorting = false; // 同じです: flex.Cols[1].AllowEditing = false; 475 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ソート順序について 連結モードと非連結モードでソート順序が異なります。 連結モード 連結モードの C1FlexGrid で列ヘッダをクリックされた際は、DataTable の DefaultView.Sort プロパティを設定した場合と同じ ソート順序になります。DefaultView.Sort プロパティの詳細については、MSDN を参照してください。 非連結モード 非連結モードの C1FlexGrid におけるソート順序は、下記のようになります。 String.Compare メソッドに準拠 現在のカルチャを使用し、大文字と小文字は区別します。 非連結モードのソート例 ソート前 ソート後(昇順) 注意: 注意:カスタムソートを実装する方法については、SortNulls サンプルを参照してください。 ソート処理を無効にする C1FlexGrid を連結モードで使用している場合は、グリッドのソート条件を消去(DefaultView.Sort プロパティに空文字を設 定)することで行ったソート処理を無効にします。ソート条件を消去した場合、グリッドの表示もソートされていない状態に戻りま す(ソート条件のみをクリアし、グリッド上の表示順序は変更しないといった機能は用意されていません)。 注意: 注意:連結モードの C1FlexGrid では、一旦ソートを行うとソート条件がグリッドに残ります。そのため、ソートを行ったキー 列のデータを変更した場合、編集終了後(ValidateEdit やAfterEdit イベントが発生した後)、他のセルにカレントセルを 移動した際などに、変更後のデータで再ソートされます。この動作は、FlexGrid for WinForms の仕様です。 476 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 1. DataTable を作成してグリッドに連結します。たとえば、次のコードを入力し、9人の顧客から成るテーブルを作成し てC1FlexGrid に連結します。 Visual Basic コードの書き方 Visual Basic Dim CustTable As DataTable Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' DataTable を作成します。 CustTable = New DataTable("Customers") ' 列を DataTable に追加します。 CustTable.Columns.Add("顧客ID", GetType(Int32)) CustTable.Columns.Add("姓", GetType(String)) ' 行を DataTable に追加します。 Dim CustRow As DataRow For i As Integer = 1 To 9 CustRow = CustTable.NewRow() CustRow(0) = i CustRow(1) = "姓" & i.ToString() CustTable.Rows.Add(CustRow) Next ' DataTable に連結します。 flex.DataSource = CustTable End Sub C# コードの書き方 C# DataTable CustTable; private void Form1_Load(object sender, EventArgs e) { // DataTable を作成します。 CustTable = new DataTable("Customers"); // 列を DataTable に追加します。 CustTable.Columns.Add("顧客ID", typeof(Int32)); CustTable.Columns.Add("姓", typeof(string)); // 行を DataTable に追加します。 DataRow CustRow; for (int i = 1; i <= 9; i++) { CustRow = CustTable.NewRow(); CustRow[0] = i; CustRow[1] = "姓" + i.ToString(); CustTable.Rows.Add(CustRow); } // DataTable に連結します。 flex.DataSource = CustTable; } グリッドは次のような外観になります。 477 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 2. クリックされたときテーブルのソートを元に戻すボタンを作成します。次のコードを Button1_Click イベントに追加しま す。 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click CustTable.DefaultView.Sort = "" End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { CustTable.DefaultView.Sort = ""; } 注意: 注意:DataTable.DefaultView は DataTable の DataView を返します。ソート文字列を null に設定すると、DataView は 直前のソートを元に戻します。 【実行例】 「姓」列を降順にソートします。 478 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 〈ソートを元に戻す ソートを元に戻す〉ボタンをクリックします。ソートは元に戻ります。 なお、(列ヘッダに表示されている)ソート方向を示すインジケータのみを消去したい場合は、ShowSort プロパティを False に 設定してアイコンを非表示にするか、ShowSortAt メソッドを使用します。ShowSort プロパティを False に設定した場合は、 再度ソートを行ってもアイコンは表示されなくなりますので、注意してください。非連結モードのグリッドでも使用可能です。 関連項目 インジケータを非表示にする コードによりソートする Sort メソッドを使用します。ソート方法は、SortFlags 列挙体 列挙体で指定します。複数のソート方法を同時に設定する場合は、Or (C# では ”|”)を使用します。 【実行例】 479 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex(1, 1) = "AAA" flex(2, 1) = "bbb" flex(3, 1) = "aaa" flex(4, 1) = "BBB" ' 1列目をソート:降順、大文字と小文字を無視する flex.Sort(C1.Win.C1FlexGrid.SortFlags.Descending Or C1.Win.C1FlexGrid.SortFlags.IgnoreCase, 1) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex[1, 1] = "AAA"; flex[2, 1] = "bbb"; flex[3, 1] = "aaa"; flex[4, 1] = "BBB"; // 1列目をソート:降順、大文字と小文字を無視する flex.Sort(C1.Win.C1FlexGrid.SortFlags.Descending } 複数列のソートを実行する 複数列をソートするには、各列の Sort プロパティを設定し、Sort メソッドを使用して列設定に基づいてソートします。 1. Form_Load イベントに以下のコードを追加し、1列目の列を昇順で、2列目の列を降順でソートするように設定します。 Visual Basic コードの書き方 480 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic flex.Cols(1).Sort = C1.Win.C1FlexGrid.SortFlags.Ascending flex.Cols(2).Sort = C1.Win.C1FlexGrid.SortFlags.Descending C# コードの書き方 C# flex.Cols(1).Sort = C1.Win.C1FlexGrid.SortFlags.Ascending; flex.Cols(2).Sort = C1.Win.C1FlexGrid.SortFlags.Descending; 2. 次の Sort メソッドを追加し、列1と列2の設定に基づいてソートします。 Visual Basic コードの書き方 Visual Basic flex.Sort(C1.Win.C1FlexGrid.SortFlags.UseColSort, 1, 2) C# コードの書き方 C# flex.Sort(C1.Win.C1FlexGrid.SortFlags.UseColSort, 1, 2); 【実行例】 [Order Details]テーブル例 グリッドは、以下のように、1列目の列が昇順で、2列目列が降順でソートされた外観になります。この例では、グリッドはま ず、OrderID 列に基づいて昇順ソートされ、次に、ProductID 列に基づいて降順ソートされます。 インジケータを明示的に表示する 列ヘッダ部分にソートインジケータを表示するには、ShowSortAt メソッドを使用します。 注意: 481 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ShowSortAt メソッドを使用してソートインジケータを表示してもソートは実行されません。 ソートインジケータが表示されるのは1列のみです。複数列に対してインジケータを表示することはできません。 【実行例】 1列目にソートインジケータを表示(ソートは未実行) Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex(1, 1) = "444" flex(2, 1) = "222" flex(3, 1) = "333" flex(4, 1) = "111" ' 1列目に降順のソートインジケータを表示 ' ソートは実行されません flex.ShowSortAt(C1.Win.C1FlexGrid.SortFlags.Descending, 1) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex[1, 1] = "444"; flex[2, 1] = "222"; flex[3, 1] = "333"; flex[4, 1] = "111"; // 1列目に降順のソートインジケータを表示 // ソートは実行されません flex.ShowSortAt(C1.Win.C1FlexGrid.SortFlags.Descending, 1); } 482 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms インジケータを非表示にする ShowSort プロパティを False に設定します。 注意: 注意:ShowSort プロパティを使用してソートインジケータを非表示にしてもソートは無効になりません。 【実行例】 ソートは実行されていますが、インジケータは非表示になります。 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex(1, 1) = "111" flex(2, 1) = "222" flex(3, 1) = "333" flex(4, 1) = "444" ' 1列目をソート:降順 flex.Sort(C1.Win.C1FlexGrid.SortFlags.Descending, 1) ' ソートインジケータを非表示にする flex.ShowSort = False End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex[1, 1] = "111"; flex[2, 1] = "222"; flex[3, 1] = "333"; flex[4, 1] = "444"; 483 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // 1列目をソート:降順 flex.Sort(C1.Win.C1FlexGrid.SortFlags.Descending, 1); // ソートインジケータを非表示にする flex.ShowSort = false; } インジケータに独自のアイコンを表示する Glyphs プロパティで、昇順のインジケータはGlyphEnum.Ascending を、降順のインジケータはGlyphEnum.Descending を指定して変更します。 【実行例】 降順のソートインジケータを変更 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex(1, 1) = "111" flex(2, 1) = "222" flex(3, 1) = "333" flex(4, 1) = "444" ' 1列目をソート:降順 flex.Sort(C1.Win.C1FlexGrid.SortFlags.Descending, 1) ' 降順のインジケータを変更 flex.Glyphs(C1.Win.C1FlexGrid.GlyphEnum.Descending) = Image.FromFile("back.gif") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) 484 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms { flex[1, 1] = "111"; flex[2, 1] = "222"; flex[3, 1] = "333"; flex[4, 1] = "444"; // 1列目をソート:降順 flex.Sort(C1.Win.C1FlexGrid.SortFlags.Descending, 1); // 降順のインジケータを変更 flex.Glyphs[C1.Win.C1FlexGrid.GlyphEnum.Descending] = Image.FromFile("back.gif"); } データ連結 データ連結に関するタスクを紹介します。 非連結列を追加する C1FlexGrid を連結モードで使用している場合、連結しているデータソースのデータがグリッドに表示されます。しかし、この場 合でもデータソースに存在しない列を使ってデータを表示したいことがあります。このような場合には、非連結列を使用します。 非連結列は、グリッドにデータソースを連結した後に、デザイン時またはコードにより追加します。非連結列のデータは連結し ているデータソースにないため、GetUnboundValue イベントやOwnerDrawCell イベントを使用して非連結列にデータを表 示する必要ガあります。 注意: 非連結列の使用方法については、UnboundColumnsサンプル サンプルも参照してください。 サンプルコードでは一般的なMDBサンプル(Nwind.mdb)の Employees テーブルに接続しています。実行の際 にはご利用の環境に適したパス名を設定する必要があります。 【実行例】 Employees テーブル Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 485 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Handles MyBase.Load ' MDBファイルへの接続&データ取得(データセットの作成) Dim MDBFILE As String = "Nwind.mdbのパス名" Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";" Dim rs As String = "SELECT FirstName, LastName FROM Employees" Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(rs, conn) Dim ds As DataSet = New DataSet() da.Fill(ds, "Employees") ' グリッドに接続します flex.DataSource = ds.Tables("Employees") ' 非連結列を追加 Dim col As C1.Win.C1FlexGrid.Column = flex.Cols.Add() col.Name = "FullName" col.Caption = "FullName(Unbound)" ' 変更を許可しません col.AllowEditing = False flex.AutoSizeCol(3) End Sub Private Sub flex_GetUnboundValue(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.UnboundValueEventArgs) Handles flex.GetUnboundValue If e.Row >= flex.Rows.Fixed Then ' "FullName"列(非連結列)の値を設定します If flex.Cols(e.Col).Name = "FullName" Then e.Value = flex(e.Row, "FirstName") + " " + flex(e.Row, "LastName") End If End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // MDBファイルへの接続&データ取得(データセットの作成) string MDBFILE = @"Nwind.mdbのパス名"; string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";"; string rs = "SELECT FirstName, LastName FROM Employees"; System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(rs, conn); DataSet ds = new DataSet(); da.Fill(ds, "Employees"); // グリッドに接続します flex.DataSource = ds.Tables["Employees"]; // 非連結列を追加 C1.Win.C1FlexGrid.Column col = flex.Cols.Add(); col.Name = "FullName"; col.Caption = "FullName(Unbound)"; // 変更を許可しません col.AllowEditing = false; flex.AutoSizeCol(3); } 486 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms private void flex_GetUnboundValue(object sender, C1.Win.C1FlexGrid.UnboundValueEventArgs e) { if(e.Row >= flex.Rows.Fixed) { // "FullName"列(非連結列)の値を設定します if(flex.Cols[e.Col].Name == "FullName") { e.Value = flex[e.Row, "FirstName"] + " " + flex[e.Row, "LastName"]; } } } 非連結列の入力を許可する ユーザーに非連結列の入力(更新)を許可する場合、SetUnboundValue イベントでユーザーが非連結列に入力(更新)した データを取得し、GetUnboundValue イベントで更新されたデータを表示する必要があります。下記のサンプルコードでは、 HashTable オブジェクトを使用して非連結列に表示するデータを保持しています。 注意: 注意:非連結列の使用方法については、UnboundColumnsサンプル サンプルも参照してください。 【実行例】 Visual Basic コードの書き方 Visual Basic ' 非連結列の値を保持する Hashtable Dim _hash As New Hashtable() Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' DataTableオブジェクトを作成 Dim dt As New DataTable() dt.Columns.Add("背番号", GetType(Integer)) dt.Columns.Add("選手名", GetType(String)) 487 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Dim dtRow As DataRow dtRow = dt.NewRow dtRow("背番号") = 10 dtRow("選手名") = "財前" dt.Rows.Add(dtRow) ' DataTableを連結(連結モード) flex.DataSource = dt flex.AllowAddNew = True ' 非連結列を追加 Dim col As C1.Win.C1FlexGrid.Column = flex.Cols.Add() col.Name = "得点" col.Caption = "得点(Unbound)" ' 非連結列に表示する初期値 _hash(10) = "11" End Sub ' "背番号"の値をキーにして、 ' Hashtable からデータを取得し、非連結列に表示 Private Sub flex_GetUnboundValue(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.UnboundValueEventArgs) Handles flex.GetUnboundValue Dim drv As DataRowView = CType(flex.Rows(e.Row).DataSource, DataRowView) e.Value = _hash(drv("背番号")) End Sub ' "背番号"の値をキーにして、 ' 非連結列上に表示されているデータを Hashtable に保存 Private Sub flex_SetUnboundValue(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.UnboundValueEventArgs) Handles flex.SetUnboundValue Dim drv As DataRowView = CType(flex.Rows(e.Row).DataSource, DataRowView) _hash(drv("背番号")) = e.Value End Sub C# コードの書き方 C# // 非連結列の値を保持する Hashtable System.Collections.Hashtable _hash = new System.Collections.Hashtable(); private void Form1_Load(object sender, EventArgs e) { // DataTableオブジェクトを作成 DataTable dt = new DataTable(); dt.Columns.Add("背番号", typeof(int)); dt.Columns.Add("選手名", typeof(string)); DataRow dtRow; dtRow = dt.NewRow(); dtRow["背番号"] = 10; dtRow["選手名"] = "財前"; dt.Rows.Add(dtRow); // DataTableを連結(連結モード) flex.DataSource = dt; flex.AllowAddNew = true; // 非連結列を追加 C1.Win.C1FlexGrid.Column col = flex.Cols.Add(); col.Name = col.Caption = "得点"; 488 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // 非連結列に表示する初期値 _hash[10] = "11"; } // "背番号"の値をキーにして、 // Hashtable からデータを取得し、非連結列に表示 private void flex_GetUnboundValue(object sender, C1.Win.C1FlexGrid.UnboundValueEventArgs e) { DataRowView drv = (DataRowView)flex.Rows[e.Row].DataSource; e.Value = _hash[drv["背番号"]]; } // "背番号"の値をキーにして、 // 非連結列上に表示されているデータを Hashtable に保存 private void flex_SetUnboundValue(object sender, C1.Win.C1FlexGrid.UnboundValueEventArgs e) { DataRowView drv = (DataRowView)flex.Rows[e.Row].DataSource; _hash[drv["背番号"]] = e.Value; } 固定列にデータを表示する C1FlexGrid を連結(バウンド)モードで使用する場合、固定列に特定のフィールドを連結して表示する機能は用意されていま せん。連結しているデータは、通常の列から表示されます。そのため、下記2通りの方法で対応してください。 注意: 注意:サンプルコードでは一般的なMDBサンプル(Nwind.mdb)の Customers テーブルに接続しています。実行の際に はご利用の環境に適したパス名を設定する必要があります。 固定列にデータをコピーする 固定列にデータをコピーして対応します。例えば、グリッドの固定列が1でデータソースと連結している場合、連結後に1列目 (データソースの最初の列)の値を0列目(固定列)にコピーします。また、コピーした1列目は非表示にすることで固定列が連結 されているように表示されます。 【実行例 Customers テーブル 489 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' MDBファイルへの接続&データ取得(データセットの作成) Dim MDBFILE As String = "Nwind.mdbのパス名" Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";" Dim rs As String = "SELECT * FROM Customers" Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(rs, conn) Dim ds As DataSet = New DataSet() da.Fill(ds, "Customers") ' 連結モード ' グリッドに接続します flex.DataSource = ds.Tables("Customers") ' 固定列に表示したいデータをコピーします For i As Integer = 0 To flex.Rows.Count - 1 flex(i, 0) = flex(i, 1) Next ' 固定列に表示した列は非表示 flex.Cols(1).Visible = False End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // MDBファイルへの接続&データ取得(データセットの作成) string MDBFILE = @"Nwind.mdbのパス名"; string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";"; string rs = "SELECT * FROM Customers"; System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(rs, conn); DataSet ds = new DataSet(); da.Fill(ds, "Customers"); // 連結モード // グリッドに接続します flex.DataSource = ds.Tables["Customers"]; // 固定列に表示したいデータをコピーします for (int i = 0; i < flex.Rows.Count; i++) { flex[i, 0] = flex[i, 1]; } // 固定列に表示した列は非表示 flex.Cols[1].Visible = false; } 静止列を使用する 490 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 固定列の代わりに静止列を使用します。スタイルを固定列と同様にすることで静止列を固定列のように使用します。 【実行例 Customers テーブル Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' MDBファイルへの接続&データ取得(データセットの作成) Dim MDBFILE As String = "Nwind.mdbのパス名" Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";" Dim rs As String = "SELECT * FROM Customers" Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(rs, conn) Dim ds As DataSet = New DataSet() da.Fill(ds, "Customers") ' 連結モード ' グリッドに接続します flex.DataSource = ds.Tables("Customers") ' 固定列は0 flex.Cols.Fixed = 0 ' 静止列を使用 flex.Cols.F2rozen = 1 ' 編集を不可に設定 flex.Cols(0).AllowEditing = False ' 静止セルのスタイルを設定 flex.Styles.Frozen.BackColor = flex.Styles.Fixed.BackColor End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) 491 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms { // MDBファイルへの接続&データ取得(データセットの作成) string MDBFILE = @"Nwind.mdbのパス名"; string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";"; string rs = "SELECT * FROM Customers"; System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(rs, conn); DataSet ds = new DataSet(); da.Fill(ds, "Customers"); // 連結モード // グリッドに接続します flex.DataSource = ds.Tables["Customers"]; // 固定列は0 flex.Cols.Fixed = 0; // 静止列を使用 flex.Cols.Frozen = 1; // 編集を不可に設定 flex.Cols[0].AllowEditing = false; // 静止セルのスタイルを設定 flex.Styles.Frozen.BackColor = flex.Styles.Fixed.BackColor; } フィールドにビットマップイメージを表示する ビットマップイメージ(OLE オブジェクト型)のフィールド連結時にイメージを表示させたい場合は、バイト配列であるデータを適 切に処理したうえでオーナー描画の機能を使用して表示する必要があります。 注意: ビットマップイメージの表示方法については、DBImagesサンプル サンプルも参照してください。 サンプルコードでは一般的なMDBサンプル(Nwind.mdb)の Employees テーブルに接続しています。実行の際 にはご利用の環境に適したパス名を設定する必要があります。 MemoryStream クラスなどの詳細は、MSDN を参照してください。 【実行例】 Employees テーブル 492 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' MDBファイルへの接続&データ取得(データセットの作成) Dim MDBFILE As String = "Nwind.mdbのパス名" Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";" Dim rs As String = "SELECT Photo, FirstName, LastName, Country, City, Address FROM Employees" Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(rs, conn) Dim ds As DataSet = New DataSet() da.Fill(ds, "Employees") ' グリッドに接続します flex.DataSource = ds.Tables("Employees") ' "Photo"列を表示し、編集不可に設定します flex.Cols("Photo").Visible = True flex.Cols("Photo").AllowEditing = False flex.Cols("Photo").ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.Scale ' 画像を表示するために、行の高さなどを調整します Dim hei As Integer = flex.Rows.DefaultSize flex.Rows.DefaultSize = hei * 4 flex.Rows(0).Height = hei flex.Cols(0).Width = 20 flex.Cols(1).Width = 60 ' OwnerDrawCellイベントを発生させます flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw End Sub Private Sub flex_OwnerDrawCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles flex.OwnerDrawCell If e.Row >= flex.Rows.Fixed Then ' "Photo"列:画像はバイト配列としてデータベースに格納されています If flex.Cols(e.Col).Name = "Photo" Then ' 画像をロードします e.Image = LoadImage(flex(e.Row, e.Col)) ' 画像を取得できた場合は、TextはNullにします If Not (e.Image Is Nothing) Then e.Text = Nothing End If End If End If End Sub Function LoadImage(ByVal picData() As Byte) As Image ' オブジェクトを確認します Const bmData As Integer = 78 If picData Is Nothing Or picData.Length < bmData + 2 Then Return Nothing End If If picData(0) <> &H15 Or picData(1) <> &H1C Then Return Nothing 493 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms End If ' Bitmapのみを処理します ' 画像をロードします Dim img As Image = Nothing Try Dim ms As New IO.MemoryStream(picData, bmData, picData.Length - bmData) img = Image.FromStream(ms) Catch End Try Return img End Function C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // MDBファイルへの接続&データ取得(データセットの作成) string MDBFILE = @"Nwind.mdbのパス名"; string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";"; string rs = "SELECT Photo, FirstName, LastName, Country, City, Address FROM Employees"; System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(rs, conn); DataSet ds = new DataSet(); da.Fill(ds, "Employees"); // グリッドに接続します flex.DataSource = ds.Tables["Employees"]; // "Photo"列を表示し、編集不可に設定します flex.Cols["Photo"].Visible = true; flex.Cols["Photo"].AllowEditing = false; flex.Cols["Photo"].ImageAlign = C1.Win.C1FlexGrid.ImageAlignEnum.Scale; // 画像を表示するために、行の高さなどを調整します int hei = flex.Rows.DefaultSize; flex.Rows.DefaultSize = hei * 4; flex.Rows[0].Height = hei; flex.Cols[0].Width = 20; flex.Cols[1].Width = 60; // OwnerDrawCellイベントを発生させます flex.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw; } private void flex_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e) { if (e.Row >= flex.Rows.Fixed) { // "Photo"列:画像はバイト配列としてデータベースに格納されています if (flex.Cols[e.Col].Name == "Photo") { // 画像をロードします e.Image = LoadImage(flex[e.Row, e.Col] as byte[]); // 画像を取得できた場合は、TextはNullにします 494 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms if (e.Image != null) e.Text = null; } } } Image LoadImage(byte[] picData) { // オブジェクトを確認します const int bmData = 78; if (picData == null || picData.Length < bmData + 2) return null; if (picData[0] != 0x15 | // Bitmap のみを処理します if (picData[bmData] != 'B' | // 画像をロードします Image img = null; try { System.IO.MemoryStream ms = new System.IO.MemoryStream(picData, bmData, picData.Length - bmData); img = Image.FromStream(ms); } catch { } return img; } 自動で列幅を調整する グリッドとデータソースを連結する前に、C1FlexGridBase.AutoResize プロパティを True (デフォルト)に設定します。 AutoResize プロパティは、データのロード時に列幅を自動的に調節するかどうかを決定します。 注意: 注意:サンプルコードでは一般的なMDBサンプル(Nwind.mdb)の Customers テーブルに接続しています。実行の際に はご利用の環境に適したパス名を設定する必要があります。 【実行例】 Customers テーブル 列幅の自動調整 495 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 【実行例】 Customers テーブル 列幅の自動調整なし Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' MDBファイルへの接続&データ取得(データセットの作成) Dim MDBFILE As String = "Nwind.mdbのパス名" Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";" Dim rs As String = "SELECT * FROM Customers" Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(rs, conn) Dim ds As DataSet = New DataSet() da.Fill(ds, "Customers") ' 列幅の自動調節機能を使用 flex.AutoResize = True ' グリッドに接続します flex.DataSource = ds.Tables("Customers") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // MDBファイルへの接続&データ取得(データセットの作成) string MDBFILE = @"Nwind.mdbのパス名"; string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";"; string rs = "SELECT * FROM Customers"; System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(rs, conn); DataSet ds = new DataSet(); da.Fill(ds, "Customers"); 496 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // 列幅の自動調節機能を使用 flex.AutoResize = true; // グリッドに接続します flex.DataSource = ds.Tables["Customers"]; } 印刷 印刷に関するタスクを紹介します。 印刷(プレビュー)を実行する PrintGrid メソッドを使用します。印刷プレビューを表示する場合は、引数に PrintGridFlags.ShowPreviewDialog を指定し ます。複数の印刷オプションを同時に設定する場合は、Or (C# では ”|”)を使用します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 印刷プレビュー+FitToPage flex.PrintGrid("C1FlexGrid", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog Or C1.Win.C1FlexGrid.PrintGridFlags.FitToPage) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) 497 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms { // 印刷プレビュー+FitToPage flex.PrintGrid("C1FlexGrid", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog } ページ範囲を指定して印刷する PrintRange プロパティに SomePages を設定した上で、FromPage/ /ToPage プロパティを設定します。 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 2ページ目から3ページ目を印刷 With flex.PrintParameters.PrintDocument.PrinterSettings .PrintRange = Printing.PrintRange.SomePages .MaximumPage = Short.MaxValue .MinimumPage = 1 .FromPage = 2 .ToPage = 3 End With flex.PrintGrid("C1FlexGrid", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // 2ページ目から3ページ目を印刷 flex.PrintParameters.PrintDocument.PrinterSettings.PrintRange = System.Drawing.Printing.PrintRange.SomePages; flex.PrintParameters.PrintDocument.PrinterSettings.MaximumPage = short.MaxValue; flex.PrintParameters.PrintDocument.PrinterSettings.MinimumPage = 1; flex.PrintParameters.PrintDocument.PrinterSettings.FromPage = 2; flex.PrintParameters.PrintDocument.PrinterSettings.ToPage = 3; flex.PrintGrid("TEST", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog); } 注意: 注意:PrintRange や FromPage/ToPage プロパティの詳細は、MSDN を参照してください。 印刷ページの余白を設定する PrintGrid メソッドにて印刷を行う前に、DefaultPageSettings.Margins プロパティを使用してマージンを設定しま す。Margins クラスは、.NET Framework の Margins クラスと同様になりますので、各余白を 1/100 インチ単位で取得または 設定します。 【実行例】 498 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 印刷マージンを設定します(1.5インチ)。 With flex.PrintParameters.PrintDocument.DefaultPageSettings .Margins.Top = 150 .Margins.Bottom = 150 '.Margins = New System.Drawing.Printing.Margins(100, 100, 150, 150) End With flex.PrintGrid("C1FlexGrid", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog Or _ C1.Win.C1FlexGrid.PrintGridFlags.ShowPageSetupDialog) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // 印刷マージンを設定します(1.5インチ)。 flex.PrintParameters.PrintDocument.DefaultPageSettings.Margins.Top = 150; flex.PrintParameters.PrintDocument.DefaultPageSettings.Margins.Bottom = 150; //flex.PrintParameters.PrintDocument.DefaultPageSettings.Margins = //new System.Drawing.Printing.Margins(100, 100, 150, 150); flex.PrintGrid("TEST", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog | 499 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms C1.Win.C1FlexGrid.PrintGridFlags.ShowPageSetupDialog); } 注意: 注意:Margins クラスの詳細は、MSDN を参照してください。 印刷ヘッダ/フッタを設定する 印刷ヘッダ/フッタは、PrintGrid メソッドの引数で指定します。 また、印刷ヘッダおよびフッタ文字列は、タブ記号で左右位置(左揃え、中央揃え、右揃え)を、改行コードで行を設定します。設 定する順番に注意してください。まず、左揃えにしたい行を設定します。改行コードを設定することで任意の行を左揃えに設定 できます。次に、タブ記号を追加し、中央揃えにしたい行を設定します。中央揃えにしたい行も改行コードを設定することで任 意の行を中央揃えに設定できます。最後に、タブ記号をもう1つ追加し、右揃えにしたい行を設定します。同様に改行コードを 設定することで任意の行を右揃えに設定することが可能です。 フォントは、PrintParameters.HeaderFont/ /FooterFont プロパティで変更します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click flex.PrintGrid("C1FlexGrid", _ C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog, _ vbCrLf + "2行目(ヘッダ左揃え)" + _ vbTab + "1行目(ヘッダ中央揃え)" + _ vbCrLf + vbCrLf + vbCrLf + "4行目(ヘッダ中央揃え)" + _ vbTab + vbCrLf + vbCrLf + "3行目(ヘッダ右揃え)", _ vbCrLf + "2行目(フッタ左揃え)" + _ vbTab + "1行目(フッタ中央揃え)" + _ vbTab + vbCrLf + vbCrLf + "3行目(フッタ右揃え)") 500 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { flex.PrintGrid("C1FlexGrid", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog, "\n" + "2行目(ヘッダ左揃え)" + "\t" + "1行目(ヘッダ中央揃え)" + "\n" + "\n" + "\n" + "4行目(ヘッダ中央揃え)" + "\t" + "\n" + "\n" + "3行目(ヘッダ右揃え)", "\n" + "2行目(フッタ左揃え)" + "\t" + "1行目(フッタ中央揃え)" + "\t" + "\n" + "\n" + "3行目(フッタ右揃え)"); } 印刷フッタにページ番号を出力する 現在のページ番号とページ総数は、プレースホルダ({0} と {1})を使用して出力します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 印刷ヘッダ/フッタのフォント変更 flex.PrintParameters.HeaderFont = New Font("メイリオ", 14, FontStyle.Bold) flex.PrintParameters.FooterFont = New Font("メイリオ", 20, FontStyle.Italic) ' フッタにページ番号/ページ総数を表示 501 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.PrintGrid("C1FlexGrid", _ C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog, _ "ヘッダ", vbTab + "ページ {0} / {1}") End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // 印刷ヘッダ/フッタのフォント変更 flex.PrintParameters.HeaderFont = new Font("メイリオ", 14, FontStyle.Bold); flex.PrintParameters.FooterFont = new Font("メイリオ", 20, FontStyle.Italic); // フッタにページ番号/ページ総数を表示 flex.PrintGrid("C1FlexGrid", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog, "ヘッダ", "\t" + "ページ {0} / {1}"); } ページごとに印刷ヘッダ(フッタ)を設定する PrintPage イベントを使用して、GridPrinterHeader(GridPrinterFooter)プロパティを動的に変更することで、ページごとに印 刷ヘッダ(フッタ)を変更することができます。PrintPage イベントは「グリッドがページの出力を終了した後に発生」するた め、PrintPage イベントで設定したヘッダやフッタは次のページに反映される点に注意してください。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 印刷ヘッダの設定(1ページ目はこの設定で印刷される) flex.PrintParameters.Header = "ページヘッダ:印刷1枚目" flex.PrintParameters.HeaderFont = New Font("メイリオ", 10) flex.PrintParameters.Footer = "Page {0} of {1}" 502 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.PrintGrid("C1FlexGrid", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog) End Sub ' 1ページ目が印刷された後、以降繰り返し発生 Private Sub flex_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles flex.PrintPage ' ヘッダを動的に変更 Dim gp As C1.Win.C1FlexGrid.GridPrinter gp = flex.PrintParameters gp.Header = "ページヘッダ:印刷" & gp.PageNumber + 1 & "枚目" Select Case gp.PageNumber Case 1 gp.HeaderFont = New Font("メイリオ", 10, FontStyle.Bold) Case 2 gp.HeaderFont = New Font("メイリオ", 10, FontStyle.Italic) Case Else gp.HeaderFont = New Font("メイリオ", 10, FontStyle.Underline) End Select End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // 印刷ヘッダの設定(1ページ目はこの設定で印刷される) flex.PrintParameters.Header = "ページヘッダ:印刷1枚目"; flex.PrintParameters.HeaderFont = new Font("MS ゴシック", 10); flex.PrintParameters.Footer = "Page {0} of {1}"; flex.PrintGrid("TEST", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog); } // 1ページ目が印刷された後、以降繰り返し発生 private void flex_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { // ヘッダを動的に変更 C1.Win.C1FlexGrid.GridPrinter gp; gp = flex.PrintParameters; gp.Header = "ページヘッダ:印刷" + (gp.PageNumber + 1) + "枚目"; switch (gp.PageNumber) { case 1: gp.HeaderFont = new Font("MS ゴシック", 10, FontStyle.Bold); break; case 2: gp.HeaderFont = new Font("MS ゴシック", 10, FontStyle.Italic); break; default: gp.HeaderFont = new Font("MS ゴシック", 10, FontStyle.Underline); break; } } 503 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 用紙サイズを指定する コードから印刷する用紙サイズを設定する場合は、PrintDocument クラスを使用します。PrintDocument クラスは .NET Framework の一部で、System.Drawing.Printing 名前空間で定義され、このクラスには、文書のページ設定およびプリンタ設 定を指定するプロパティが含まれます。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim flag As Boolean = False Dim paperSize As System.Drawing.Printing.PaperSize With flex.PrintParameters.PrintDocument For Each paperSize In .PrinterSettings.PaperSizes ' 印刷可能な用紙サイズを確認 Debug.WriteLine(paperSize) If paperSize.Kind = Printing.PaperKind.B4 Then ' 用紙サイズを指定します .DefaultPageSettings.PaperSize = paperSize ' 横向きにします .DefaultPageSettings.Landscape = True flag = True End If Next End With 504 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms If flag = True Then Debug.WriteLine("指定の用紙がありました。") Else Debug.WriteLine("指定の用紙がありませんでした。") End If ' 印刷プレビュー + ページ設定ダイアログ flex.PrintGrid("C1FlexGrid", _ C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog Or _ C1.Win.C1FlexGrid.PrintGridFlags.ShowPageSetupDialog) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { bool flag = false; foreach (System.Drawing.Printing.PaperSize paperSize in flex.PrintParameters.PrintDocument.PrinterSettings.PaperSizes) { // 印刷可能な用紙サイズを確認 Console.WriteLine(paperSize); if (paperSize.Kind == System.Drawing.Printing.PaperKind.B4) { // 用紙サイズを指定します flex.PrintParameters.PrintDocument .DefaultPageSettings.PaperSize = paperSize; // 横向きにします flex.PrintParameters.PrintDocument .DefaultPageSettings.Landscape = true; flag = true; } } if (flag == true) { Console.WriteLine("指定の用紙がありました。"); } else { Console.WriteLine("指定の用紙がありませんでした。"); } // 印刷プレビュー + ページ設定ダイアログ flex.PrintGrid("C1FlexGrid", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog | C1.Win.C1FlexGrid.PrintGridFlags.ShowPageSetupDialog); } 注意: 注意:PrintDocument クラス(System.Drawing.Printing)の詳細は、MSDN を参照してください。 コントロールの境界線を表示せずに印刷する 505 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms 組み込みスタイルEmptyArea の境界線のスタイルを None に設定します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 印刷時のグリッドの枠線を非表示 flex.Styles.EmptyArea.Border.Style = C1.Win.C1FlexGrid.BorderStyleEnum.None ' 印刷プレビュー flex.PrintGrid("C1FlexGrid", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog) ' グリッドの枠線を元に戻します flex.Styles.EmptyArea.Clear(C1.Win.C1FlexGrid.StyleElementFlags.Border) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // 印刷時のグリッドの枠線を非表示 flex.Styles.EmptyArea.Border.Style = C1.Win.C1FlexGrid.BorderStyleEnum.None; // 印刷プレビュー flex.PrintGrid("C1FlexGrid", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog); // グリッドの枠線を元に戻します flex.Styles.EmptyArea.Clear(C1.Win.C1FlexGrid.StyleElementFlags.Border); } 印刷プレビュー画面を最大化して表示する WindowState プロパティを Maximized に設定することで、印刷プレビュー画面を最大化して表示します。(Minimized に設 定した場合は最小化して表示) 506 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 最大化 flex.PrintParameters.PrintPreviewDialog.WindowState = FormWindowState.Maximized ' 印刷プレビューを表示 flex.PrintGrid("C1FlexGrid", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // 最大化 flex.PrintParameters.PrintPreviewDialog.WindowState = FormWindowState.Maximized; // 印刷プレビューを表示 flex.PrintGrid("C1FlexGrid", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog); } 注意: 注意:WindowState プロパティの詳細は、MSDN を参照してください。 印刷プレビュー画面をカスタマイズする C1FlexGrid における印刷処理は独自のものではなく、.NET Framework によって提供されている各印刷処理を用いてその機 能を実現しています。そのため、PrintPreviewDialog プロパティからグリッドの印刷プレビューの表示に使用される PrintPreviewDialog への参照を取得し各設定を変更することで、カスタマイズした印刷プレビュー画面を表示できます。 【実行例】 デフォルト 【実行例】 カスタマイズ 507 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 印刷プレビューに使用するPrintPreviewDialogを取得 Dim pi As PrintPreviewDialog = flex.PrintParameters.PrintPreviewDialog ' キャプションを設定 pi.Text = "カスタマイズされたプレビュー画面" ' Iconを変更 Dim.png As Bitmap = Image.FromFile("printer.gif") pi.Icon = System.Drawing.Icon.FromHandle.png.GetHicon()) ' 各プロパティを変更します Dim ts As ToolStrip = pi.Controls(1) ts.BackColor = Color.LemonChiffon ts.ForeColor = Color.Blue ts.Items(0).Visible = False ts.Items(1).Text = "拡大/縮小" ts.Items(1).TextAlign = ContentAlignment.BottomCenter ts.Items(3).Visible = False ts.Items(4).Visible = False ts.Items(5).Visible = False ts.Items(9).Text = "終わり" ts.Items(9).BackColor = Color.Cyan ts.Items(11).Text = "頁" ' 印刷プレビュー flex.PrintGrid("C1FlexGrid", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // 印刷プレビューに使用するPrintPreviewDialogを取得 508 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms PrintPreviewDialog pi = flex.PrintParameters.PrintPreviewDialog; // キャプションを設定 pi.Text = "カスタマイズされたプレビュー画面"; // Iconを変更 Bitmap.png = (Bitmap)Image.FromFile("printer.gif"); pi.Icon = System.Drawing.Icon.FromHandle.png.GetHicon()); // 各プロパティを変更します ToolStrip ts = (ToolStrip)pi.Controls[1]; ts.BackColor = Color.LemonChiffon; ts.ForeColor = Color.Blue; ts.Items[0].Visible = false; ts.Items[1].Text = "拡大/縮小"; ts.Items[1].TextAlign = ContentAlignment.BottomCenter; ts.Items[3].Visible = false; ts.Items[4].Visible = false; ts.Items[5].Visible = false; ts.Items[9].Text = "終わり"; ts.Items[9].BackColor = Color.Cyan; ts.Items[11].Text = "頁"; // 印刷プレビュー flex.PrintGrid("C1FlexGrid", C1.Win.C1FlexGrid.PrintGridFlags.ShowPreviewDialog); } 注意: 注意:PrintPreviewDialog クラス(System.Windows.Forms)の詳細は、MSDN を参照してください。 複数のグリッドを印刷する 出力するグリッドごとに1つの PrintDocumentGridRenderer を作成します。また、ドキュメントのイベントを処理し て、CurrentPage プロパティの値がPageCount プロパティの値に等しくなるまでレンダラのPrintPage イベントを呼び出しま す。以下は、フォームに配置されている2つのグリッドを単一の PrintDocument にレンダリングする例です。 【実行例】 509 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private _g1, _g2 As C1.Win.C1FlexGrid.PrintDocumentGridRenderer Private printDocument1 As Printing.PrintDocument Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex1(1, 1) = "グリッド1" flex1.Styles.Normal.BackColor = Color.AliceBlue flex2(1, 1) = "グリッド2" flex2.Styles.Normal.BackColor = Color.YellowGreen ' PrintDocumentを生成し、イベントハンドラを追加 Me.printDocument1 = New Printing.PrintDocument AddHandler printDocument1.BeginPrint, AddressOf printDocument1_BeginPrint AddHandler printDocument1.PrintPage, AddressOf printDocument1_PrintPage End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 印刷プレビューダイアログを表示 Using dlg As New PrintPreviewDialog() dlg.Document = Me.printDocument1 dlg.ShowDialog(Me) End Using End Sub Private Sub printDocument1_BeginPrint(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintEventArgs) ' 1つ目のグリッドのレンダラを作成し、印刷オプションを設定 _g1 = New C1.Win.C1FlexGrid.PrintDocumentGridRenderer(flex1) _g1.Options = C1.Win.C1FlexGrid.PrintGridFlags.FitToPageWidth ' 2つ目のグリッドのレンダラを作成し、印刷オプションを設定 510 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms _g2 = New C1.Win.C1FlexGrid.PrintDocumentGridRenderer(flex2) _g2.Options = C1.Win.C1FlexGrid.PrintGridFlags.FitToPageWidth End Sub Private Sub printDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) ' 印刷ヘッダの表示 Dim fnt As Font = New Font(Control.DefaultFont.FontFamily, 10.0F, FontStyle.Regular) e.Graphics.DrawString("複数グリッドの印刷", fnt, Brushes.Black, 50, 50) If (_g1.CurrentPage < _g1.PageCount) Then ' 1つ目のグリッドをレンダリングします _g1.PrintPage(e) e.HasMorePages = True ElseIf (_g2.CurrentPage < _g2.PageCount) Then ' 2つ目のグリッドをレンダリングします _g2.PrintPage(e) e.HasMorePages = _g2.CurrentPage < _g2.PageCount End If End Sub C# コードの書き方 C# private C1.Win.C1FlexGrid.PrintDocumentGridRenderer _g1, _g2; private System.Drawing.Printing.PrintDocument printDocument1; private void Form1_Load(object sender, EventArgs e) { flex1[1, 1] = "グリッド1"; flex1.Styles.Normal.BackColor = Color.AliceBlue; flex2[1, 1] = "グリッド2"; flex2.Styles.Normal.BackColor = Color.YellowGreen; // PrintDocumentを生成し、イベントハンドラを追加 this.printDocument1 = new System.Drawing.Printing.PrintDocument(); printDocument1.BeginPrint += new System.Drawing.Printing.PrintEventHandler(printDocument1_BeginPrint); printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(printDocument1_PrintPage); } private void button1_Click(object sender, EventArgs e) { // 印刷プレビューダイアログを表示 using (PrintPreviewDialog dlg = new PrintPreviewDialog()) { dlg.Document = this.printDocument1; dlg.ShowDialog(this); } } void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) { // 1つ目のグリッドのレンダラを作成し、印刷オプションを設定 _g1 = new C1.Win.C1FlexGrid.PrintDocumentGridRenderer(flex1); 511 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms _g1.Options = C1.Win.C1FlexGrid.PrintGridFlags.FitToPageWidth; // 2つ目のグリッドのレンダラを作成し、印刷オプションを設定 _g2 = new C1.Win.C1FlexGrid.PrintDocumentGridRenderer(flex2); _g2.Options = C1.Win.C1FlexGrid.PrintGridFlags.FitToPageWidth; } void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { // 1つ目のグリッドをレンダリングします if (_g1.CurrentPage < _g1.PageCount) { _g1.PrintPage(e); e.HasMorePages = true; } // 2つ目のグリッドをレンダリングします else if (_g2.CurrentPage < _g2.PageCount) { _g2.PrintPage(e); e.HasMorePages = _g2.CurrentPage < _g2.PageCount; } } 注意: 複数のグリッドを同一ページ内に印刷することはできません。 PrintDocument クラス(System.Drawing.Printing)や PrintPreviewDialog クラス(System ファイル入出力 ファイル入出力に関するタスクを紹介します。 Excel ファイルの保存とロード グリッドの内容を Excel ファイルに保存するには、SaveExcel メソッド、またはSaveGrid メソッドを使用します。 Excel ファイルの内容をグリッドにロードするには、LoadExcel メソッド、またはLoadGrid メソッドを使用します。 使用できるオプション(FileFlags 列挙体 列挙体)は以下のとおりです。 FileFlags 列挙体 説明 AsDisplayed 表示された状態の値をファイルに保存します(書式設定とマッピングがある場合はそれらを含む)。 IncludeFixedCells ファイルの保存またはロード時に固定セルを含めます。 IncludeMergedRanges SaveExcel/LoadExcel メソッドを使用したファイルの保存/ロード時にマージ状態を含めます。 LoadMergedRanges LoadExcel メソッドを使用したファイルのロード時にマージ状態を含めます。 NoFreezing SaveExcel/LoadExcel メソッドを使用したファイルの保存/ロード時に行と列をフリーズしませ ん。 None デフォルトの設定を使用してファイルの保存とロードを行います。 OpenXm ファイルを OpenXml(Office 2007)フォーマットで読み込むか、または保存します。 SaveMergedRanges SaveExcel メソッドを使用したファイルの保存時にマージ状態を含めます。 SelectedRowsOnly 選択されている行だけをファイルに保存します。 512 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms VisibleOnly 表示されている行と列だけをファイルに保存します。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' MDBファイルへの接続&データ取得(データセットの作成) Dim MDBFILE As String = "Nwind.mdbのパス名" Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";" Dim rs As String = "SELECT * FROM Customers" Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(rs, conn) Dim ds As DataSet = New DataSet() da.Fill(ds, "Customers") ' グリッドに接続します flex.DataSource = ds.Tables("Customers") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 保存ファイル名:flex.xls ' 保存シート名:Customers ' オプション:保存時に固定セルを含める flex.SaveExcel("flex.xls", "Customers", C1.Win.C1FlexGrid.FileFlags.IncludeFixedCells) MessageBox.Show("ファイルを保存しました") End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ' バウンドモード時、Excel ファイルからのロードはできません flex.DataSource = Nothing ' ロードするファイル名:flex.xls 513 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ' ロードするシート名:Customers ' オプション:ロード時に固定セルを含める flex.LoadExcel("flex.xls", "Customers", C1.Win.C1FlexGrid.FileFlags.IncludeFixedCells) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // MDBファイルへの接続&データ取得(データセットの作成) string MDBFILE = @"Nwind.mdbのパス名"; string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";"; string rs = "SELECT * FROM Customers"; System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(rs, conn); DataSet ds = new DataSet(); da.Fill(ds, "Customers"); // グリッドに接続します flex.DataSource = ds.Tables["Customers"]; } private void button1_Click(object sender, EventArgs e) { // 保存ファイル名:flex.xls // 保存シート名:Customers // オプション:保存時に固定セルを含める flex.SaveExcel("flex.xls", "Customers", C1.Win.C1FlexGrid.FileFlags.IncludeFixedCells); MessageBox.Show("ファイルを保存しました"); } private void button2_Click(object sender, EventArgs e) { // バウンドモード時、Excel ファイルからのロードはできません flex.DataSource = null; // ロードするファイル名:flex.xls // ロードするシート名:Customers // オプション:ロード時に固定セルを含める flex.LoadExcel("flex.xls", "Customers", C1.Win.C1FlexGrid.FileFlags.IncludeFixedCells); } 注意: サンプルコードでは一般的なMDBサンプル(Nwind.mdb)の Customers テーブルに接続しています。実行の際 にはご利用の環境に適したパス名を設定する必要があります。 Excel ファイルへの保存時、イメージやデータマップ、およびセルボーダーなどの特性は保存されません。 Excel ファイルからのロード時、イメージやセルボーダー、計算式などの特性はロードされません。 バウンドモード時、Excel ファイルからのロードはできません。実行すると例外が発生します。 XMLファイルの保存とロード WriteXml/ReadXml メソッドを使用します。 514 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ReadXml/WriteXml メソッドによる XML ドキュメントの入出力では、データ以外にもプロパティやスタイルなどのグリッド設 定も対象になります。 【実行例】 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' MDBファイルへの接続&データ取得(データセットの作成) Dim MDBFILE As String = "Nwind.mdbのパス名" Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";" Dim rs As String = "SELECT * FROM Customers" Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(rs, conn) Dim ds As DataSet = New DataSet() da.Fill(ds, "Customers") ' グリッドに接続します flex.DataSource = ds.Tables("Customers") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click flex.WriteXml("flex.xml") MessageBox.Show("ファイルを保存しました") End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click flex.ReadXml("flex.xml") End Sub C# コードの書き方 C# 515 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms private void Form1_Load(object sender, EventArgs e) { // MDBファイルへの接続&データ取得(データセットの作成) string MDBFILE = @"Nwind.mdbのパス名"; string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";"; string rs = "SELECT * FROM Customers"; System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(rs, conn); DataSet ds = new DataSet(); da.Fill(ds, "Customers"); // グリッドに接続します flex.DataSource = ds.Tables["Customers"]; } private void button1_Click(object sender, EventArgs e) { flex.WriteXml("flex.xml"); MessageBox.Show("ファイルを保存しました"); } private void button2_Click(object sender, EventArgs e) { flex.ReadXml("flex.xml"); } 注意: サンプルコードでは一般的なMDBサンプル(Nwind.mdb)の Customers テーブルに接続しています。実行の際 にはご利用の環境に適したパス名を設定する必要があります。 保存される XML ファイルは、C1FlexGrid の独自ファイル形式です。 バウンドモード時にファイルをロードした場合、DataSource プロパティはクリアされます。 関連項目 レイアウトを保存/ロードする テキストファイルの保存とロード SaveGrid/LoadGrid メソッドを使用します。 使用できるオプション(FileFlags 列挙体 列挙体)は以下のとおりです。 FileFlags 列挙体 説明 IncludeFixedCells ファイルの保存またはロード時に固定セルを含めます。 None デフォルトの設定を使用してファイルの保存とロードを行います。 SelectedRowsOnly 選択されている行だけをファイルに保存します。 VisibleOnly 表示されている行と列だけをファイルに保存します。 【実行例】 516 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' MDBファイルへの接続&データ取得(データセットの作成) Dim MDBFILE As String = "Nwind.mdbのパス名" Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";" Dim rs As String = "SELECT * FROM Customers" Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(rs, conn) Dim ds As DataSet = New DataSet() da.Fill(ds, "Customers") ' グリッドに接続します flex.DataSource = ds.Tables("Customers") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' 保存するファイル名:flex.txt ' 列の区切り文字:Tab ' オプション:固定セルを含める ' エンコード:SHIFT-JIS flex.SaveGrid("flex.txt", _ C1.Win.C1FlexGrid.FileFormatEnum.TextTab, _ C1.Win.C1FlexGrid.FileFlags.IncludeFixedCells, _ System.Text.Encoding.GetEncoding(932)) MessageBox.Show("ファイルを保存しました") End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ' ロードするファイル名:flex.txt ' 列の区切り文字:Tab ' オプション:固定セルを含める ' エンコード:SHIFT-JIS 517 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms flex.LoadGrid("flex.txt", _ C1.Win.C1FlexGrid.FileFormatEnum.TextTab, _ C1.Win.C1FlexGrid.FileFlags.IncludeFixedCells, _ System.Text.Encoding.GetEncoding(932)) End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // MDBファイルへの接続&データ取得(データセットの作成) string MDBFILE = @"Nwind.mdbのパス名"; string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";"; string rs = "SELECT * FROM Customers"; System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(rs, conn); DataSet ds = new DataSet(); da.Fill(ds, "Customers"); // グリッドに接続します flex.DataSource = ds.Tables["Customers"]; } private void button1_Click(object sender, EventArgs e) { // 保存するファイル名:flex.txt // 列の区切り文字:Tab // オプション:固定セルを含める // エンコード:SHIFT-JIS C1.Win.C1FlexGrid.FileFormatEnum.TextTab, C1.Win.C1FlexGrid.FileFlags.IncludeFixedCells, System.Text.Encoding.GetEncoding(932)); MessageBox.Show("ファイルを保存しました"); } private void button2_Click(object sender, EventArgs e) { // ロードするファイル名:flex.txt // 列の区切り文字:Tab // オプション:固定セルを含める // エンコード:SHIFT-JIS flex.LoadGrid("flex.txt", C1.Win.C1FlexGrid.FileFormatEnum.TextTab, C1.Win.C1FlexGrid.FileFlags.IncludeFixedCells, System.Text.Encoding.GetEncoding(932)); } 注意: サンプルコードでは一般的なMDBサンプル(Nwind.mdb)の Customers テーブルに接続しています。実行の際 にはご利用の環境に適したパス名を設定する必要があります。 テキストファイルの保存では、常に表示されている値が格納されます。 バウンドモード時にテキストファイルをロードした場合、DataSource プロパティはクリアされます。 518 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ファイル入出力時に複数のオプションを設定する SaveExcel/LoadExcel メソッドやSaveGrid/LoadGrid メソッドにてファイルの入出力を行う際、FileFlags 列挙体 列挙体を使用し て、入出力時のオプションを設定することが可能です。複数のオプションを同時に設定する場合は、Or (C# では ”|”)を使用し ます。 Visual Basic コードの書き方 Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Excel ファイルへ出力 ' マージ状態と固定セルを含めるオプションを同時に指定 flex.SaveExcel("flex.xls", _ "sheet1", _ C1.Win.C1FlexGrid.FileFlags.SaveMergedRanges Or _ C1.Win.C1FlexGrid.FileFlags.IncludeFixedCells) End Sub C# コードの書き方 C# private void button1_Click(object sender, EventArgs e) { // Excel ファイルへ出力 // マージ状態と固定セルを含めるオプションを同時に指定 flex.SaveExcel("flex.xls", "sheet1", C1.Win.C1FlexGrid.FileFlags.SaveMergedRanges | C1.Win.C1FlexGrid.FileFlags.IncludeFixedCells); } グリッドを画像として出力する CreateImage メソッドを使用します。グリッド全体を画像として保存することも、任意のセル範囲のみを画像として保存するこ とも可能です。下記のコードでは、0行0列目-5行2列目のセル範囲を画像として保存しています。 注意: 注意:サンプルコードでは一般的なMDBサンプル(Nwind.mdb)の Customers テーブルに接続しています。実行の際に はご利用の環境に適したパス名を設定する必要があります。 【実行例】 イメージ出力例 Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 519 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Handles MyBase.Load ' MDBファイルへの接続&データ取得(データセットの作成) Dim MDBFILE As String = "Nwind.mdbのパス名" Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";" Dim rs As String = "SELECT * FROM Customers" Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(rs, conn) Dim ds As DataSet = New DataSet() da.Fill(ds, "Customers") ' グリッドに接続します flex.DataSource = ds.Tables("Customers") ' VisualStyleを設定 flex.VisualStyle = C1.Win.C1FlexGrid.VisualStyle.Office2007Blue End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' カレントセルのカーソルを非表示 flex.Row = -1 flex.Col = -1 ' 0行0列目-5行2列目のセルを画像に出力 Dim img As Image img = flex.CreateImage(0, 0, 5, 2) ' 画像を保存 img.Save("flex.png") End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // MDBファイルへの接続&データ取得(データセットの作成) string MDBFILE = @"Nwind.mdbのパス名"; string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";"; string rs = "SELECT * FROM Customers"; System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(rs, conn); DataSet ds = new DataSet(); da.Fill(ds, "Customers"); // グリッドに接続します flex.DataSource = ds.Tables["Customers"]; // VisualStyleを設定 flex.VisualStyle = C1.Win.C1FlexGrid.VisualStyle.Office2007Blue; } private void button1_Click(object sender, EventArgs e) { // カレントセルのカーソルを非表示 flex.Row = -1; flex.Col = -1; // 0行0列目-5行2列目のセルを画像に出力 Image img; img = flex.CreateImage(0, 0, 5, 2); 520 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // 画像を保存 img.Save("flex.png"); } クリップボード クリップボードの処理に関するタスクを紹介します。 自動クリップボードの機能を有効にする AutoClipboard プロパテを True に設定(デフォルト:False)することで、C1FlexGrid はクリップボードに関連する標準のキー ボードコマンドのすべてを自動的に処理します。Excel ファイルとデータをコピー&ペーストでやり取りする際も自動で処理しま す。 アクション ショートカットキー 切り取り [Ctrl+X] または [Shift+Delete] コピー [Ctrl+C] または [Ctrl+Insert] 貼り付け [Ctrl+V] または [Shift+Insert] 削除 [Delete] Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex.AutoClipboard = True End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex.AutoClipboard = true; } 注意 注意: フォントなどのスタイルやイメージは、自動クリップボード機能の対象になりません。 データマップやマルチカラムコンボボックスのセルでコピーをした際は、表示されている値がコピーされます。 セル範囲をコピーした場合、非表示になっている行や列も対象になります。 行ヘッダや列ヘッダを含めてコピーする AutoClipboard プロパテを True に設定ィ(デフォルト:False)することで、C1FlexGrid はクリップボードに関連する標準の キーボードコマンドのすべてを自動的に処理します。また、ClipboardCopyMode プロパティを設定して行ヘッダや列ヘッダ、 行列ヘッダを含めてコピーすることができます。 Visual Basic コードの書き方 Visual Basic 521 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load flex.AutoClipboard = True ' 行ヘッダ、列ヘッダを含めて選択されているデータをコピー flex.ClipboardCopyMode = C1.Win.C1FlexGrid.ClipboardCopyModeEnum.DataAndAllHeaders ' 列ヘッダを含めて選択されているデータをコピー flex.ClipboardCopyMode = C1.Win.C1FlexGrid.ClipboardCopyModeEnum.DataAndColumnHeaders ' 行ヘッダを含めて選択されているデータをコピー flex.ClipboardCopyMode = C1.Win.C1FlexGrid.ClipboardCopyModeEnum.DataAndRowHeaders End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { flex.AutoClipboard = true; // 行ヘッダ、列ヘッダを含めて選択されているデータをコピー flex.ClipboardCopyMode = C1.Win.C1FlexGrid.ClipboardCopyModeEnum.DataAndAllHeaders; // 列ヘッダを含めて選択されているデータをコピー flex.ClipboardCopyMode = C1.Win.C1FlexGrid.ClipboardCopyModeEnum.DataAndColumnHeaders; // 行ヘッダを含めて選択されているデータをコピー flex.ClipboardCopyMode = C1.Win.C1FlexGrid.ClipboardCopyModeEnum.DataAndRowHeaders; } 注意 注意: フォントなどのスタイルやイメージは、自動クリップボード機能の対象になりません。 データマップやマルチカラムコンボボックスのセルでコピーをした際は、表示されている値がコピーされます。 セル範囲をコピーした場合、非表示になっている行や列も対象になります。 コピー&ペースト処理をコードで実装する コピー処理では、Clip プロパティからから取得したセルデータの最後に改行コードを追加して、クリップボードに設定します。ま た、ペースト処理では、クリップボードから取得したデータの最後の改行コードを削除して使用します。ペーストする際に は、Select メソッドで範囲選択を行った上で Clip プロパティに設定する必要があります。 【実行例】 522 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic ' コピー処理 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Clip プロパティに改行コードを追加して、 ' クリップボードに設定 Clipboard.SetDataObject(flex.Clip & vbCrLf) MessageBox.Show(flex.Row & "行" & flex.Col & "列-" & _ flex.RowSel & "行" & flex.ColSel & "列目をコピー") End Sub ' ペースト処理 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ' クリップボードにあるテキストを取得 Dim data As IDataObject = Clipboard.GetDataObject() If data.GetDataPresent(DataFormats.Text) Then Dim str1, str2 As String ' クリップボードからデータを取得 str1 = CType(data.GetData(DataFormats.Text), String) ' クリップボードにある最後の改行コードを削除 str2 = str1.Remove(str1.Length - 2, 2) ' 範囲選択、データを貼り付け flex.Select(flex.Row, flex.Col, flex.Rows.Count - 1, flex.Cols.Count - 1, False) flex.Clip = str2 flex.Select(flex.Row, flex.Col) End If End Sub C# コードの書き方 C# 523 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms // コピー処理 private void button1_Click(object sender, EventArgs e) { // Clip プロパティに改行コードを追加して、 // クリップボードに設定 Clipboard.SetDataObject(flex.Clip + "\r"); MessageBox.Show(flex.Row + "行" + flex.Col + "列-" + flex.RowSel + "行" + flex.ColSel + "列目をコピー"); } // ペースト処理 private void button2_Click(object sender, EventArgs e) { // クリップボードにあるテキストを取得 IDataObject data = Clipboard.GetDataObject(); if (data.GetDataPresent(DataFormats.Text)) { string str1, str2; // クリップボードからデータを取得 str1 = (string)data.GetData(DataFormats.Text); // クリップボードにある最後の改行コードを削除 str2 = str1.Remove(str1.Length - 1, 1); // 範囲選択、データを貼り付け flex.Select(flex.Row, flex.Col, flex.Rows.Count - 1, flex.Cols.Count - 1, false); flex.Clip = str2; flex.Select(flex.Row, flex.Col); } } 注意: 注意:ClipBoard クラスの詳細は、MSDN を参照してください。 非表示になっている行や列を除いてコピーする AutoClipBoard プロパティを True にした自動クリップボード処理では、セル範囲をコピーした際、非表示になっている行や列 も対象になります。表示になっている行や列を除いてコピーするには、コードでコピー処理を実装する必要があります。 【実行例】 524 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 非表示になっている行や列を除いてコピーする ' クリップボードの自動処理 flex.AutoClipboard = True ' 3行目を非表示 flex.Rows(3).Visible = False ' 2列目を非表示 flex.Cols(2).Visible = False ' 簡単なデータを設定 For i As Integer = 0 To flex.Rows.Count - 1 For j As Integer = 0 To flex.Cols.Count - 1 flex(i, j) = i & ":" & j Next Next End Sub Private Sub flex_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles flex.KeyDown ' [Ctrl + C]によるコピー If e.Control = True And e.KeyCode = Keys.C Then ' 自動処理を行わないため、キー入力を無効 e.Handled = True ' 選択されているセル範囲のCellRangeオブジェクトを取得 Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.Selection 525 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms ' 選択されているセル範囲から ' VisibleプロパティがFalseになっている行や列の値を除いて ' タブ記号や改行コードを追加した文字列にします Dim StrCopy As String = "" For i As Integer = cr.r1 To cr.r2 If flex.Rows(i).Visible = True Then For j As Integer = cr.c1 To cr.c2 If flex.Cols(j).Visible = True Then StrCopy = StrCopy + flex(i, j) If j <> cr.c2 Then StrCopy = StrCopy + vbTab End If End If Next StrCopy = StrCopy + vbCrLf End If Next ' クリップボードに設定 Clipboard.SetDataObject(StrCopy) MessageBox.Show("コピーしたデータ:" & vbCrLf & StrCopy) End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // クリップボードの自動処理 flex.AutoClipboard = true; // 3行目を非表示 flex.Rows[3].Visible = false; // 2列目を非表示 flex.Cols[2].Visible = false; // 簡単なデータを設定 for (int i = 0; i < flex.Rows.Count; i++) { for (int j = 0; j < flex.Cols.Count; j++) { flex[i, j] = i + ":" + j; } } } private void flex_KeyDown(object sender, KeyEventArgs e) { // [Ctrl + C]によるコピー if ((e.Control == true) && (e.KeyCode == Keys.C)) { // 自動処理を行わないため、キー入力を無効 e.Handled = true; // 選択されているセル範囲のCellRangeオブジェクトを取得 C1.Win.C1FlexGrid.CellRange cr; 526 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms cr = flex.Selection; // 選択されているセル範囲から // VisibleプロパティがFalseになっている行や列の値を除いて // タブ記号や改行コードを追加した文字列にします string StrCopy = ""; for (int i = cr.r1; i <= cr.r2; i++) { if (flex.Rows[i].Visible == true) { for (int j = cr.c1; j <= cr.c2; j++) { if (flex.Cols[j].Visible == true) { StrCopy = StrCopy + flex[i, j].ToString(); if(j != cr.c2) { StrCopy = StrCopy + "\t"; } } } StrCopy = StrCopy + "\n"; } } // クリップボードに設定 Clipboard.SetDataObject(StrCopy); MessageBox.Show("コピーしたデータ:\n" + StrCopy); } } データの実値をコピーする AutoClipBoard プロパティを True にした自動クリップボード処理では、データマップやマルチカラムコンボボックスのセルでコ ピーをした際は、表示されている値がコピーされます。実値をコピーするには、GetData メソッドを使用してコードでコピー処理 を実装する必要があります。 【実行例】 527 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms Visual Basic コードの書き方 Visual Basic Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' クリップボードの自動処理 flex.AutoClipboard = True ' データマップの機能を使用 Dim dtMap As Hashtable = New Hashtable() dtMap.Add("001", "東京") dtMap.Add("002", "仙台") dtMap.Add("003", "大坂") flex.Cols(1).DataMap = dtMap flex.Cols(1).Caption = "データマップ" End Sub Private Sub flex_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles flex.KeyDown ' [Ctrl + C]によるコピー If e.Control = True And e.KeyCode = Keys.C Then ' 自動処理を行わないため、キー入力を無効 e.Handled = True ' 選択されているセル範囲のCellRangeオブジェクトを取得 Dim cr As C1.Win.C1FlexGrid.CellRange cr = flex.Selection ' GetDataメソッドを使用して ' 選択されているセル範囲から実値をコピー Dim StrCopy As String = "" For i As Integer = cr.r1 To cr.r2 For j As Integer = cr.c1 To cr.c2 StrCopy = StrCopy + flex.GetData(i, j) If j <> cr.c2 Then StrCopy = StrCopy + vbTab End If Next 528 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms StrCopy = StrCopy + vbCrLf Next ' クリップボードに設定 Clipboard.SetDataObject(StrCopy) MessageBox.Show("コピーしたデータ:" & vbCrLf & StrCopy) End If End Sub C# コードの書き方 C# private void Form1_Load(object sender, EventArgs e) { // データの実値をコピーする // クリップボードの自動処理 flex.AutoClipboard = true; // データマップの機能を使用 System.Collections.Hashtable dtMap = new System.Collections.Hashtable(); dtMap.Add("001", "東京"); dtMap.Add("002", "仙台"); dtMap.Add("003", "大坂"); flex.Cols[1].DataMap = dtMap; flex.Cols[1].Caption = "データマップ"; } private void flex_KeyDown(object sender, KeyEventArgs e) { // [Ctrl + C]によるコピー if ((e.Control == true) && (e.KeyCode == Keys.C)) { // 自動処理を行わないため、キー入力を無効 e.Handled = true; // 選択されているセル範囲のCellRangeオブジェクトを取得 C1.Win.C1FlexGrid.CellRange cr; cr = flex.Selection; // GetDataメソッドを使用して // 選択されているセル範囲から実値をコピー string StrCopy = ""; for (int i = cr.r1; i <= cr.r2; i++) { for (int j = cr.c1; j <= cr.c2; j++) { StrCopy = StrCopy + flex.GetData(i, j).ToString(); if (j != cr.c2) { StrCopy = StrCopy + "\t"; } } StrCopy = StrCopy + "\n"; } // クリップボードに設定 Clipboard.SetDataObject(StrCopy); MessageBox.Show("コピーしたデータ:\n" + StrCopy); 529 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms } } 関連項目 表示値/実値のように2種類のデータを持たせる 530 Copyright © GrapeCity inc. All rights reserved. FlexGrid for WinForms リファレンス 531 Copyright © GrapeCity inc. All rights reserved.
© Copyright 2024 Paperzz