Скрытие ошибки в datagridviews - PullRequest
0 голосов
/ 01 апреля 2011

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

Я достигаю этого эффекта, назначая каждому из переключателей слева назначенное событие CheckChanged, которое проходит по всем элементам управления в tabpagecontrol.SelectedTab и вызывает .Show () для соответствующего представления данных и вызывает . Hide () для остальных , так что за один раз видна только одна сетка данных.

Моя проблема возникает, когда я пытаюсь программно проверить одну из этих радиокнопок. Допустим, в методе X я пишу RadioButtonA.checked = true. Это запускает обычную обработку события CheckedChange, которая перебирает все таблицы данных на текущей выбранной вкладке и вызывает .Hide () для всего, кроме одной формы таблицы данных, которую должна вызывать радиопереключатель, и вместо этого вызывает .Show (). Однако при одном из этих вызовов .Hide () в сетке просмотра данных он в конечном итоге вызывает событие RadioButtonA.CheckedChange AGAIN во второй раз. Когда я смотрю на аргумент отправителя, переданный функции, он показывает, что отправителем является RadioButton, на который я только что программно нажал.

Я добавляю эти таблицы данных программно и могу подтвердить, что им не назначены обработчики событий. Может ли кто-нибудь помочь мне определить причину, по которой вызывается это дополнительное событие? Спасибо.

1 Ответ

0 голосов
/ 02 апреля 2011

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

bool radioIng;

void MyMethod() {
  radioIng = true;
  try {
    radioButton1.Checked = true;
    // etc.
  } finally {
    radioIng = false;
  }
}

void radioButton_EventHandler(object sender, EventArgs e) {
  if (radioIng) return;
  // rest of code here
}

EDIT:

Кроме того, вы можете просто удалить все ваши обработчики событий и подключить их позже:

void MyMethod() {
  try {
    radioButton1.CheckChanged -= radioButton_EventHandler;
    radioButton2.CheckChanged -= radioButton_EventHandler;
    radioButton3.CheckChanged -= radioButton_EventHandler;
    // execute your code
    radioButton1.Checked = true;
  } finally {
    radioButton1.CheckedChanged += new EventHandler(radioButton_EventHandler);
    radioButton2.CheckedChanged += new EventHandler(radioButton_EventHandler);
    radioButton3.CheckedChanged += new EventHandler(radioButton_EventHandler);
  }
}

void radioButton_EventHandler(object sender, EventArgs e) {
  if (sender == radioButton1) {
    // code here to handle
  } else if (sender == radioButton2) {
    // code here to handle
  } else if (sender == radioButton3) {
    // code here to handle
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...