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?

È stato utile?

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");
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top