1

展開可能なアイテムのリストを含むツリービューがあります。ユーザーが親ノードのチェックボックスをオンにすると、子ノードのチェックをシミュレートします。ただし、ユーザーは (親ノードだけでなく) 任意のノードを確認できます。ノードのチェックボックス イベントをトリガーするユーザーの最初のクリックと、子ノードのチェックボックスのシミュレートされたチェックを区別したいと考えています。

ユーザーのクリックを区別して、ツリービューの状態を変更前に保存できるようにします。

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 は、すべての場合において送信側オブジェクトです。

4

2 に答える 2

1

CheckBox.Clickイベントに参加しましたか?

これにより、ユーザーがクリックして変更を加えていることが簡単にわかります。

フラグを使用して、発生したイベントがメソッドが変更を行っていたことが原因であることを示すこともできます。これはWindowsフォームであるため、プロセスが終了するまでユーザーは別のチェックボックスをオンにできません(したがって、レースウェイの状態はありません)。

/// <summary>
/// Flag which can be accessed by the checkboxes which indicates if the program is making the change or the user is.
/// </summary>
bool programmaticallySettingChecks { get; set; }

protected void FlagExample()
{
    CheckBox[] chToCheck = new CheckBox[10];        //Collection of checkboxes to set the Checked property on.

    programmaticallySettingChecks = true;

    for (int i = 0; i < chToCheck.Length; i++)
    {
        chToCheck[0].Checked = true;
    }

    programmaticallySettingChecks = false;
}

protected void Check_Clicked(Object sender, EventArgs e)
{
    if (programmaticallySettingChecks)
    {
        //do things which are done if setting programmatically.
    }
    else
    {
        //Do things which are done if user sets.
    }

}
于 2012-12-13T20:09:54.837 に答える
0

試したコードを教えていただけますか?

ユーザーが親ノードのみをクリックし、子ノードのみを選択する場合は、イベント トリガー中に「親ノードの場合は実行、そうでない場合は戻る」という簡単なチェックを行うことができます。

于 2012-12-13T20:08:15.903 に答える