展開可能なアイテムのリストを含むツリービューがあります。ユーザーが親ノードのチェックボックスをオンにすると、子ノードのチェックをシミュレートします。ただし、ユーザーは (親ノードだけでなく) 任意のノードを確認できます。ノードのチェックボックス イベントをトリガーするユーザーの最初のクリックと、子ノードのチェックボックスのシミュレートされたチェックを区別したいと考えています。
ユーザーのクリックを区別して、ツリービューの状態を変更前に保存できるようにします。
mousedown イベントを使用することを考えましたが、ユーザーがクリックして何かを展開する可能性があり、何も変更されていないためツリービューの状態を保存したくないため、これは機能しません。これを機能させる1つの方法は、各チェックボックスの位置の寸法を計算してから、マウスダウンのクリック座標を確認することですが、ノードをネストしてチェックボックスにいくつかの異なる列になる可能性があります。
これを考える別の方法は、イベントのグループをアクションに変えたいということです。したがって、1 つのアクションはユーザーの最初のアクションを表し、制御がユーザーに返されるまでに続くすべてのシミュレートされたアクションを表します。
別の考えとして、ウィンドウのフォーカスまたはコントロールで何かできるかもしれません。たとえば、シミュレート中にウィンドウがフォーカスされていない場合、ユーザーがツリー ノードのチェックボックスをチェックするアクション中にフォーカスの変更が発生した場合は、フォーカスの変更を保存できます。
追加情報
シミュレートされたチェックボックスのクリックは、次のようなコードによって呼び出されます。
e.Node.Checked = false;
これにより、次のイベントがトリガーされます: private void tree_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
ユーザーがノードをクリックすると、この AfterCheck イベントがトリガーされます。ここで木の状態を保存したい。ただし、AfterCheck イベント内で、他のノードをチェックして AfterCheck イベントが再度 n 回トリガーされる場合がありますが、今回はチェックボックスのチェックがシミュレートされました。
Systems.Windows.Forms.TreeView は、すべての場合において送信側オブジェクトです。