Вопрос

Я пытаюсь изменить систему. Отправляет объект.Printing.Printersettings, который я получаю от System.Windows.forms.printDialog после того, как диалог был показан пользователю. Несмотря на то, что я могу изменить значения свойств на объекте принтеров, ни один из изменений, которые я делаю после того, как диалог, на самом деле рассматривается при печати документа.

Вот пример того, что я имею в виду:

//Show the printdialog and retreive the printersettings    
var printDialog = new PrintDialog();
if (printDialog.ShowDialog() != DialogResult.OK) 
            return;
var printerSettings = printDialog.PrinterSettings;

//Now modify the printersettings object
printerSettings.ToPage = 8;
.

Теперь используйте объект печати принтера для печати. Я использую 3-й Party Dll Aspory .Words для этого, поскольку мне нужно распечатать слово, но это, кажется, не проблема. Похоже, после того, как диалоговое окно было показано, что все настройки уже были приняты на принтер, и меняя принтеры ничего не достигают. Любые идеи о том, как сделать это на работу?

Редактировать: у меня есть некоторые обходные пути для этого. Здесь я хочу получить ответ на эти конкретные вопросы: возможно ли изменить объект принтера после того, как диалоговое окно было показано, и эти изменения рассматриваются в печати. Если кто-то знает только один из способов того, как это может работать (вы можете принять решение о том, какой API вы хотите использовать для печати, это не имеет значения, если используется объект принтера), я был бы очень благодарен.

Это было полезно?

Решение

Не уверен, почему ваш вопрос получил голосование, кажется, довольно разумно для меня ????

Во всяком случае, несколько вещей, которые я заметил с PrintDialog (что может или не может ответить на ваш вопрос).

Первое, что это просто класс обертки для диалога Windows Com.

[DllImport("comdlg32.dll", CharSet=CharSet.Auto, SetLastError=true)]
        public static extern bool PrintDlg([In, Out] NativeMethods.PRINTDLG lppd);
.

и второе и самое главное со ссылкой на ваш вопрос: Класс PrintDialog имеет эту рутину, которая называется после закрытия вызова printdlg

if (!UnsafeNativeMethods.PrintDlg(data))
                return false;

            IntSecurity.AllPrintingAndUnmanagedCode.Assert();
            try { 
                UpdatePrinterSettings(data.hDevMode, data.hDevNames, data.nCopies, data.Flags, settings, PageSettings); 
            }
            finally { 
                CodeAccessPermission.RevertAssert();
            }
.

. Отказ ,

// VSWhidbey 93449: Due to the nature of PRINTDLGEX vs PRINTDLG, separate but similar methods 
// are required for updating the settings from the structure utilized by the dialog.
// Take information from print dialog and put in PrinterSettings
private static void UpdatePrinterSettings(IntPtr hDevMode, IntPtr hDevNames, short copies, int flags, PrinterSettings settings, PageSettings pageSettings) {
        // Mode 
        settings.SetHdevmode(hDevMode);
        settings.SetHdevnames(hDevNames); 

        if (pageSettings!= null)
            pageSettings.SetHdevmode(hDevMode); 

        //Check for Copies == 1 since we might get the Right number of Copies from hdevMode.dmCopies...
        //this is Native PrintDialogs
        if (settings.Copies == 1) 
            settings.Copies = copies;

        settings.PrintRange = (PrintRange) (flags & printRangeMask); 
    }
.

Есть также довольно интересный интерфейс здесь (подходит в виду, что вы устанавливаете принтеты. Топаж):

public PrinterSettings PrinterSettings {
   get { 
        if (settings == null)
        {
            settings = new PrinterSettings(); 
        }
        return settings; 
    } 
    set {
        if (value != PrinterSettings) 
        {
            settings = value;
            **printDocument = null;**
        } 
    }
} 
.

а затем

public PrintDocument Document {
            get { return printDocument;}
            set {
                printDocument = value; 
                **if (printDocument == null)
                    settings = new PrinterSettings();** 
                else 
                    settings = printDocument.PrinterSettings;
            } 
        }
.

Не прямой ответ, которого я знаю, но я думаю, что должен указать вам в правильном направлении, почему он не работает. Мне кажется, что во время использования диалога он может с радостью аннулировать настройки на изменениях, поскольку он будет воссоздан на завершении, но когда диалог завершен, изменение параметров фактически недействители параметры печати документа, пока не будет установлено еще раз. Может быть возможно сделать это вручную, или он может быть Loch \ Ked по M $ в обычном внутреннем / частном направлении многие внутренние внутренние.

Есть вариант, конечно, (не так приятно, я знаю), чтобы просто использовать API WIN API после того, как код вызова может быть связан с вышеуказанных диалогов, чтобы построить собственную обертку, если требуется.

Удачи.

Другие советы

от Документации Asposity:

AsposeWordsPrintDocument awPrintDoc = new AsposeWordsPrintDocument(doc);
awPrintDoc.PrinterSettings = printDlg.PrinterSettings;
.

Так что кажется, что вы можете пройти от объекта модифицированных принтеров YUR к документу Word, вы пытаетесь напечатать.Не могли бы вы сказать мне, если это работает?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top