public void EditObject <T>(IPropertyEditableObject value) where T : class
        {
            if (value != null)// && value.Action != EPropertyEditAction.None)
            {
                IValidator <T> validator = null;
                if (_validationProvider != null)
                {
                    validator = _validationProvider.GetValidator <T>();
                    if (validator != null)
                    {
                        _validate = () =>
                        {
                            if (validator.IsValid(value.Object as T))
                            {
                                return(true);
                            }
                            var msg = validator.GetErrorMessages(value.Object as T);
                            _message.ShowUserMessage(UserMessageCategories.Error, "Validation error", "Entity has some invalid values:\r\n" + string.Join("\r\n", msg));
                            return(false);
                        };
                    }
                    else
                    {
                        _validate = () => true;
                    }
                }
            }

            if (_editedObject == null || _editedObject.Action == EPropertyEditAction.None)
            {
                goto set_value;
            }
            if (!_editedObject.IsNew && !_editedObject.IsDirty)
            {
                goto set_value;
            }


            try
            {
                if (_editedObject.Action == EPropertyEditAction.Autosave)
                {
                    SaveEditedObject();
                }
                else
                {
                    DialogResult result = _message.ShowUserMessage(UserMessageCategories.YesNo, "Save object", "Do you want to save the changes to the object?");
                    if (result == System.Windows.Forms.DialogResult.OK || result == System.Windows.Forms.DialogResult.Yes)
                    {
                        SaveEditedObject();
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }
set_value:
            _editedObject = value;
            propertyGrid.SelectedObject = (_editedObject == null) ? null : _editedObject.Object;
            CheckDBSaveStatus();
            return;
        }
 private void tsbCancel_Click(object sender, EventArgs e)
 {
     propertyGrid.SelectedObject = null;
     _editedObject = null;
     CheckDBSaveStatus();
 }