提示用户在 DavaGridView_RowLeave 上保存当前行

Prompting message to user to Save the current row on DavaGridView_RowLeave

我有两个可由用户编辑的 DataGridView。 当用户 select DataGridViewA 中的一行时,DatagridViewB 会相应地填充不同的数据。

在 DataGridViewA 中编辑当前行后,用户可以单击保存按钮。如果他没有保存并且 select DataGridViewA 中的另一行,将向用户提示保存消息,询问他是否要在移动到另一行之前保存。 (我有一种方法可以检查是否有更改,如果有,则提示用户是否要保存 - 是:保存,否:恢复数据)。

检查是否有变化的方法在DataGridViewA_Leave()上触发。原因是我在离开该行之前有 DataGridViewA.CurrentRow 的信息,所以我可以在需要时保存。

问题是,如果我单击表单上的任何其他控件,例如“保存”按钮,则会向用户提示“保存”消息(因为 DataGridViewA.CurrentRow 已保留)。在这种情况下,我不希望用户收到消息。

我找到了修复它的解决方法,但我认为这不是最好的方法。在提示消息之前,我正在检查“保存”按钮是否具有焦点。需要对我不想在单击它们时收到保存消息的所有控件进行此检查。

有没有更好的办法解决这个问题?

我的代码,记录状态是Added(用户添加一行)或Edited(用户更新一些数据):

private void AlternateDGV_RowLeave(object sender, DataGridViewCellEventArgs e)
    {            
        if (IsSaveNeeded)
        {
            if (SaveButton.Focused) // This is the work around
            {
                return;
            }

            if (!WasSavedPerUserRequest())
            {
                var recordstate = AlternateDGV.CurrentRow.Cells[Glossary.RecordStateName].Value.ToString();
                if (recordstate == Glossary.AddedRecordState)   // if it was a new row added and the user doesn't want to save
                {                        
                    AlternateDGV.CurrentRow.Delete();
                }
                else if (recordstate == Glossary.EditedRecordState) // if it was a row from DB and the user doesn't want to save, refresh with saved data
                {
                    AlternateDGV.CurrentRow.Refresh(_items);
                }
            }
        }
    }

我想一旦用户在行级别单击编辑按钮,你就可以看到 'Save' 按钮,因此当用户单击编辑按钮并突然离开该行时,你可以在你的行级别检查保存按钮的可见性AlternateDGV_RowLeave 事件如果仍然可见则表示用户尚未单击保存按钮,您可以提示用户。

在我看来,您应该改变用于加载数据和管理网格的方法。

如果您使用 DataGridViewA.SelectionChanged 事件加载 DataGridViewB 中的数据,您应该能够检查未保存的更改,然后重新加载 DataGridViewB 内容。

注意:SelectionChanged事件只有在选中的行发生改变后才会触发,所以在DataGridViewB中加载行时至少要保存当前选中行的索引,所以您可以在选择新行时检查正确的行。

例如:

void DataGridViewA_SelectionChange(object sender, EventArgs e)
{
   if (previousSelectedIndex != -1)
   {
      //Check for changes end if necessary prompt the message
      [...]
   }

   //Load data in DataGridViewB
   [...]

   previousSelectedIndex = dataGridViewA.SelectedRows[0].Index;
}

编辑:

另一个解决方案可能是检查网格是否仍然具有焦点。如果没有,那么用户点击了网格外,你就不用提示信息了。

private void DataGridViewA_RowLeave(object sender, DataGridViewCellEventArgs e)
    {            
        if (IsSaveNeeded)
        {
            if (dataGridViewA.Focused == false)
            {   //DataGridViewA without focus, then nothing to do
                return;
            }

            if (!WasSavedPerUserRequest())
            {
                var recordstate = AlternateDGV.CurrentRow.Cells[Glossary.RecordStateName].Value.ToString();
                if (recordstate == Glossary.AddedRecordState)   // if it was a new row added and the user doesn't want to save
                {                        
                    AlternateDGV.CurrentRow.Delete();
                }
                else if (recordstate == Glossary.EditedRecordState) // if it was a row from DB and the user doesn't want to save, refresh with saved data
                {
                    AlternateDGV.CurrentRow.Refresh(_items);
                }
            }
        }
    }