ツリー コントロールでのチェック ボックスのサポート
この記事は、ツリー コントロールのチェック ボックス コントロールを使用するための入門書として作成されています。 ツリー コントロールを使用するための一般的な「方法」ではありません。
Microsoft Dynamics AX 2012 には、データをツリー階層で表示し、ユーザーがチェック ボックスを使用して 1 つまたは複数のノードを選択できるようにするために強化されたツリー コントロールの例がいくつか含まれています。 Dynamics AX 2012 では、ツリー コントロールには、チェック ボックスのコントロールに対して、組み込みのサポートがありませんでした。 代わりに、チェック ボックスのイメージがツリー コントロール内の各ノードに対して追加されました。 ユーザーがチェックボックスをクリックすると、各ノードのイメージの状態が切り替わりました。
現在のバージョンでは、開発者の経験が大幅に簡素化されています。 チェック ボックスのサポートがツリー コントロールに組み込まれました。
チェック ボックスを含めるイメージを使用する必要がなくなり、選択されている場合にチェック ボックスの状態を明示的に設定する必要もありません。 コントロールは画像を使用せず、チェック ボックスの状態は、トライステートのチェック ボックスで期待どおりに管理されます。 状態チェック ボックスの例では、ほとんどのインストール シナリオで検出が可能です。 状態チェック ボックスが使用されているとき、ユーザーが親ノードを選択すると、その親のすべての子も選択されます。 チェックボックスの操作は、ノードの展開/折りたたみ機能とは独立しています。 親ノードが折りたたまれているのとき (子が非表示のとき)、親ノードに付いているチェック マークは、すべての子も選択されていることを示します。 ただし、複数の子を持つ親の 1 つの子が選択されない場合、親ノードの外観が変化します。 チェックボックスにチェックマークは含まれなくなりましたが、記入されています。 この状態は、部分チェックと見なされます。 したがって、親ノードには 3 つの状態があります。
- 確認済
- 未チェック
- 部分的
ユーザーが部分的状態にある親ノードのチェック ボックスをクリックすると、親とそのすべての子の状態はチェックされた状態に変更されます。 (親ノードおよびそのすべての子ノードが選択されるようになります。)
部分的状態にある親ノード
親ノードが選択された後、チェックされた状態の親ノードおよびすべての子ノード
ユーザーがチェックされた状態にある親ノードのチェック ボックスをクリックすると、親とそのすべての子の状態は未チェックの状態に変更されます。 (親ノードおよびそのすべての子ノードが消去されるようになります。)
チェックされた状態にある親ノード
親ノードがクリアされた後、チェックされていない状態の親ノードおよびすべての子ノード
ユーザーが未チェック状態にある親ノードのチェック ボックスをクリックすると、親とそのすべての子の状態はチェックされた状態に変更されます。 (親ノードおよびそのすべての子ノードが選択されるようになります。)
未チェック状態にある親ノード
親ノードが選択された後、チェックされた状態の親ノードおよびすべての子ノード
子を持たない子ノード (つまり、それ自体が親ではない子ノード) には、2 つの状態: チェックされているか未チェックかしかありません。 チェックされた状態の唯一の子である子ノードは、その親の状態に影響します。 子ノードが選択されている場合、その親の状態は部分的な状態に変更されます。 注記: ツリー内の 1 つのノードにも、現在のノードであることを示す「選択」状態があります。 この状態は、チェックされた状態とは異なります。
Dynamics AX 2012 のチェック ボックスを含むツリー コントロール
次の例は、SysConfiguration の例です。
- プログラムは mouseDown イベントがないかどうかを確認します。
- mouseDown イベントが検出されると、プログラムによって、ユーザーがノードまたは画像のどちらをクリックしたかが決定されます。
- ユーザーが画像をクリックすると、プログラムはイメージの状態を切り替えます。
このコードは、現在のバージョンでは必要ありません。
int mouseDown(int x, int y, int button, boolean ctrl, boolean shift)
{
int idx,f;
FormTreeItem parentNode, node;
int parentMode;
boolean enabled;
#FormTreeControl;
[idx,f] = this.hitTest(x,y);
parentNode = this.getItem(this.getParent(idx));
node = this.getItem(idx);
if (node)
{
if(parentNode)
{
if (element.enabled(parentNode.data()))
parentMode = true;
}
else
parentMode = true;
if ((f & #FTCHT_ONITEMICON) && parentMode)
{
if (!node.overlayImage())
{
enabled = (element.enabled(this.getItem(idx).data()) ? false : true);
element.enabled(this.getItem(idx).data(), enabled);
element.drawTree();
}
return 1;
}
}
return super(x, y, button, ctrl, shift);
}
現在のバージョンでは、まだあらかじめ選択されているノードがユーザーに表示されるシナリオの選択されている状態を設定します。 また、開発者は、FormTreeItem の作成時に、状態を明示的にまだ設定することができます。 ただし、現在の画像を指定する代わりに、開発者は FormTreeItem の stateChecked プロパティを設定できます。 開発者は、チェック ボックスの状態がいつ変更されるかを知る必要がある場合、checkedStateChanged() メソッドをオーバーライドできます。
現在のバージョンのツリー コントロールに使用する基本的なチェック ボックス
モデル化されたツリー コントロールのチェック ボックス プロパティがはいに設定されていることを確認します。 ノードの状態を明示的に設定するには、次のコードを使用します。
formTreeItem.stateChecked(FormTreeCheckedState::Checked);
formTreeControl.setItem(formTreeItem);
現在の状態のノードを調べるには、次のコードを使用します。
FormTreeItem formTreeItem = formTreeControl.getItem(formTreeControl.getSelection());
FormTreeCheckedState currentState;
if (formTreeItem != null)
{
currentState = formTreeItem.stateChecked();
switch (currentState)
{
case FormTreeCheckedState::Unchecked:
/* unchecked */
break;
case FormTreeCheckedState::Checked:
/*checked */
break;
case FormTreeCheckedState::Partial:
/* parent has children checked */
break;
default:
/* shouldn’t get here */
break;
}
}
ノードのチェック状態 (idx はノード インデックス) に対応または追跡するには、次のコードを使用します。
public void checkedStateChanged(int _Idx, FormTreeCheckedState _newState)
{
super(_Idx, _newState);
}