/// <summary>Процесс сохранения данных из редактора</summary> protected bool SaveData() { error.Clear(); // принудительно заносим из контролов в объект-источник foreach (var b in Source.CurrencyManager.Bindings) { (b as Binding).WriteValue(); } var eaSaveParams = new ParamsCheckEventArgs { Pars = CtrlsProc.PrepareParams(SourceObject) }; SaveParamsCheck?.Invoke(this, eaSaveParams); var errs = eaSaveParams.CheckResult; CheckData(eaSaveParams.Pars, errs); if (errs?.Count > 0) { var msg = new StringBuilder(); foreach (var err in errs) { var c = this.GetControl(err.Key, true, Source) ?? this.GetControl(err.Key); if (c != null) { error.SetError(c, err.Value); } else { msg.AppendLine(err.Value); } } if (msg.Length > 0) { Loger.SendMess($"Ошибки ввода данных!\n{msg}", true); } return(false); } var eaSetData = new ProcessDataEventArgs() { Pars = eaSaveParams.Pars }; SetData?.Invoke(this, eaSetData); object res = null; var dt = (eaSetData.Result as DataTable); if (dt != null) { res = dt.Rows.Count > 0 ? CtrlsProc.PrepareParams(dt.Rows[0]) : null; } else if (eaSetData.Result != null) { res = CtrlsProc.PrepareParams(eaSetData.Result); } Ctx.TransferObject = res; if (res == null) { Loger.SendMess("Не получен результат операции!", true); } var ok = (res != null); if (ok) { Changed = false; WasSaved = true; Ctx.SaveLog("SAVE_FORM", $"Form {Name} ({Text}) was saved"); } return(ok); }
/// <summary>Процесс загрузки данных в редактор</summary> protected void LoadData() { if (LicenseManager.UsageMode != LicenseUsageMode.Runtime) { return; } try { var queryParams = CtrlsProc.PrepareParams(extParams, null, ExtParamsMap); // уточнение параметров var eaParams = new ParamsCheckEventArgs { Pars = queryParams }; QueryParamsCheck?.Invoke(this, eaParams); // запрос данных (если в потомке есть обработчик события - он вызовется первым и необходимо установить handled=true, чтобы не продолжать через FormEdit_GetData) var eaGetData = new ProcessDataEventArgs() { Pars = eaParams.Pars }; GetData?.Invoke(this, eaGetData); // проверка допустимости набора данных if (eaGetData.Result == null) { throw new Exception("Нет данных"); } if (eaGetData.Result is DataTable) { var dt = (DataTable)eaGetData.Result; if (dt.Rows.Count == 0) { throw new Exception("Нет данных"); } if (dt.Rows.Count > 1) { throw new Exception("Получено несколько записей"); } } Source.DataSource = eaGetData.Result; // подготовка списка для биндинга var fields = new List <string>(); if (Source.DataSource is DataTable) { fields = (Source.DataSource as DataTable)?.Columns.OfType <DataColumn>().Select(x => x.ColumnName).ToList(); } else { fields = TypeDescriptor.GetProperties(Source.DataSource).OfType <PropertyDescriptor>().Select(x => x.Name).ToList(); } foreach (var f in fields) { var c = this.GetControl(f); if (c != null && ValidParamControlType(c.GetType())) { DataMap.Add(new DataMapItem(f, c)); } } DataMapCreate?.Invoke(this, new EventArgs()); // настройки комбо для выбора из формы foreach (var sb in this.GetControls <SelectBox>()) { if (sb.SourceObject == null) { sb.SourceObject = SourceRow; } if (sb.TargetObject == null) { sb.TargetObject = SourceObject; } } // биндинг SetBindings(); AfterBinding?.Invoke(this, new EventArgs()); //Source.ResetBindings(false); // детальные данные if (!IsNewRec) { var pars = CtrlsProc.PrepareParams(SourceObject); foreach (var g in DataLists) { g.LoadData(null, pars); } } } catch (Exception ex) { Loger.SendMess(ex, "Ошибка получения данных на форму:"); Close(); } finally { Changed = false; } }