С чем вы связаны? Если это DataSet, DataTable и т. Д. Или, что еще лучше, BindingSource, вам следует вызвать EndEdit:
private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
// Assuming that you are binding to bindingSource1:
bindingSource1.EndEdit();
}
Я реализую ISave
интерфейс в моих формах для обработки грязного состояния и сохранения и всякий раз, когда проверяется грязное состояние (всякий раз, когда вызывается IsDirty), я всегда EndEdit в моем источнике привязки:
interface ISave
{
bool IsDirty;
bool Save(bool force);
}
С этим интерфейсом, когда, скажем, приложение закрывается, я могу легко перебирать свои открытые окна MdiChild, проверяя, сохранена ли какая-либо информация, путем приведения дочерней формы к ISave
и проверки значения IsDirty
. Здесь я вызываю EndEdit для соответствующего источника привязки или, если применимо, элемента управления привязкой (например, сетки).
И прости болтовню, но я подумал, что это может быть полезно. Остальное работает так:
Save()
принимает параметр «force», поэтому у меня может быть кнопка «Сохранить и закрыть» формы (сохраняет пользователю дополнительный щелчок или подтверждение, спрашивающее, хотят ли они сохранить свои изменения). Если force имеет значение false, метод Save()
отвечает за запрос пользователя, хочет ли он сохранить. Если это правда, предполагается, что пользователь уже решил, что он определенно хочет сохранить свою информацию, и это подтверждение пропускается.
Save()
возвращает bool- true, если безопасно продолжить выполнение вызывающего кода (предположительно событие Form_Closing). В этом случае (если force был false), с учетом YesBoCancel MessageBox, пользователь либо выбрал Да или Нет , и само сохранение не выдало ошибку. Или Save()
возвращает false в случае, если пользователь выбрал Отмена или произошла ошибка (другими словами, указание вызывающего кода для отмены закрытия формы).
Способ обработки ошибок зависит от ваших соглашений о перехвате исключений - это может быть зафиксировано в методе Save()
и отображено для пользователя, или, возможно, в событии, таком как FormClosing, где e.Cancel
будет тогда установлено в true .
При использовании с событием закрытия формы это будет выглядеть так:
private void form1_FormClosing(object sender, CancelEventArgs e)
{
if (IsDirty)
e.Cancel = !Save(false);
}
При принудительном сохранении с помощью кнопки «Сохранить и закрыть» это будет выглядеть так:
private void btnSaveAndClose_Click(object sender, EventArgs e)
{
if (IsDirty)
if (Save(true))
Close();
}
Во всяком случае, немного больше, чем вы просили, но я надеюсь, что это поможет!