Страница 1 из 2

Пользовательское сохранение шаблона

Добавлено: 12 фев 2014, 12:21
kavit
Добрый день.

Задача: Реализовать пользовательское сохранение отчета из Дизайнера
Реализовано: Используется свойство "StiOptions.Designer.DontAskSaveReport = true;" и подписка на событие "StiOptions.Engine.GlobalEvents.SavingReportInDesigner"
Проблема: Нужно уметь отличать в обработчике сохранения
1) безусловный Save (вызов по нажатию пользователем кнопки/иконки "Сохранить")
2) Save при Close (вызов при нажатии на "Закрыть" в дизайнере)

Пример: отчет был изменен пользователем и пользователь нажимает "закрыть". В этом случае нужно спросить "Сохранить или нет отчет", чтобы была возможность отменить изменения.
Теперь допустим пользователь нажимает "Save" и с учетом того, что обработчик используется один, будет задан вопрос "Сохранить отчет или нет", хотя подразумевается безусловное сохранение и вопроса задавать не нужно.

Как мне решить эту коллизию при сохранении? Можете предложить логику работы?

Re: Пользовательское сохранение шаблона

Добавлено: 13 фев 2014, 10:36
Aleksey
Здравствуйте,

На форму добавляем StiRibbonDesignerControl или StiDesignerControl, подписываемся на закрытие формы, сохраняем отчет.
Скорректированный проект в приложении.

Спасибо.

Re: Пользовательское сохранение шаблона

Добавлено: 13 фев 2014, 11:51
kavit
В предложенной Вами реализации:

1. В обработчике OnLoad() отключается подписка на глобальное событие, и как следствие, обработка по нажатию "Save"

Код: Выделить всё

[1] StiOptions.Engine.GlobalEvents.SavingReportInDesigner += GlobalEventsSavingReportInDesigner;
[2] stiRibbonDesignerControl1.Report = report;
[3] StiOptions.Engine.GlobalEvents.SavingReportInDesigner -= GlobalEventsSavingReportInDesigner;  <------------- "Не будет вызываться обработчик "Save"
2. Если же включить обработчик по нажатию "Save" (закомментировать строчку [3]), то обработчик "GlobalEventsSavingReportInDesigner" вызывается все равно раньше, чем "Form1_FormClosing". Получается такая последовательность:

[1] Click пользователя на закрытии формы или "Alt+F4"
[2] Вызов обработчика GlobalEventsSavingReportInDesigner
[3] Вызов обработчика Form1_FormClosing

или такая
[1] Click пользователя на "Save" в дизайнере
[2] Вызов обработчика GlobalEventsSavingReportInDesigner

Т.о. опять возвращаемся к началу, как узнать на шаге [2] это вызов "Save" или следующий вызов будет "Form1_FormClosing" а значит "Close"

Взгляд с другой стороны:

Может есть событие "OnSaveClick" у компонента RibbonControl или DesignerControl на которое можно подписаться, тогда вопрос бы решился

Re: Пользовательское сохранение шаблона

Добавлено: 13 фев 2014, 16:48
Aleksey
Здравствуйте,

Пожалуйста, уточните какую версию вы используете.
При удалении строки [3] - по кнопке Save вызывается GlobalEventsSavingReportInDesigner, при закрытии формы только Form1_FormClosing.

Спасибо.

Re: Пользовательское сохранение шаблона

Добавлено: 13 фев 2014, 18:35
kavit
1) Версия: 2014.1.1810.0
2) По кнопке "Save" вызывается GlobalEventsSavingReportInDesigner, а при нажатии "Закрыть" 2 варианта поведения
а) если отчет не модифицирован - вызывается Form1_FormClosing.
b) если отчет модифицирован - сначала GlobalEventsSavingReportInDesigner, потом Form1_FormClosing

Re: Пользовательское сохранение шаблона

Добавлено: 14 фев 2014, 16:55
Aleksey
Здравствуйте,
Пример: отчет был изменен пользователем и пользователь нажимает "закрыть". В этом случае нужно спросить "Сохранить или нет отчет", чтобы была возможность отменить изменения.
Теперь допустим пользователь нажимает "Save" и с учетом того, что обработчик используется один, будет задан вопрос "Сохранить отчет или нет", хотя подразумевается безусловное сохранение и вопроса задавать не нужно.
Немного запутались с вашей задачей. По логике, то что вы хотите реализовано в самом дизайнере по умолчанию, и вы зачем то это отключаете и пытаетесь сами это "прикрутить"..
Если убрать следующую строку и ваш вопрос о сохранении:
StiOptions.Designer.DontAskSaveReport = true;
и подписаться на сохранение отчета, то при нажатии на кнопку Save будет происходить безусловное сохранение, а при закрытии формы будет задаваться вопрос сохранить отчет или нет.

Спасибо.

Re: Пользовательское сохранение шаблона

Добавлено: 14 фев 2014, 19:26
kavit
Да. Это решение то, что нужно. Осталось только выяснить: как отключать лишние пункты меню. Для этого вопроса создал отдельную тему http://forumru.stimulsoft.com/viewtopic.php?f=8&t=3610

Спасибо

Re: Пользовательское сохранение шаблона

Добавлено: 16 фев 2014, 11:47
Andrew
Здравствуйте,

Спасибо за ответ. Вопрос по пунктам меню ответим в той теме.

Re: Пользовательское сохранение шаблона

Добавлено: 20 фев 2014, 11:36
Aleksey
Здравствуйте,

Добавили опцию:
stiRibbonDesignerControl.ShowCaption = false;

Будет доступно в следующем билде на этой неделе.

Re: Пользовательское сохранение шаблона

Добавлено: 12 апр 2014, 15:22
kavit
Aleksey писал(а):Здравствуйте,
Если убрать следующую строку и ваш вопрос о сохранении:
StiOptions.Designer.DontAskSaveReport = true;
и подписаться на сохранение отчета, то при нажатии на кнопку Save будет происходить безусловное сохранение, а при закрытии формы будет задаваться вопрос сохранить отчет или нет.

Спасибо.
Опять вернулся к этой задаче. Теперь попробуйте:
1. Открыть шаблон
2. Изменить шаблон
3. Нажать закрыть окно

Будет вызван метод "Save" ДО метода "Close". Т.о. получается:
1. нет никакой возможности отличить "безусловное сохранение" от закрытия (условное). Save всегда вызывается раньше Closing если шаблон изменен
2. нет возможности предложить отмену закрытия формы пользователю, т.к. вызовется Save, после которого почему то благополучно сбрасывается IsModify. и в Close приходим с чистым IsModify. Вот получается сидеть гадать. Откуда пришел вызов, то ли сразу после нажатия на закрыть и шаблон неизменен (IsModify = false) или после Save
и вы зачем то это отключаете и пытаетесь сами это "прикрутить"..
Если убрать следующую строку и ваш вопрос о сохранении:
Я бы и рад не придумывать, но вызов Save перед Close рубит все планы

Если бы в StiSavingObjectEventArgs параметр EventSource был равен "Close" при закрытии формы, а не "Save" (что вообще-то не логично, т.к. Save вызова не было), то. все решилось бы гладко и хватило бы встроенных средств редактора