Привет, я новичок в программировании, и у меня возникли некоторые проблемы с использованием обработчиков событий только один раз

bool Tclick = false;
if (Tclick == false)
{
    txt1.Click += new EventHandler((o, e) => { txt1.Text = ""; Tclick = true; });
}

}

Я пытался сделать это, потому что думал, что если я установлю переменную «tclick» в значение true, обработчик событий больше не будет работать, потому что «Tclick» должен быть ложным для запуска обработчика событий, но обработчик событий все равно работает.

Подумайте, когда оценивается утверждение if (Tclick == false) (подсказка: это случается гораздо реже, чем вы думаете...). Используйте пошаговый отладчик для пошагового выполнения программы.

Dai 25.08.2024 13:34

Вам нужен логический флаг? Почему бы вместо этого не удалить обработчик событий?

Thomas Weller 25.08.2024 13:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы показали 2 возможных способа сделать то, что хотите, но оба используются неправильно (или совершенно неполно):

  1. «На основе флага», через переменную bool. В этом случае вам следует поместить условие внутрь обработчика и просто вернуться из него, если флаг равен true, например:
// Declare "flag" (preferrably in class, not method, scope
private bool Tclick;

// Setup anonymous handler 
txt1.Click += (sender, args) =>
{
    // Check here for was it previously called or not and return if was
    if (Tclick)
        return;

    txt1.Text = "";
    Tclick = true;
});
  1. Добавление/удаление обработчика. В этом случае вы можете полностью избежать использования логического флага и просто удалить обработчик после завершения. Но для этого нужно уйти от анонимного делегата и явно объявить его:

// Somewhere (or through Designer) you append the delegate once:
txt1.Click += OnTxtClick;

// Declare handler
private void OnTxtClick(object sender, EventArgs args)
{
    // Do neccessary stuff...
    txt1.Text = "";
    
    // Remove the handler
    txt1.Click -= OnTxtClick;
}

Во-вторых, если в каком-то случае вам нужно снова сделать кликабельным txt1 - вам просто нужно снова добавить делегата: txt1.Click += OnTxtClick;

УПД: Объяснение, почему первоначальный подход не работает.

Ваш логический флаг не указывает, должен ли обработчик выполняться или нет. Он решает, добавлять обработчик или нет. Как только вы добавите его (когда флаг равен false) - он останется, вы не удалите обработчик, и поскольку флаг не проверяет, выполняться или нет, обработчик все равно выполняется при каждом следующем клике. Итак, мои предложенные подходы описывают два способа, которые вы пропустили: либо проверить и предотвратить выполнение с помощью логического флага, либо просто полностью удалить обработчик после выполнения.

Хороший ответ! Я думаю, вы могли бы добавить краткий комментарий о том, почему код ОП не делает то, что они ожидают.

lax48 25.08.2024 14:13

@ lax48 обновил ответ, ты

Auditive 25.08.2024 14:20

Тысм, братан, я попробовал первый, и он сработал, я попробую другой для практики, ха-ха, и твое объяснение очень ценно, ха-ха-ха, теперь я наконец понял

MJ Ongaria 25.08.2024 15:50

Другие вопросы по теме