Exemple #1
0
        /// <summary>Запуск формы редактора и обработка возврата</summary>
        /// <param name="form">Форма</param>
        /// <param name="formCode">Код формы из настроек</param>
        /// <param name="viewMode">Режим формы для обработки данных: NewRec для новой записи, ReadOnly только для просмотра, Default для редактирования записи</param>
        /// <param name="grid">Грид, из которого запускаем. Если задан - поля источника текущей строки берутся в качестве параметров</param>
        /// <param name="mapForParams">Строка соответствия имен: "формируемый1=полученный1;...", где формируемый - параметр для запроса данных на форму, полученный - параметр из грида и customParams. Если нет полученного, параметр будет сформирован со значением null. Если соответствий не задано (по умолчанию) - берем все полученные параметры</param>
        /// <param name="customParams">Параметры ключ-значение. Если заданы - считаются приоритетнее, чем одноименные поля из грида</param>
        /// <param name="mapForResult">Строка соответствия имен: "формируемый1=полученный1;...", где полученный - поле результата выполнения скрипта вставки/обновления, формируемый - параметр поиска текущей записи после обновления данных в гриде</param>
        /// <param name="formModes">Другие необходимые режимы в дополнение к viewMode, по умолчанию - Modal</param>
        /// <returns>True только в случае положительного результата (OK) для модальной формы</returns>
        public bool ExecFormEdit(Form form, string formCode, FormModes viewMode, DataList grid = null, string mapForParams = null, Dictionary <string, object> customParams = null, string mapForResult = null, FormModes formModes = FormModes.Modal)
        {
            if (Ctx == null)
            {
                return(false);
            }
            if (viewMode != FormModes.Default && viewMode != FormModes.NewRecEdit && viewMode != FormModes.ViewOnlyEdit)
            {
                viewMode = FormModes.Default;
            }
            var pars = CtrlsProc.PrepareParams(viewMode == FormModes.NewRecEdit ? null : grid?.GetRowObject(), customParams);

            pars = CtrlsProc.GetParamsForMap(pars, mapForParams);
            Ctx.TransferObject = null;
            if (form == null)
            {
                form = Ctx.GetForm(formCode);
            }
            var ok = Ctx.ExecForm(form, this, formModes | viewMode, pars);

            if (ok && grid != null)
            {
                var k = Ctx.TransferObject == null || string.IsNullOrEmpty(mapForResult) ? Ctx.TransferObject : CtrlsProc.PrepareParams(Ctx.TransferObject, null, mapForResult);
                if (this is FormList)
                {
                    (this as FormList).LoadGrid(grid, k);
                }
                else
                {
                    grid.LoadData(k);
                }
            }
            return(ok);
        }
Exemple #2
0
        /// <summary>Запуск формы выбора из списка и обработка возврата</summary>
        /// <param name="form">Форма</param>
        /// <param name="formCode">Код формы из настроек</param>
        /// <param name="sourceObject">Объект-источник параметров вызова формы (ключей и фильтра)</param>
        /// <param name="keyMap">Строка соответствия имен полей входящих в передаваемый ключ: "формируемый1=полученный1;..."</param>
        /// <param name="filterMap">Строка соответствия имен полей входящих в передаваемый фильтр: "формируемый1=полученный1;..."</param>
        /// <param name="customParams">Параметры ключ-значение. Если заданы - считаются приоритетнее, чем одноименные поля из объекта-источника</param>
        /// <param name="resultAction">Метод разбора результата. Результат в качестве параметра</param>
        /// <param name="getMulti">Результат - (true) как список объектов из отмеченных строк грида или (false) как словарь выбранной строки грида</param>
        /// <returns>True только в случае положительного результата (OK) для модальной формы. Результат будет в TransferObject контекста</returns>
        public bool ExecFormSelect(Form form, string formCode, object sourceObject, string keyMap = null, string filterMap = null, Dictionary <string, object> customParams = null, Action <object> resultAction = null, bool getMulti = false)
        {
            if (Ctx == null)
            {
                return(false);
            }
            var viewMode = FormModes.Modal | FormModes.GetResult;

            if (getMulti)
            {
                viewMode |= FormModes.GetMultiResult;
            }
            var pars    = CtrlsProc.PrepareParams(sourceObject, customParams);
            var filters = string.IsNullOrWhiteSpace(filterMap) ? null : CtrlsProc.GetParamsForMap(pars, filterMap);
            var keys    = string.IsNullOrWhiteSpace(keyMap) ? null : CtrlsProc.GetParamsForMap(pars, keyMap);

            Ctx.TransferObject = null;
            if (form == null)
            {
                form = Ctx.GetForm(formCode);
            }
            var ok = Ctx.ExecForm(form, this, viewMode, filters, keys);

            if (ok && resultAction != null)
            {
                resultAction(Ctx.TransferObject);
            }
            return(ok);
        }
Exemple #3
0
        /// <summary>Выбор строки или строк</summary>
        public void OnSelectFromList(EventArgs e = null)
        {
            if (!(formModes.HasFlag(FormModes.GetResult) &&
                  (ActiveGrid.Name.Equals(SelectionGridName) || string.IsNullOrWhiteSpace(SelectionGridName)) &&
                  ActiveGrid.Focused
                  ))
            {
                return;
            }

            object selectedObject = null;
            var    checkedIdx     = ActiveGrid.GetCheckedRowsIdx();

            if (formModes.HasFlag(FormModes.GetMultiResult))
            {
                if (checkedIdx.Count > 0)
                {
                    selectedObject = checkedIdx.Select(r => ActiveGrid.GetRowObject(r)).ToList();
                }
                else
                {
                    selectedObject = new List <object> {
                        ActiveGrid.GetRowObject()
                    }
                };
            }
            else
            {
                selectedObject = CtrlsProc.PrepareParams(ActiveGrid.GetRowObject());
            }

            // сбросить дальнейшую обработку нажатий
            var keyEvt = (e as KeyEventArgs);

            if (keyEvt != null)
            {
                keyEvt.Handled = true;
            }

            var ea = new SelectFromListEventArgs()
            {
                SelectedObject = selectedObject, Handled = false
            };

            SelectFromList?.Invoke(this, ea);

            // стандартный возврат результата и выход, если это не отменили в обработчике события
            if (!ea.Handled)
            {
                Ctx.TransferObject = ea.SelectedObject;
                if (Ctx.TransferObject == null)
                {
                    Loger.SendMess("Не получен выбранный объект!", true);
                }
                DialogResult = Ctx.TransferObject != null && Modal ? DialogResult.OK : DialogResult.Cancel;
                Close();
            }
        }
Exemple #4
0
 // сбросить значения полей параметров
 void ClearUiParams(DataList g)
 {
     foreach (var c in uiParams.Where(x => x.Key == g).SelectMany(x => x.Value))
     {
         CtrlsProc.SetControlValue(c, null, true);
     }
     SetUiParamsDefaultValues?.Invoke(g, new UiParamsEventArgs()
     {
         UiParams = uiParams
     });
 }
Exemple #5
0
 /// <summary>Установка значений полей параметров из словаря</summary>
 public void SetUiParamsFromDictionary(Dictionary <string, object> props)
 {
     if (props == null)
     {
         return;
     }
     foreach (var prop in props)
     {
         var par = uiParams.SelectMany(x => x.Value).FirstOrDefault(x => x.Name.TrimStart('_') == prop.Key);
         if (par != null)
         {
             CtrlsProc.SetControlValue(par, prop.Value?.ToString());
         }
     }
 }
Exemple #6
0
 /// <summary>Установка загруженных значений полей параметров</summary>
 public override void SetUiParamsProperties(List <ControlValue> props)
 {
     SetLoadedUiParams?.Invoke(this, new UiParamsPropsEventArgs()
     {
         Props = props
     });
     foreach (var prop in props)
     {
         var par = uiParams.SelectMany(x => x.Value).FirstOrDefault(x => x.Name == prop.Name && x.GetType().Name == prop.TypeName);
         if (par != null)
         {
             CtrlsProc.SetControlValue(par, prop.Value);
         }
     }
 }
Exemple #7
0
        /// <summary>Выполнение команды sql из интерфейса</summary>
        /// <param name="sql">Текст команды</param>
        /// <param name="cmdCode">Код настройки команды. Используется, если не задан текст команды (sql)</param>
        /// <param name="grid">Грид, из которого запускаем. Если задан - поля источника обрабатываемой строки берутся в качестве параметров. Будет обновлен по окончании, если не указан </param>
        /// <param name="mapForParams">Строка соответствий ключей: "формируемый1=полученный1;...", где формируемый - параметр для команды, полученный - параметр из грида и customParams. Если нет полученного, параметр будет сформирован со значением null. Если соответствий не задано (по умолчанию) - берем все полученные параметры</param>
        /// <param name="customParams">Параметры ключ-значение. Если заданы - считаются приоритетнее, чем одноименные поля из грида</param>
        /// <param name="warning">Строка предупреждения перед выполнением команды. В этом случае будет окно сообщения с возможностью отказаться</param>
        /// <param name="forSelectedRows">True если хотим выполнить для каждой выделенной строки грида, False - только для текущей</param>
        /// <param name="refreshGrid">False если не нужно обновлять указанный grid по окончании</param>
        /// <returns>Таблица (пустая, если команда не возвращает resultset) или null</returns>
        protected object ExecCommand(string sql, string cmdCode, DataList grid = null, string mapForParams = null, Dictionary <string, object> customParams = null, string warning = null, bool forSelectedRows = false, bool refreshGrid = true, bool saveLog = true)
        {
            if (!string.IsNullOrEmpty(warning) && MessageBox.Show(warning, "Внимание!", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
            {
                return(null);
            }

            if (saveLog && Ctx != null)
            {
                Ctx.SaveLog("EXEC_COMMAND", cmdCode ?? sql);
            }

            List <Dictionary <string, object> > rowParamsList = new List <Dictionary <string, object> >();

            if (grid != null && forSelectedRows)
            {
                foreach (int r in grid.GetCheckedRowsIdx())
                {
                    rowParamsList.Add(CtrlsProc.GetParamsForMap(CtrlsProc.PrepareParams(grid.GetRowObject(r), customParams), mapForParams));
                }
            }
            else
            {
                rowParamsList.Add(CtrlsProc.GetParamsForMap(CtrlsProc.PrepareParams(grid?.GetRowObject(), customParams), mapForParams));
            }

            object res = null;

            foreach (var rowParams in rowParamsList)
            {
                res = Ctx?.GetTable(sql, cmdCode, rowParams);
            }

            if (grid != null && refreshGrid)
            {
                if (this is FormList)
                {
                    (this as FormList).LoadGrid(grid);
                }
                else
                {
                    grid.LoadData();
                }
            }

            return(res);
        }
Exemple #8
0
        protected virtual void OnSetResult(object resObject)
        {
            SelectedObject = resObject;
            var ea = new SetResultEventArgs {
                ResultPars = CtrlsProc.PrepareParams(resObject, null, ResultMap),
                Handled    = false
            };

            SetResult?.Invoke(this, ea);
            SelectedValues = ea.ResultPars;
            if (!ea.Handled)
            {
                CtrlsProc.SetValues(TargetObject, SelectedValues);
                if (TargetObject is DataRow)
                {
                    (TargetObject as DataRow).EndEdit();
                }
                if (TargetObject is BindingSource)
                {
                    (TargetObject as BindingSource).EndEdit();
                }
            }
            AfterSetResult?.Invoke(this, new EventArgs());
        }
Exemple #9
0
        /// <summary>делегат для грида на установку параметров - вызывается в grid.LoadData() -> OnGetData()</summary>
        protected Dictionary <string, object> DataList_QueryParamsSet(DataList list, Dictionary <string, object> extParams)
        {
            var res = CtrlsProc.PrepareParams(uiParams.Where(x => x.Key == list).SelectMany(x => x.Value), extParams, rewrite: true);

            return(res);
        }
Exemple #10
0
        /// <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);
        }
Exemple #11
0
        /// <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;
            }
        }