/// <summary>
 /// Raises the DataSaveExecuting event.
 /// </summary>
 /// <param name="e">Data that contains the binder's saving event information.</param>
 protected virtual void OnDataSaveExecuting(DataBinderSavingEventArgs e)
 {
     if (DataSaveExecuting != null) DataSaveExecuting(this, e);
 }
        private void SaveButton_Click(object sender, EventArgs e)
        {
            object _button = sender;
            if (_button == null) return;
            bool _enabled = Materia.GetPropertyValue<bool>(_button, "Enabled", true);
            if (!_enabled) return;

            _saving = false; GridFinishEdit(); DataBinderValidationEventArgs _args = Validate();

            if (_args != null)
            {
                if (!_args.Valid)
                {
                    if (_args.Control != null)
                    {
                        if (_args.Control.GetType().Name.ToLower().Contains("C1FlexGrid".ToLower()) ||
                            _args.Control.GetType().BaseType.Name.ToLower().Contains("C1FlexGrid".ToLower()))
                        {
                            if (!String.IsNullOrEmpty(_args.Notification.RLTrim()))
                            {
                                SetControlFocus((Control) _args.Control); MessageBox.Show(_args.Notification, "Entry Validation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                                bool _allowediting = true;

                                try { _allowediting = Materia.GetPropertyValue<bool>(_args.Control, "AllowEditing", true); }
                                catch { }

                                if (_allowediting)
                                {
                                    int _row = -1; int _col = -1;

                                    try { _row = Materia.GetPropertyValue<int>(_args.Control, "Row", -1); }
                                    catch { }

                                    try { _col = Materia.GetPropertyValue<int>(_args.Control, "Col", -1); }
                                    catch { }

                                    if (_row > -1 &&
                                        _col > -1)
                                    {
                                        try { Materia.InvokeMethod(_args.Control, "StartEditing", new object[] { _row, _col }); }
                                        catch { }
                                    }
                                }
                            }

                            return;
                        }
                        else return;
                    }
                    else return;
                }
                else
                {
                    if (_args.Cancel) return;
                }


                _enabled = Materia.GetPropertyValue<bool>(_button, "Enabled", true);
                try { Materia.SetPropertyValue(_button, "Enabled", false); }
                catch { }
                CancelRunningProcess = false; _saving = true;

                Action _valuesetdelegate = new Action(SetFieldValues);
                IAsyncResult _valuesetresult = _valuesetdelegate.BeginInvoke(null, _valuesetdelegate);

                while (!_valuesetresult.IsCompleted &&
                       !CancelRunningProcess)
                {
                    OnDataGathering(new EventArgs());
                    Thread.Sleep(1); Application.DoEvents();
                }

                if (CancelRunningProcess)
                {
                    if (!_valuesetresult.IsCompleted)
                    {
                        try { _valuesetresult = null; }
                        catch { }
                    }

                    try { Materia.SetPropertyValue(_button, "Enabled", _enabled); }
                    catch { }

                    Materia.RefreshAndManageCurrentProcess(); _saving = false; return;
                }

                _valuesetdelegate.EndInvoke(_valuesetresult);

                Action _fksetdelegate = new Action(SetForeignKeys);
                IAsyncResult _fksetresult = _fksetdelegate.BeginInvoke(null, _fksetdelegate);

                while (!_fksetresult.IsCompleted &&
                       !CancelRunningProcess)
                {
                    OnDataGathering(new EventArgs());
                    Thread.Sleep(1); Application.DoEvents();
                }

                if (CancelRunningProcess)
                {
                    if (!_fksetresult.IsCompleted)
                    {
                        try { _fksetresult = null; }
                        catch { }
                    }

                    try { Materia.SetPropertyValue(_button, "Enabled", _enabled); }
                    catch { }

                    Materia.RefreshAndManageCurrentProcess(); _saving = false; return;
                }

                _fksetdelegate.EndInvoke(_fksetresult);

                Func<string> _sqlgetdelegate = new Func<string>(Binding.GetUpdateStatements);
                IAsyncResult _sqlgetresult = _sqlgetdelegate.BeginInvoke(null, _sqlgetdelegate);

                while (!_sqlgetresult.IsCompleted &&
                       !CancelRunningProcess)
                {
                    OnDataGathering(new EventArgs());
                    Thread.Sleep(1); Application.DoEvents();
                }

                if (CancelRunningProcess)
                {
                    if (!_sqlgetresult.IsCompleted)
                    {
                        try { _sqlgetresult = null; }
                        catch { }
                    }

                    try { Materia.SetPropertyValue(_button, "Enabled", _enabled); }
                    catch { }

                    Materia.RefreshAndManageCurrentProcess(); _saving = false; return;
                }

                string _sql = _sqlgetdelegate.EndInvoke(_sqlgetresult);
                try { Materia.SetPropertyValue(_button, "Enabled", _enabled); }
                catch { }

                DataBinderSavingEventArgs _saveargs = new DataBinderSavingEventArgs(_sql);
                OnBeforeDataSave(_saveargs); AcceptUpdates();

                if (!_saveargs.Cancel)
                {
                    try { Materia.SetPropertyValue(_button, "Enabled", false); }
                    catch { }

                    _sql = "";

                    Func<string> _sqlgetfinaldelegate = new Func<string>(Binding.GetUpdateStatements);
                    IAsyncResult _sqlgetfinalresult = _sqlgetfinaldelegate.BeginInvoke(null, _sqlgetfinaldelegate);

                    while (!_sqlgetfinalresult.IsCompleted &&
                           !CancelRunningProcess)
                    {
                        OnDataGathering(new EventArgs());
                        Thread.Sleep(1); Application.DoEvents();
                    }

                    if (CancelRunningProcess)
                    {
                        if (_sqlgetfinalresult != null)
                        {
                            try { _sqlgetfinalresult = null; }
                            catch { }
                        }

                        try { Materia.SetPropertyValue(_button, "Enabled", _enabled); }
                        catch { }

                        Materia.RefreshAndManageCurrentProcess(); _saving = false; return;
                    }

                    string _query = _sqlgetfinaldelegate.EndInvoke(_sqlgetfinalresult);

                    if (WithBlobDataSource())
                    {
                        if (!String.IsNullOrEmpty(_query.RLTrim()))
                        {
                            if (!_query.RLTrim().ToLower().StartsWith("set global max_allowed_packet")) _sql = "SET GLOBAL max_allowed_packet = (1024 * 1204) * " + MySql.MaxAllowedPacket.ToString() + ";";
                        }
                    }

                    _sql += ((!String.IsNullOrEmpty(_sql.RLTrim())) ? "\n" : "") + _query;

                    if (String.IsNullOrEmpty(_sql.RLTrim()))
                    {
                        try { Materia.SetPropertyValue(_button, "Enabled", _enabled); }
                        catch { }

                        Materia.RefreshAndManageCurrentProcess(); _saving = false; return;
                    }

                    _saveargs.CommandText = _sql;
                    OnDataSaveExecuting(_saveargs);

                    if (_saveargs.Cancel)
                    {
                        try { Materia.SetPropertyValue(_button, "Enabled", _enabled); }
                        catch { }

                        Materia.RefreshAndManageCurrentProcess(); _saving = false; return;
                    }

                    _sql = _saveargs.CommandText;
                    IAsyncResult _saveresult = Que.BeginExecution(Connection, _sql, CommandExecution.ExecuteNonQuery);

                    while (!_saveresult.IsCompleted &&
                           !CancelRunningProcess)
                    {
                        OnDataSaving(new EventArgs());
                        Thread.Sleep(1); Application.DoEvents();
                    }

                    if (CancelRunningProcess)
                    {
                        if (!_saveresult.IsCompleted)
                        {
                            try { _saveresult = null; }
                            catch { }
                        }

                        try { Materia.SetPropertyValue(_button, "Enabled", _enabled); }
                        catch { }

                        Materia.RefreshAndManageCurrentProcess(); _saving = false; return;
                    }

                    QueResult _result = Que.EndExecution(_saveresult); _saveargs = null;

                    if (_result == null)
                    {
                        try { Materia.SetPropertyValue(_button, "Enabled", _enabled); }
                        catch { }

                        Materia.RefreshAndManageCurrentProcess(); _saving = false; return;
                    }
                    else
                    {
                        if (!String.IsNullOrEmpty(_result.Error.RLTrim())) _saveargs = new DataBinderSavingEventArgs(_sql, _result.Error);
                        else _saveargs = new DataBinderSavingEventArgs(_sql, _result.RowsAffected);

                        if (!String.IsNullOrEmpty(_result.Error.RLTrim())) _saveargs.ErrorNotification = "An error occured while trying to save the changes and updates to the current record(s). Please try again and\n/ or report this issue to the system administrator.";
                        else
                        {
                            Action _updatedelegate = new Action(Update);
                            IAsyncResult _updateresult = _updatedelegate.BeginInvoke(null, _updatedelegate);

                            while (!_updateresult.IsCompleted)
                            {
                                OnDataLoading(new EventArgs());
                                Thread.Sleep(1); Application.DoEvents(); 
                            }

                            _updatedelegate.EndInvoke(_updateresult);
                        }

                        try { Materia.SetPropertyValue(_button, "Enabled", _enabled); }
                        catch { }
                        Materia.RefreshAndManageCurrentProcess(); _saving = false;
                        AcceptUpdates(); OnAfterDataSave(_saveargs);

                        if (!String.IsNullOrEmpty(_saveargs.Error.RLTrim()) &&
                            !String.IsNullOrEmpty(_saveargs.ErrorNotification.RLTrim())) MessageBox.Show(_saveargs.ErrorNotification, "Record Update Failed", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);

                        if (!_saveargs.Cancel)
                        {
                            AcceptAllChanges(); _haveupdates = false;

                            Form _form = null;

                            try { _form = (Form)ContainerControl; }
                            catch { _form = null; }

                            if (_form != null)
                            {
                                if (_form.Text.RLTrim().EndsWith("*")) _form.Text = _form.Text.Replace("*", "");
                            }
                        }
                    }
                }
            }


        }
 /// <summary>
 /// Raises the BeforeDataSave event.
 /// </summary>
 /// <param name="e">Data that contains the binder's saving event information.</param>
 protected virtual void OnBeforeDataSave(DataBinderSavingEventArgs e)
 {
     if (BeforeDataSave != null) BeforeDataSave(this, e);
 }
 /// <summary>
 /// Raises the AfterDataSave event.
 /// </summary>
 /// <param name="e">Data that contains the binder's saving event information.</param>
 protected virtual void OnAfterDataSave(DataBinderSavingEventArgs e)
 {
     if (AfterDataSave != null) AfterDataSave(this, e);
 }