フォームの読み込み時とユーザーがチェック状態を変更したときに発生する CheckBox の OnCheckedChanged イベントにロジックがあります。ユーザーのアクション時にのみロジックを実行したい。
ユーザー変数の設定/チェックに依存しない、ユーザー対プログラムによる変更を検出する巧妙な方法はありますか?
フォームの読み込み時とユーザーがチェック状態を変更したときに発生する CheckBox の OnCheckedChanged イベントにロジックがあります。ユーザーのアクション時にのみロジックを実行したい。
ユーザー変数の設定/チェックに依存しない、ユーザー対プログラムによる変更を検出する巧妙な方法はありますか?
私は通常、プログラムで値を変更する前に true に設定した bool フラグをフォームに持っています。その後、イベント ハンドラーはそのフラグをチェックして、それがユーザーまたはプログラムによるものかどうかを確認できます。
古き良き反射を試してみませんか?
StackFrame lastCall = new StackFrame(3);
if (lastCall.GetMethod().Name != "OnClick")
{
// Programmatic Code
}
else
{
// User Code
}
コール スタックは次のようになります。
そのため、SET チェックを行ったユーザーを区別するには、3 に戻る必要があります。
ただし、呼び出しスタックを台無しにする可能性のあるものがあることを覚えておいてください。100% 信頼できるわけではありませんが、元のソースを検索するためにこれを少し拡張できます。
私はこれを試してみましたが、うまくいきました。
bool user_action = false;
StackTrace stackTrace = new StackTrace();
StackFrame[] stackFrames = stackTrace.GetFrames();
foreach (StackFrame stackFrame in stackFrames)
{
if(stackFrame.GetMethod().Name == "WmMouseDown")
{
user_action = true;
break;
}
}
if (user_action)
{
MessageBox.Show("User");
}
else
{
MessageBox.Show("Code");
}