Messagebox.Show引发组合框SelectedIndex / Value Changed Events?

时间:2011-06-07 17:21:26

标签: c# data-binding event-handling

考虑将dataGridView绑定到强类型数据集的表单。顶部存在一个组合框,允许用户选择员工。选择后,gataGridView的数据集将根据员工的ID进行填充。

一些数据输入在dataGridView上完成,一旦完成,用户保存。为了防止用户意外移动到另一个员工并删除他们键入的内容,我提示他们保存数据集HasChanges()为真。

我在组合框的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.Show如何调用这两次?如果我评论这一点,这不会发生......

修改的 作为额外的信息,组合框AutoCompleteMode设置为SuggestAppend(显示下拉作为您的输入),DropDownStyle设置为DropDownList。

我将AutoCompleteMode更改为Append,这不再发生,似乎只发生在SuggestAppend Mode ...

1 个答案:

答案 0 :(得分:0)

我认为Sven可能是正确的MessageBox.Show将导致下拉失去焦点。

解决此问题的一种方法是检测事件是否已在类中使用私有布尔值执行。然后你会得到这样的东西:

private bool fIsInEvent = false;

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