A。はじめに 。
Microsoft Tree View Controlは、Microsoft WindowsCommonControlsの一部です。これは、ノードの階層に関連データを表示する興味深いオブジェクトです。インデックスリストのエントリやサブエントリなどの関連データや、Windowsエクスプローラの左ペインなどのフォルダのリスト、またはツリーライン、チェックボックス、ビットマップ画像のグラフィックスを含む階層構造の関連アイテムのリストを表示できます。 。
ListView およびImageList コントロールはWindowsCommonControlsの一部であり、MicrosoftAccessのTreeViewコントロールと一緒に使用します。
いくつかのサンプルTreeViewControlデモ画像をご覧になりたいと思います。これは、数週間以内に作成する予定です。
B。サンプルデモ画像 。
折りたたみ状態のノード。
- すべてのノードが折りたたまれた形式のサンプルデモTreeViewイメージ。
拡張ビューのノード。
- 拡張ビューの上記のTreeViewコントロールノード。
アローヘッド画像アイコン付き。
- TreeViewサンプル表示。各ノードテキストの左側に、矢印の付いた画像アイコンが表示されます。
ルートレベルのノードには、矢印の付いた他のフォルダ画像があります。
- 次に、サブフォームにリンクされたデータを含むTreeView表示。ルートレベルのノードには2つのイメージがあります。フォルダクローズ画像は通常モードで表示されます。ルートレベルノードがマウスクリックを受信すると、フォルダを開く画像が表示され、子ノードが展開された形式で表示されます。
ルートレベルノードの選択に基づいて、関連情報がサブフォームに表示されます。
選択した子ノードアイテムの1つに、関連情報を含む別のフォーム(通常は非表示のまま)が表示されます。
TreeViewおよびListViewコントロール
- 次のフォーム画像には、2つのパネルがあります。製品カテゴリのアイテム関連ノードは、左側のパネルのTreeViewControlにあります。カテゴリアイテムの1つがTreeViewコントロールをクリックすると、数量と定価が別々の列にある関連商品アイテムがリストビューに表示されます。 コントロール、 右側のパネルにあります。
C。試運転用のサンプルデータの作成。
このページの冒頭に示されている最初の2つの画像に基づいて、以下に示すいくつかのサンプルデータを使用してTreeViewコントロールを試してみましょう。
上記のサンプルデータテーブルには3つのフィールドがあります。
-
ID フィールドは、一意のID番号を持つAutoNumberフィールドです。 AutoNumberタイプは、便宜上選択されています。いずれの場合も、テーブル内のすべてのレコードに一意のID値が必要です。数値の場合は、TreeViewコントロールに追加する前に、文字列タイプに変換する必要があります。
-
2番目のフィールドはノードの説明(説明)です )。この列の情報の行は論理的に関連しています。
-
3番目のParentID フィールドは数値タイプです。ただし、TreeView Controlで使用する前に、文字列タイプに変換する必要があります。
ParentID に関連する値を入力することで関係を確立できることに基づいて、説明列の値が互いにどのように関連しているかを知る必要があります。 フィールド。
たとえば、本の著者、本の出版社、本が販売されている書店、または家系図のメンバー間の関係のような論理的な配置。
商品カテゴリ、商品、在庫、価格などの関係。このすべての情報が、単一のテーブルの1つの列の下に表示されない場合があります。それらは、異なる列または異なるテーブルにも表示される場合があります。
ParentID フィールドは、ノードの階層配置を決定するという点で非常に重要です。 ParentIDフィールドが空の場合、そのレコードはルートレベルノードとして使用されます。子ノードには、常に親IDに親レコードID値を入力する必要があります。
ルートレベルノードには1つ以上の子ノードを含めることができ、子ノードには独自の子ノードを含めることができます。
上記のデータをTreeViewコントロールにロードし、どのように表示されるかを確認します。次に、 ParentIdに入力します 関連するIDのフィールド sビューを変更するには、論理的な順序で表示したい方法です。
D。 Windows CommonControlsLibraryファイル 。
-
ただし、まず最初に、データベースの1つを開くか、新しいデータベースを作成します。
-
VBAウィンドウを開きます( ALT + F11 )そして参照…を選択します ツールから メニュー。
-
ファイルを探します: Microsoft Windows Common Controls 表示されたファイルのリストにチェックマークを付けて選択します。
リストにファイルが見つからない場合は、[参照...]をクリックします。 ボタンを押してファイルを見つけます:WindowsシステムディレクトリのMSCOMLIB.OCX、Windows7バージョンの場合はSysWOW64でファイルを探します フォルダ。 OKをクリックします コントロールを一覧表示するライブラリファイルを閉じます。
-
次の構造でテーブルを作成します。
-
サンプルという名前でテーブルを保存します 。
-
上のデータビューの画像に示されているように、12レコードのサンプルデータをテーブルに入力します。
E。フォームでのTreeViewコントロールの作成
-
新しい空白のフォームを作成します。
-
ActiveXコントロールをクリックします コントロールのボタン グループで、 Microsoft TreeView Controlを見つけます 次にそれを選択します。
-
OKをクリックします フォームにTreeViewコントロールを挿入します。
-
コントロールを右下にドラッグして、TreeViewコントロールの左上にスペースを残します。以下のサンプル画像のように、右下隅のサイズ変更ハンドルを右下隅に向かってドラッグして、コントロールを大きくします。
-
コントロールのプロパティシートを表示し、その名前を変更します TreeView0、へのプロパティ値 そこが違うなら。
-
フォームのVBA編集ウィンドウを表示します。
- 次のVBAコードをコピーしてモジュールに貼り付け、既存のコード行を上書きします。
Option Compare Database Option Explicit Dim tv As MSComctlLib.TreeView Const KeyPrfx As String = "X" Private Sub Form_Load() Dim db As Database Dim rst As Recordset Dim strSQL As String Dim nodKey As String Dim ParentKey As String Dim strText As String Set tv = Me.TreeView0.Object strSQL = "SELECT ID, Desc, ParentID FROM Sample;" Set db = CurrentDb Set rst = db.OpenRecordset(strSQL, dbOpenDynaset) Do While Not rst.EOF And Not rst.BOF If Nz(rst!ParentID, "") = "" Then nodKey = KeyPrfx & CStr(rst!ID) strText = rst!Desc ‘Add the TreeView Root Level Nodes tv.Nodes.Add , , nodKey, strText Else ParentKey = KeyPrfx & CStr(rst!ParentID) nodKey = KeyPrfx & CStr(rst!ID) strText = rst!Desc ‘Add the Record as Child Node tv.Nodes.Add ParentKey, tvwChild, nodKey, strText End If rst.MoveNext Loop rst.Close Set rst = Nothing Set db = Nothing End Sub
-
frmSample、という名前でフォームを保存します ただし、VBAウィンドウを閉じないでください。
G。 VBAコード行ごと。
F。 VBAコードにアクセスします。
VBAコードをざっと見て、それが何をするのかを理解しましょう。
フォームモジュールのグローバル宣言領域で、変数 tv TreeViewとして宣言 物体。 KeyPrfx 定数として宣言 、文字列タイプ値「X」。
TreeViewノード のキー値は常に文字列型である必要があり、ノードキーに少なくとも1つの非数字文字が存在する必要があります。サンプルのテーブルキー値はすべて数値形式であり、変換して定数値「 X」に追加できます。 」。文字列型に変換された数値のみは、ノードキーとして受け入れられません。
注: ノードキーの場合 および親キー 値はすでに英数字または英数字の形式であるため、変換の問題は発生しません。すべてのノードキー値は一意である必要があります。
Form_Load() イベントプロシージャ、データベースおよびレコードセットオブジェクトが宣言されます。 4つの文字列変数も宣言されています。
ステートメントSettv =Me.TreeView0.Object ステートメントは、 TreeView0を割り当てます フォーム上のオブジェクト、オブジェクト変数tv。
OpenRecordset()ステートメントはサンプルを開きます SQLstrSQLを使用したテーブルレコード。
実行中… ステートメントは、レコードセットが空でないことを確認します。空の場合は、ループを終了します。 プログラムを終了します。
レコードがある場合は、最初のレコードの ParentId フィールドに値が存在するかどうかがチェックされます。
空の場合、そのレコードはTreeViewコントロールのルートレベルノード用です アイテム。ルートレベルノードには、一意のノードキーのみが必要です。 IDにすでにある値 フィールドとアイテム説明 テキストのフィールド値 引数。
ParentIDの場合 フィールドに何らかの値がある場合、レコードは子ノード TreeViewオブジェクトの(ルートレベルノードの子または上位レベルの子ノードの子)。
次の行でキーを作成します nodKeyの引数値 文字列変数、 ID フィールド値、文字列に変換され、定数プレフィックス X、ノードキーに追加されます X1になります 。
rst!Desc 文字列変数strText、に追加されたフィールド値 わかりやすくするため、および Nodes.Add()で短くするためです。 メソッドのパラメータリスト。フィールド参照が非常に長い場合、これによりAdd()メソッドがきちんと整理された状態に保たれます。
次の実行可能行: tv.Node.Add() TreeView.Nodes のAdd()メソッドを呼び出します ノードをTreeView0に追加するオブジェクト フォームのコントロールfrmSample 。
構文 Add()メソッドの概要を以下に示します。
tv.Nodes.Add([Relative],[Relationship],[Key],[Text],[Image],[SelectedImage]) As Node
Add()の6つのパラメータすべて メソッドはオプションです。パラメータを指定せずにこのメソッドを呼び出すと、空のルートレベルノード が追加され、TreeViewコントロールのインジケーターとして空白のツリーラインが表示されます。
TreeViewの場合ルート レベルノード キーが必要です およびテキスト 引数の値。
子ノードの場合、両方[相対] および[関係] 引数が必要です。それらのいずれかを省略すると、ノードがルートノードとして挿入されますが、エラーは生成されません。
[相対] NodKeyです 関連するレコードのParentIDに入力された既存のノードの 分野。 [関係] 定数tvwChild 数値4で、キー-の子ノードとして識別します ParentIDの値 フィールド。
他の定数 関係引数の値は、子ノードを特定の場所に配置するために使用されます。定数値は次のとおりです。
tvwFirst =0の場合、相対ノードのレベルで最初のノードとして配置されます。
tvwLast =1、相対ノードのレベルで最後のノードとして配置します。
tvwNext =2、指定したノードの後にノードを配置します。
tvwPrevious =3、指定したノードの直前にノードを配置します。
注: リレーションシップの各値を設定して実験することができます VBAウィンドウとフォームを通常のビューで並べて保持した後、引数を指定してコードをデバッグモードで実行します。理解するために、コード実行の各サイクルでノードがどのように配置されているかを確認します。
これらは、アイテムを削除してその場所に別のアイテムを挿入したり、特定の場所に新しいノードを追加したりして、TreeViewコントロールを編集するときに役立ちます。
[Relative]キーを持つノードは、そのノードに子ノードを追加する前にNodesコレクションに存在する必要があります。存在しない場合、Add()メソッドはエラーを生成します。
このプロセスは、すべてのレコードがレコードセットで処理されるまで繰り返されます。
注: デモの実行後にVBAコードを再度確認できます。
H。最初の試運転。
通常表示でフォームを開きます。試運転の結果は、以下の画像のようになります。
通常のリストボックスよりも見栄えがよくありません。 ParentIDには値を入力していないことに注意してください サンプルのフィールド テーブル。 TreeViewコントロールでアイテムを階層順に移動および配置するには、レコードの行のアイテム間に何らかの関係を確立する必要があります。
私。レコード間の関係を理解する。
- サンプルテーブルを開きます レコードとそれらがどのように関連しているかを調べてみましょう。
- データベースを離れましょう ルートアイテムとしてのアイテムのみ。
データベースオブジェクトには、いくつかのトップレベルオブジェクトもあります:アプリケーション、DBEngine、ワークスペースコレクション、およびデータベースコレクション 、ここでは省略しました。
- 次に、テーブルがあります IDのアイテムをグループ化する 値2。
- 次の表 、フィールド、 フィールド アイテムはテーブルに関連しています グループ。 テーブルが必要です フィールド およびフィールド 親アイテムテーブルの下に並べるアイテム ID値のグループレコード2。
- レコードをテーブルと呼びましょう 親ノードとして 、テーブル、フィールド、およびフィールドレコードを子ノードとして 。
J。 ParentIDフィールドを更新しています。
- したがって、値 2を更新する必要があります (テーブルのノードキー )p arentID テーブルのフィールド 、フィールド、 およびフィールド 記録。
- これらのレコードのみを更新して、テーブルを閉じてください。完了すると、レコードは以下の画像のようになります。
-
次に、 frmSampleを開きます フォームビューで、TreeViewコントロールを確認します。結果は、変更なしで以前の結果と同じようになります。変更はすでに行われていますが、表示されていません。
K。 TreeViewコントロールのプロパティシート。
- frmSampleをオンにします デザインビューで。
- TreeViewコントロールを右クリックしてTreeCtrl_Objectを強調表示します ショートカットメニューからプロパティを選択します 。
プロパティシートは、以下の画像のようになります。
- LineStyleを変更します プロパティ 値=1 (tvwRootLines)そして適用をクリックします ボタンをクリックし、 OKをクリックします プロパティシートを閉じます。
L。 LineStyleの後に実行 プロパティ値の変更
- フォームを保存して、通常のビューで開きます。これで、樹木線が正しく表示されます。 テーブル ノードにはプラス( + )があります )左側に署名します。これは、このノードの次のレベルに1つ以上の子ノードがあり、それらが展開された形式ではないことを示します。
- プラス記号をクリックしてノードを展開し、同じParentIDを持つ子ノードを表示します。マイナス記号をクリックすると、子ノードが折りたたまれて非表示になり、記号が再びプラス記号に変わります。
- 展開すると、表示は次の画像のようになります。
M。 ParentID 他のレコードの更新。
フォームを更新します IDを記録する 値(ノードキー値)をフォーム、コントロール、に変換します およびコントロール レコードのParentID これらのレコードがフォームの下にリストされるようにフィールド 子ノードとしてのノード 。
同様に、レポートのParentIDフィールドを更新します およびコントロール レポートを含むレコード ID (ノードキー値)レポートとなる値 およびコントロール アイテムは親ノードレポートの下に配置されます 、子ノード 。
-
以下に示すように、ParentID値を使用してサンプルテーブルレコードに変更を加えます。
上記の変更後、すべてのノードが展開された形式の場合、TreeViewの表示は次の画像のようになります。
ルートレベルノードに関連するすべての子ノード:テーブル、フォーム、およびレポートは、親ノードの下にリストとしてグループ化されます。ただし、子ノードには、親ノード、祖父母ノード、または偉大な祖父母ノードが含まれる場合があります。
N。すべてのオブジェクトを論理階層順に配置します。
たとえば、最初のルートレベルノードのテーブルを見てみましょう。 。論理的にフィールド (レコードID 5)はフィールドに直接関連しています コレクション(レコードID 4)、フィールド テーブルに関連するコレクション およびテーブル テーブルの一部です コレクション。グループ内の各アイテム(レコード番号5から2)は、次のレベルに1ステップずつ関連付けられています。
それでは、これらの子ノードをそれぞれの親ノードの下に正しく配置して、どのように見えるかを見てみましょう。
-
サンプルテーブルを開き、テーブルのParentID値を変更します 以下に示すように、子レコードに関連します:
- フィールドと ID-5レコードの親はフィールドです ID-4のレコードであるため、5番目のレコードのParentIDフィールドをID番号4で更新しました。
- 同様に、4番目のレコードのParentIDフィールドは3で更新され、3番目のレコードのParentIDはレコード番号2で更新されます。
-
注: このように配置されたアイテムは隣り合っている必要があると思い込まないでください。
- レコードを変更した後、テーブルを保存し、frmSampleを開いて変更を表示します。 TreeViewの表示は、すべてのノードが展開された状態で、以下の画像のようになります。
TreeViewコントロールには独自のプロパティシートがあり、設定はその外観に影響します。そのため、プロパティの1つに変更を加えて、TreeViewを再度表示するために戻ってきます。
このプロパティシートの設定により、TreeViewディスプレイの外観が変更されます。
左上のプロパティスタイル 利用可能な最大機能がすでに設定されているオプション-7 (tvwTreeLinesPlusMinusPictureText)。
ルートレベルノードの子ノードは、それ自体の子の親ノードにすることができます。このようにして、ツリーを数ステップ下に移動できます。
子ノードの他の2つのグループを変更しますParentID 上記の画像のように見えるフィールド値。
辞書オブジェクト
- 辞書オブジェクトの基本
- 辞書オブジェクトの基本-2
- 辞書オブジェクトのキーとアイテムの並べ替え
- 辞書からレコードを表示する
- クラスオブジェクトをディクショナリアイテムとして追加
- クラスオブジェクトディクショナリアイテムの更新