WinForms: временно отключите обработчик событий

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

let parent
function removeItem (obj, itemToFind) {
	// Loop the object
  obj.find((e, index) => {
		// If the id's match remove from the parent if it exists otherwise from the object as its at root level
    if (e.id === itemToFind.id) {
      if (parent) {
        parent.children.splice(index, 1)
      } else {
        obj.splice(index, 1)
      }
			// break the loop once returned true. Change find to forEach to remove all instances with id if allowing multiples
      return true
    }
		// recurse
    else if (e.children && e.children.length > 0) {
      parent = e
      return removeItem(e.children, itemToFind)
    }
  })
}
// move item, return updated obj
function moveItem (itemToMove, obj, parentId) {
  for (let i = 0; i < obj.length; i++) {
    const value = obj[i]
    const item = search(obj[i], parentId)
    if (item) {
      item.children.push(itemToMove) // pushed into children, but need to move not duplicate in
      break
    }
  }

  function search (obj, id) {
    if (obj.id === id) {
      return obj
    }

    for (let i = 0; i < obj.children.length; i++) {
      const possibleResult = search(obj.children[i], id)
      if (possibleResult) {
        return possibleResult
      }
    }
  }

  return obj
};
removeItem(myObj, itemToMove)
moveItem(itemToMove, myObj, 3)

30
задан George 13 April 2009 в 16:54
поделиться

2 ответа

Вероятно, самый простой способ (который не требует отписки или другого материала) - объявить логическое значение и проверить это в начале обработчика:

bool dontRunHandler;

void Handler(object sender, EventArgs e) {
   if (dontRunHandler) return;

   // handler body...
}
51
ответ дан 27 November 2019 в 23:05
поделиться

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

object.Event -= new EventHandlerType(your_Method);

Это удалит этот метод из списка делегатов, и вы можете снова присоединить его позже с помощью

object.Event += new EventHandlerType(your_Method);
.
50
ответ дан 27 November 2019 в 23:05
поделиться
Другие вопросы по тегам:

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