none
как использовать PrintDialog (WPF) RRS feed

  • Вопрос

  • Здравствуйте!

    Задача такая:

    У меня в шаблоне есть какие-то данные, которые только что поступили в этот шаблон.
    Хочу распечатать, при нажатии педали "печатать".

    Сначала, по некоторым примерам я сделал так:

    Код C#
    1
    2
    3
    4
    5
    6
    
     private void prntBtn_Click(object sender, RoutedEventArgs e)
            {
                _Document oDoc = GetDoc(Environment.CurrentDirectory + "\\template.dotx");
                oDoc.PrintOut();
                oDoc.Close(WdSaveOptions.wdDoNotSaveChanges);
            }
    чем добился печати, при нажатии на педальку "печатать", но печатает она без вывода на экран "принт диалога" и конечно-же отправляет на принтер, который выставлен по умолчанию. 
    потом я может и извратился, но по очередным примерам msdn сделал так: 

    Код C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
     private void prntBtn_Click(object sender, RoutedEventArgs e)
            {
                PrintDialog pDialog = new PrintDialog();
                
                pDialog.PageRangeSelection = PageRangeSelection.AllPages;
                pDialog.UserPageRangeEnabled = true;
                
                Nullable<Boolean> print = pDialog.ShowDialog();
                if (print == true)
                {
                    _Document oDoc = GetDoc(Environment.CurrentDirectory + "\\template.dotx");
                    oDoc.PrintOut();
                    oDoc.Close(WdSaveOptions.wdDoNotSaveChanges);
                }            
            }
    О чудо! Он при нажатии на печать - выдает мне окно с выбором принтеров! 
    Однако не тут то было! 
    Я выбираю другой! (не по умолчанию) принтер. жму печать, а оно все равно печатает на принтер по умолчанию = )) 

    Понимаю, что затуп именно в oDoc.PrintOut(); 
    Точнее даже понимаю, что именно PrintOut - отправляет туда. где стоит умолчание, но как сделать ПО ПРАВИЛЬНОМУ - не могу понять ))) 
    Подскажите пожалуйста!
    Хочу печатать туда, куда направил с диалог-окна )) 
    Спасибо!
    14 июля 2011 г. 10:27

Ответы

  • Ну, видимо, нужно выбирать имя файла также как у тебя было до моего примера:

    Microsoft.Office.Interop.Word._Document oDoc = word.Documents.Open(FileName:Environment.CurrentDirectory + "\\template.dotx");
    


    • Помечено в качестве ответа TheShestov 15 июля 2011 г. 8:03
    • Снята пометка об ответе TheShestov 15 июля 2011 г. 8:04
    • Помечено в качестве ответа TheShestov 15 июля 2011 г. 8:04
    15 июля 2011 г. 7:17
    Модератор
  • Не знаю на сколько вам подойдет такой вариант, но я бы предложил просто показать диалог печати Word'овский:

          Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
          word.Visible = true;
          Microsoft.Office.Interop.Word._Document oDoc = word.Documents.Open(FileName: @"c:\temp\wordfile.doc");
          Microsoft.Office.Interop.Word.Dialog printDialog = word.Application.Dialogs[Microsoft.Office.Interop.Word.WdWordDialog.wdDialogFilePrint];
          if (printDialog.Show() == 1)
          {
            oDoc.PrintOut();        
          }
          oDoc.Close(Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges);
    


    • Предложено в качестве ответа Abolmasov Dmitry 15 июля 2011 г. 5:24
    • Помечено в качестве ответа TheShestov 15 июля 2011 г. 8:03
    • Снята пометка об ответе TheShestov 15 июля 2011 г. 8:04
    • Помечено в качестве ответа TheShestov 15 июля 2011 г. 8:04
    15 июля 2011 г. 4:34
    Модератор

Все ответы

  • Судя по коду PrintDialog не имеет никакого отношения к печати документа. Печать ведется офисом и он ничего не знает о том, что ты где-то там в своем приложении показал PrintDialog.

     

    14 июля 2011 г. 18:16
    Модератор
  • печать офисом - это видимо PrintOut ?

    Пусть будет чем угодно, только подскажите как сделать корректно ? :)

    14 июля 2011 г. 19:59
  • Не знаю на сколько вам подойдет такой вариант, но я бы предложил просто показать диалог печати Word'овский:

          Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
          word.Visible = true;
          Microsoft.Office.Interop.Word._Document oDoc = word.Documents.Open(FileName: @"c:\temp\wordfile.doc");
          Microsoft.Office.Interop.Word.Dialog printDialog = word.Application.Dialogs[Microsoft.Office.Interop.Word.WdWordDialog.wdDialogFilePrint];
          if (printDialog.Show() == 1)
          {
            oDoc.PrintOut();        
          }
          oDoc.Close(Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges);
    


    • Предложено в качестве ответа Abolmasov Dmitry 15 июля 2011 г. 5:24
    • Помечено в качестве ответа TheShestov 15 июля 2011 г. 8:03
    • Снята пометка об ответе TheShestov 15 июля 2011 г. 8:04
    • Помечено в качестве ответа TheShestov 15 июля 2011 г. 8:04
    15 июля 2011 г. 4:34
    Модератор
  • Если использовать PrintDialog, то для печати нужно вызывать его метод PrintDialog.PrintDocument, но для его использования придется как-то привести ваш вордоский документ к классу DocumentPaginator, так что проще использовать диалог печати из самого MS Word.


    Для связи [mail]
    15 июля 2011 г. 5:36
  • Относительно:
     Microsoft.Office.Interop.Word._Document oDoc = word.Documents.Open(FileName: @"c:\temp\wordfile.doc");
    
    возник вопрос. 
    ставлю "\\template.dotx"
    ругается, что не может найти директорию С:\template.dotx
    Оно и понятно. Ведь там этого файла нет. 
    В моем варианте - он черпал оттуда, откуда проект запустил, а как тут это указать ? 
    Я думаю ворду не принципиально что выводить на печать - *.doc или *.dotx 
    А у меня генерится все именно в *.dotx
    Соответственно до момента печати - я пока не дошел и даже не понял - работает или нет.
    Спасибо!
    15 июля 2011 г. 7:02
  • Ну, видимо, нужно выбирать имя файла также как у тебя было до моего примера:

    Microsoft.Office.Interop.Word._Document oDoc = word.Documents.Open(FileName:Environment.CurrentDirectory + "\\template.dotx");
    


    • Помечено в качестве ответа TheShestov 15 июля 2011 г. 8:03
    • Снята пометка об ответе TheShestov 15 июля 2011 г. 8:04
    • Помечено в качестве ответа TheShestov 15 июля 2011 г. 8:04
    15 июля 2011 г. 7:17
    Модератор
  • Спасибо, за простые вещи ;) 

    Я попытался немного переделать то, что ты отправил. На это:

     

    private void prntBtn_Click(object sender, RoutedEventArgs e)
    
        {
    
          oWord.Visible = false;      
    
          //Word.Application word = new Word.Application();
    
          //oWord.Visible = true;
    
          Word._Document oDoc = oWord.Documents.Open(FileName: Environment.CurrentDirectory + "\\template.dotx");
    
          Word.Dialog printDialog = oWord.Application.Dialogs[Word.WdWordDialog
    
            .wdDialogFilePrint];
    
          if (printDialog.Show() == 1)
    
          {
    
            oDoc.PrintOut();
    
          }
    
          oDoc.Close(Word.WdSaveOptions.wdDoNotSaveChanges);
    
        
    

    Объясню почему: 

    Я уже ранее объявлял:

    Word._Application oWord = new Word.Application();

    Соответственно, если объявить еще одну, то в процессах висит уже 2 штуки WINWORD.EXE

    И главное более того, после отправки на печать: 

    1. Появляется окно с шаблоном необходимым (но тут понятно - это 

    oWord.Visible = true;

    2. Однако даже не обращая внимание на 1 пункт - видим или не видим - оно закроется. Но "шапка" главного окна WORD - остается висеть на экране.

    (после успешной печати)

    Я тут и подумал - а разве нельзя использовать уже ранее объявленную переменную.

    И как оказалось - или просмотрел куда-то или ...

    т.к. при нажатии на печать - подвисает и придательски молчит и не говорит что делает. Ну и конечно-же результата нет.

    Подскажите ?

     

    15 июля 2011 г. 7:36
  • Только написал ответ - и увидел, что сам-же еще добавил:

    oWord.Visible = false;

    Поставил true - заработало.

    Только вот "шапка" главного окна - так и висит.

    Может ее прибить тогда раньше чем главное окно формы зашкроется ? Сразу после печати?

    Тогда если пользователь изменит какие-то данные в самой программе - то он уже не сможет сделать новый шаблон. пока заново не откроет программу. А эт вроде как-то не парвильно ...

    Или может можно после печати - его снова скрыть ? (окно)

    15 июля 2011 г. 7:43
  • Да, если поставить в финале:

    oWord.Visible = false;

    то все впорядке. Скрывается. Вот только загвоздочка вышла ))) я и не обратил внимание, что данные с формы - перестали заносится в шаблон Word после такой реализации печати ))

    буду сидеть разглядывать, но если у вас уже есть объяснение - буду благодарен. ;)

    15 июля 2011 г. 7:47
  • 1. Данные, судя по всему, заполнялись в методе GetDoc, теперь он не
    используется. Посмотри, что в нем делалось.
    2. Чтобы убрать главное окно нужно использовать word.Quit();
     
    15 июля 2011 г. 7:55
    Модератор
  • Так точно!
    Убрал:
    //Word._Document oDoc = oWord.Documents.Open(FileName: Environment.CurrentDirectory + \\template.dotx);
     
    Добавил:
    _Document oDoc = GetDoc()Environment.CurrentDirectory + \\template.dotx;
    еще вопрос:
    А можно узнать  плюсы - минусы того, что я делаю oWord.Visible = false;
    или например ставить oWord.Quit();
    ?
    15 июля 2011 г. 8:02
  • нашел разницу. Он (oWord.Quit();) мне закрывает процесс WINWORD.EXE

    что в моем случае - не допустимо. буду юзать Visible

    Спасибо!

    15 июля 2011 г. 8:06