Лучший способ приостановить события управления в Windows Forms?

Вы можете установить Android: layout_weight = "0,4" и Android: layout_weight = "0,6"

10
задан Peter Mortensen 8 April 2016 в 21:35
поделиться

5 ответов

Я столкнулся с этим прежде и обычно видел, что люди делают это:

/*SNIP*/

private bool isMassUpdate;

public void Check1_Check(object sender, EventArgs e)
{
   if(!isMassUpdate)
   {
       do some stuff
   }
}

/*SNIP*/

Можно также отсоединить и повторно прикрепить обработчики событий, однако, мне говорят, что это может быть источником утечек памяти.

Информация об утечках памяти и обработчиках событий: они непосредственно не связаны с присоединением и отсоединением, но мы видели в одном из наших приложений, что плохая ссылка обработчиков событий вниз деревья наследования может вызвать его.

6
ответ дан 3 December 2019 в 21:23
поделиться

Что я делаю в этих случаях вместо того, чтобы иметь булево значение, которое приостанавливает события, я использую счетчик. Когда количество будет> 0, затем приостановите события, когда количество = 0, затем возобновите события. Это помогает с проблемой, если у меня есть несколько вещей, которые могли бы запросить приостановку событий.

Другая полезная вещь состоит в том, если я должен приостановить события в блоке, я создаю немного класса помощника, который является IDisposable, который я могу использовать в блоке "использования" (в C#), таким образом, я не забываю постепенно уменьшать счетчик, после того как я вне объема.

5
ответ дан 3 December 2019 в 21:23
поделиться

От Вашего другого вопроса я собираюсь предположить, что Вы используете.NET VB. Так, RemoveHandler является Вашим лучшим выбором. Обычно у людей VB настраивает обработчики событий с помощью пункта Дескрипторов. Но можно также сделать это этот путь:

AddHandler chk1.CheckedChanged, AddressOf DoSomething

где DoSomething мог бы быть похожим на это:

Private Sub DoSomething(ByVal sender As Object, ByVal e As EventArgs)
    ' whatever
End Sub

AddHandler обеспечивает электричеством событие, таким образом, он будет стрелять. Чтобы заставить это не стрелять, используйте RemoveHandler:

RemoveHandler chk1.CheckedChanged, AddressOf DoSomething

Прежде, чем обновить свойство Checked Ваших дочерних флажков, назовите RemoveHandler на каждом из них; затем, когда Вы сделаны, назовите AddHandler для откладывания обработчиков событий. Если все Ваши флажки используют тот же обработчик, можно поместить их в набор и цикл через набор, чтобы добавить или удалить обработчики.

3
ответ дан 3 December 2019 в 21:23
поделиться

Вы могли также рассмотреть события 'щелчка' обработки для кнопок, а не измененный на проверку. Это могло бы быть ближе к Вашему намерению.

1
ответ дан 3 December 2019 в 21:23
поделиться

В моем приложении Visual Basic 6.0 я должен был обработать пользователей, дважды щелкающих по всему, таким образом, на всех моих обработчиках событий у меня есть одна строка, которая проверяет глобальную переменную

Private bSuspendEvents as Boolean

Private Sub Button1_Click()

    On Error Goto ErrorHandler

    If bSuspendEvents then Exit Sub

    bSuspendEvents = True

    'Do stuff

    NormalExit:
        bSuspendEvents = False
        Exit Sub

    ErrorHandler:
        'Handle Error
        Resume NormalExit

End Sub
1
ответ дан 3 December 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: