Как я могу определить, было ли событие вызвано действием пользователя или кодом? - PullRequest
3 голосов
/ 23 июня 2010

У меня есть куча элементов управления на форме, и все их события "изменения" указывают на один и тот же обработчик событий. Вот некоторые из них: TextChanged в txtInput1 *, CheckedChanged в chkOption1 * и SelectedIndexChanged в cmbStuff1. Вот обработчик события:

private void UpdatePreview(object sender, EventArgs e)
{
    // TODO: Only proceed if event was fired due to a user's clicking/typing, not a programmatical set
    if (sender.IsSomethingThatTheUserDid) // .IsSomethingThatTheUserDid doesn't work
    {
        txtPreview.Text = "The user has changed one of the options!";
    }
}

Я бы хотел, чтобы оператор if выполнялся только тогда, когда пользователь изменяет текст TextBox или нажимает флажок или что-то еще. Я не хочу, чтобы это произошло, если текст или флажок был изменен какой-либо другой частью программы.

Ответы [ 2 ]

9 голосов
/ 23 июня 2010

Нет встроенного механизма для этого.Однако вы можете использовать флаг.

bool updatingUI = false;

private void UpdatePreview(object sender, EventArgs e)
{
    if (updatingUI) return;

    txtPreview.Text = "The user has changed one of the options!";
}

Затем, когда вы обновляете пользовательский интерфейс с помощью своего кода:

updatingUI = true;

checkBox1.Checked = true;

updatingUI = false;

Если вы хотите перестроить решение,Вы можете использовать что-то вроде этого:

private void UpdateUI(Action action)
{
    updatingUI = true;

    action();

    updatingUI = false;
}

И использовать это так:

UpdateUI(()=>
{
    checkBox1.Checked = true;
});
0 голосов
/ 23 июня 2010

Разве вы не можете просто проверить отправителя?Если он вызывается из проводного события в элемент управления UI, он возвращается вместе с элементом управления.Если вы запускаете событие из кода, это будет либо компонент, выполняющий вызов, либо вы можете сделать его как угодно:

private void SomewhereElse()
{
   UpdatePreview(null, new EventArgs());
}

private void UpdatePreview(object sender, EventArgs e)
{
    if (sender == null) 
    {
        txtPreview.Text = "The user has changed one of the options!";
    }
}

или вы можете сделать это:

private void UpdatePreview(object sender, EventArgs e)
{
    if (!(sender is Control)) 
    {
        txtPreview.Text = "The user has changed one of the options!";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...