Отменить печать из кода отчета

CouRageCouRage Санкт-Петербург
отредактировано 00:47 Раздел: FastReport .NET
Здравствуйте.

Имеется такая простая конструкция:
FastReport.Report rpt;
...
if (rpt.Prepare())
  rpt.PrintPrepared();

Можно как-нибудь отменить печать из кода отчета, не выбрасывая при этом исключения ?
Через Report.Abort() не получается - документ все равно печатается.

Комментарии

  • отредактировано 00:47
    Здравствуйте,

    Печать, когда она уже началась, отменить программно нельзя. Только по нажатию кнопки "Отмена" в окне прогресса.
  • CouRageCouRage Санкт-Петербург
    отредактировано 00:47
    Ок. Понял, что нельзя, а вот почему, если честно, - не понял.

    Реальный пример:
    Печатается счет. Сразу на принтер - не выводя в предварительный просмотр. Если сумма по счету = 0, то печатать не надо - надо вывести об этом сообщение. Посчитать и проверить сумму можно только в отчете, в приложении - нет. Получается надо в момент выполнения кода отчета выполнять проверку и отменять или нет печать.

    Пробовал выкрутиться так:

    Код приложения:
    public class FrAbortException : Exception
    {
      public FrAbortException(): base() {}
      public FrAbortException(string message): base(message) {}
    }
    
    ...
    FastReport.Report rpt;
    ...
    try
    {
      if (rpt.Prepare())
        rpt.PrintPrepared();
    }
    catch (FrAbortException ex) 
    {
      MessageBox.Show(this, "Выполнение отменено:" + ex.Message, "AppCaption", System.Windows.Forms.MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    

    Код отчета:
    private void _FinishReport(object sender, EventArgs e)
    {
      throw new FrAbortException("Сумма счета = 0");
    }
    

    Только тут возникла проблема - throw new Exception прерывает выполнение, однако на экране остается окно прогресса FastReport с надписью "Готовится страница 1", по кнопке отмена оно не закрывается. Причем оно TopMost и висит над всеми окнами всех приложений.

    Можно в этой ситуации с окном прогресса что-нибудь сделать ? Может ввести какой-нибудь флаг в класс Report - bool ShowProgress ?
  • CouRageCouRage Санкт-Петербург
    отредактировано 00:47
    Может как-то из кода отчета можно прервать подготовку (prepare) отчета ? Тогда rpt.Prepare() вернет false и до Print() дело не дойдет.
    Мне казалось, что Report.Abort() это должен делать, но видимо это не так.
  • отредактировано 00:47
    Report.Abort() прерывает построение отчета, но Prepare() при этом вернет true.

    Отчет не обязательно прерывать, и печать не обязательно начинать :)
    В коде отчета создаете новый параметр отчета, а своем коде проверяете его наличие.

    В отчете:
        private void Text2_BeforePrint(object sender, EventArgs e)
        {
          Report.Parameters.Add(new Parameter("CancelPrint"));
        }
    

    В программе:
          if (rpt.Prepare())
          {
            if (rpt.Parameters.FindByName("CancelPrint") == null)
              rpt.PrintPrepared();
          }
    
  • CouRageCouRage Санкт-Петербург
    отредактировано March 2009
    Спасибо, понял.
    Про параметры и про то, что их можно менять в коде отчета, а потом смотреть в коде приложения, как-то не подумал.

    Наверное правильнее будет как-то так:
    if (rpt.Prepare())
    {
      if ((rpt.Parameters.FindByName("CancelPrint") == null) || !(bool)rpt.Parameters.FindByName("CancelPrint"))
        rpt.PrintPrepared();
    }
    
  • отредактировано 00:47
    Конструкция !(bool)rpt.Parameters.FindByName("CancelPrint") не имеет смысла, т.к. FindByName возвращает объект типа Parameter.
  • CouRageCouRage Санкт-Петербург
    отредактировано 00:47
    Да, не подумал.
    ... !(bool)rpt.Parameters.FindByName("CancelPrint").Value ...
    

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.