/// <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); }
/// <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); }
/// <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(); } }
// сбросить значения полей параметров 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 }); }
/// <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()); } } }
/// <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); } } }
/// <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); }
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()); }
/// <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); }
/// <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; } }