Come distinguere utente vs modifiche programmatiche in WinForms CheckBox?
-
25-09-2019 - |
Domanda
Ho logica evento OnCheckedChanged di un CheckBox che gli incendi sul carico della forma, così come in caso di modifiche di utente di controllo Stato. Voglio la logica per eseguire solo su azione dell'utente.
C'è un modo chiazza di petrolio di rilevare utente vs cambiamento programmatico che non si basa sulla regolazione / controllo variabili utente?
Soluzione
Io di solito hanno una bandiera bool sulla mia forma che ho impostato a true prima che i valori di programmazione che cambiano. Poi il gestore di eventi può controllare quella bandiera per vedere se si tratta di un utente o programmatica.
Altri suggerimenti
Prova qualche buon vecchio riflessione?
StackFrame lastCall = new StackFrame(3);
if (lastCall.GetMethod().Name != "OnClick")
{
// Programmatic Code
}
else
{
// User Code
}
Lo Stack di chiamate è questa:
- Su clic
- set_Checked
- OnCheckChanged
Quindi è necessario tornare indietro 3 per differenziare chi SET Controllato
mi ricordo, però, ci sono alcune cose che possono pasticciare con lo stack di chiamate, non è affidabile al 100%, ma è possibile estendere questo un po 'per cercare la fonte originaria.
Ho provato questo e ha funzionato.
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");
}