Отмена подписки на событие _Leave не работаетC#

Место общения программистов C#
Ответить
Anonymous
 Отмена подписки на событие _Leave не работает

Сообщение Anonymous »

Это очень простая задача, но ее немного сложно объяснить (отсюда и диаграммы).

У меня есть ListView. При нажатии на элемент панель обновляется с данными выбранного элемента.

Каждый элемент имеет значение свойства 1 или 2.

Я хочу, чтобы вкладка TabControl выбиралась на панели после значения 1 или 2.
Изображение

Панель имеет событие Leave.

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

Когда элементы ListView с последовательным щелчком имеют одно и то же свойство (1 или 2), TabControl остается неизменным.
Изображение

Проблема возникает, когда TabControl необходимо изменить (с 1 на 2 или наоборот).
Изображение

Событие `Leave` срабатывает, даже если указатель мыши не наведен на панель. Это приводит к неожиданному сохранению элемента ListView сразу после щелчка по нему во время отображения, с побочными эффектами и (я сильно подозреваю) потерей данных.

Моей первоначальной идеей было предотвратить возникновение события «Покинуть» панели во время обновления панели.
DonneesPanel.Leave -= DonneesPanel_Leave;

затем, после отображения:
DonneesPanel.Leave += DonneesPanel_Leave;

Это не работает. Не понимаю почему, тем более:
DonneesPanel.Enter -= DonneesPanel_Enter;
DonneesPanel.Enter += DonneesPanel_Enter;

работает!
Обзор: всякий раз, когда TabControl необходимо изменить, запускается событие _Leave панели. Форма, которая в данный момент загружается, сохраняется, и я не могу это предотвратить.
При щелчке по элементу ListView я могу обновить все в панели, включая TabControl.
Это только, когда свойства выбранного элемента требуют изменения вкладки TabControl, после отображения запускается событие выхода из панели.
Это то, чего я хочу избежать.
/>Я не использую специальный элемент управления. TabControl, ListView и Panel — из Windows Forms.
Спасибо за вашу помощь.
Изменить: Stackoverflow просит меня включить код в мой вопрос, иначе на него не будет ответа. Не понимаю почему, но вот код, который не научит вас ничему большему, чем то, что я уже объяснил.
private void ArticlesListView_SelectedIndexChanged(object sender, EventArgs e)
{
//DonneesPanel.Leave -= DonneesPanel_Leave; // Works here, but it is impossible to resubscribe programmatically throughout the entire procedure, without triggering the _Leave event of donneesPanel.
int Cle = int.Parse(ArticlesListView.SelectedItems[0].Tag.ToString());
Display_Article(Cle);
}

private void Display_Article(int ClePrimaire)
{
DonneesPanel.Leave -= DonneesPanel_Leave; // doesn't work here

Console.WriteLine("Displaying other data");

if (ArticleRow["Vendu"].ToString() == "1")
{
VenduCheck.Checked = true;
VenduLabel.Text = "VENDU";
VenduLabel.ForeColor = Color.DarkCyan;
VenduLabel.Font = fBold;
DateSortie.Visible = true;

ElemCommerceTab.SelectedTab = ElemCommerceTab.TabPages[0]; //

Подробнее здесь: https://stackoverflow.com/questions/798 ... s-not-work
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»