示例#1
0
文件: FormEdit.cs 项目: Pumpet/Robin
        /// <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);
        }
示例#2
0
文件: FormEdit.cs 项目: Pumpet/Robin
        /// <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;
            }
        }