Messagebox.Show поднимает поле со списком SelectedIndex / Значение измененных событий? - PullRequest
0 голосов
/ 07 июня 2011

Рассмотрим форму, в которой dataGridView привязан к строго типизированному набору данных.Вверху имеется поле со списком, позволяющее пользователю выбрать сотрудника.После выбора набор данных gataGridView заполняется на основе идентификатора сотрудника.

Некоторый ввод данных выполняется в dataGridView и после его завершения пользователь сохраняет данные.Чтобы пользователь случайно не перешел к другому сотруднику и не удалил то, что он набрал, я предлагаю сохранить его, так как набор данных HasChanges () имеет значение true.

Я ловил этот фрагмент кода в событии SelectedIndexChangedполе со списком, но это также вызывает событие в SelectedValueChanged

private void checkSaveChanges()
{
    this.Validate();
    this.laborTicketBindingSource.EndEdit();

    if (dP_LaborTicket.HasChanges())
    {
        DialogResult result = MessageBox.Show("Do you want to save your changes?", "Save before closing?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);

        if (result == DialogResult.Yes)
            this.tableAdapterManager.UpdateAll(this.dP_LaborTicket);
    }
}

Вот фрагмент события, которое возникает:

private void cmbEmployeeID_SelectedIndexChanged(object sender, EventArgs e)
{
    checkSaveChanges();

    if (cmbTransactionDate != null && cmbEmployeeID.SelectedValue != null)
    {
        string selectedDate = cmbTransactionDate.Value.ToString("MM/dd/yyyy");
        string selectedEmployee = cmbEmployeeID.SelectedValue.ToString();

        this.laborTicketTableAdapter.Fill(this.dP_LaborTicket.LaborTicket, selectedEmployee, selectedDate);
    }

}

Итак, зайдя в это, как только я изменю записьи перейти к другому сотруднику, он вступает в checkSaveChanges.Успешно проверяет и завершает редактирование и проверяет, есть ли в нем изменения (что он и делает).

После выполнения MessageBox.Show, программа внезапно отправляется обратно в событие cmbEmployeeID_SelectedIndexChanged, где она снова вызывает checkSaveChanges.Это происходит только дважды, и даже если они говорят «да» или «нет», код в блоке подсказок запускается.

Как в мире MessageBox. Как это вызывается дважды?Если я прокомментирую эту строку, этого не произойдет ...

РЕДАКТИРОВАТЬ В качестве дополнительной информации в поле со списком AutoCompleteMode было установлено значение SuggestAppend (Показывает раскрывающийся список при наборе текста) иDropDownStyle установлен в DropDownList.

Я изменил AutoCompleteMode на Append, и это больше не происходит, похоже, это происходит только в режиме SuggestAppend ...

1 Ответ

0 голосов
/ 08 июня 2011

Я думаю, Свен может быть прав, что MessageBox.Show приведет к тому, что раскрывающийся список потеряет фокус.

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

private bool fIsInEvent = false;

private void cmbEmployeeID_SelectedIndexChanged(object sender, EventArgs e)
{
  if (!fIsInEvent)
  {
    fIsInEvent = true;
    try
    {
      // your code
    }
    finally { fIsInEvent = false; }
  }
}
...