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

Обсуждение Stimulsoft Reports.NET
kavit
Сообщения: 47
Зарегистрирован: 23 янв 2014, 11:14

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

Сообщение kavit »

Добрый день.

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

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

Как мне решить эту коллизию при сохранении? Можете предложить логику работы?
Вложения
TestStimulsoftReport.zip
Пример проекта
(23.62 КБ) 190 скачиваний
Stimulsoft 2014.1.1900.0 Winforms / Windows 7 / Visual Studio 2012 UP4
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

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

Сообщение Aleksey »

Здравствуйте,

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

Спасибо.
Вложения
TestStimulsoftReport.zip
(24.14 КБ) 195 скачиваний
kavit
Сообщения: 47
Зарегистрирован: 23 янв 2014, 11:14

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

Сообщение 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 на которое можно подписаться, тогда вопрос бы решился
Stimulsoft 2014.1.1900.0 Winforms / Windows 7 / Visual Studio 2012 UP4
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

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

Сообщение Aleksey »

Здравствуйте,

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

Спасибо.
kavit
Сообщения: 47
Зарегистрирован: 23 янв 2014, 11:14

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

Сообщение kavit »

1) Версия: 2014.1.1810.0
2) По кнопке "Save" вызывается GlobalEventsSavingReportInDesigner, а при нажатии "Закрыть" 2 варианта поведения
а) если отчет не модифицирован - вызывается Form1_FormClosing.
b) если отчет модифицирован - сначала GlobalEventsSavingReportInDesigner, потом Form1_FormClosing
Stimulsoft 2014.1.1900.0 Winforms / Windows 7 / Visual Studio 2012 UP4
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

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

Сообщение Aleksey »

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

Спасибо.
kavit
Сообщения: 47
Зарегистрирован: 23 янв 2014, 11:14

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

Сообщение kavit »

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

Спасибо
Stimulsoft 2014.1.1900.0 Winforms / Windows 7 / Visual Studio 2012 UP4
Andrew
Сообщения: 586
Зарегистрирован: 09 июн 2006, 12:22

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

Сообщение Andrew »

Здравствуйте,

Спасибо за ответ. Вопрос по пунктам меню ответим в той теме.
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

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

Сообщение Aleksey »

Здравствуйте,

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

Будет доступно в следующем билде на этой неделе.
kavit
Сообщения: 47
Зарегистрирован: 23 янв 2014, 11:14

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

Сообщение 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 вызова не было), то. все решилось бы гладко и хватило бы встроенных средств редактора
Stimulsoft 2014.1.1900.0 Winforms / Windows 7 / Visual Studio 2012 UP4
Ответить