Domanda

Sto cercando di modificare il sistema.Drawing.Printing.PrintingSettings Oggetto che ottengo dal sistema.Windows.Forms.PrintDialog dopo che la finestra di dialogo è stata mostrata all'utente. Sebbene sia in grado di modificare i valori della proprietà sull'oggetto PrinterseStings, nessuna delle modifiche che faccio dopo aver mostrato la finestra di dialogo viene effettivamente considerata quando si stampa un documento.

Ecco un esempio di cosa intendo:

//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;
.

Ora usa l'oggetto PrinterseStings per la stampa. Io uso la 3a partito DLL Aspose.Words per questo, dal momento che ho bisogno di stampare la parola, ma questo sembra non essere il problema. Sembra che dopo aver mostrato la finestra di dialogo, tutte le impostazioni sono già state impegnate alla stampante e cambiare le stampateStings non raggiunge nulla. Qualche idea su come far funzionare questo?

Modifica: ho dei soluzioni alternative per questo. Quello che voglio qui è ottenere una risposta a queste domande specifiche: è possibile modificare l'oggetto PrinterseStings dopo che la finestra di dialogo è stata mostrata e queste modifiche considerate in stampa. Se qualcuno conosce solo un modo come questo può funzionare (puoi decidere su quale API desideri utilizzare per la stampa, non importa finché viene utilizzato l'oggetto PrinterseStings), sarei molto grato.

È stato utile?

Soluzione

Non sei sicuro del perché la tua domanda ha ottenuto un voto in basso, mi sembra abbastanza ragionevole per me ????

comunque, alcune cose che ho notato con PrintDialog (che può o non può rispondere alla tua domanda).

Prima cosa è che è solo una classe wrapper per il dialogo Windows Com.

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

e secondo, e più importante con riferimento alla tua domanda immagino: La classe PrintDialog ha questa routine che viene chiamata dopo la chiusura della chiamata 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); 
    }
.

C'è anche un'interazione piuttosto interessante qui (cuscinando a mente impostare Printersettings.topage):

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

e poi

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

Non una risposta diretta Lo so, ma penso che dovrebbe indicarti nella giusta direzione del perché non funziona. Mi sembra che durante l'uso del dialogo, può avvolgere felicemente le impostazioni sui cambiamenti in quanto verrà ricreato in completamento, ma quando il dialogo è completo, la modifica delle impostazioni invalida effettivamente le impostazioni di stampa del documento finché non vengono nuovamente impostate. Potrebbe essere possibile farlo manualmente, oppure potrebbe essere Loch \ Ked da M $ nel solito modo interno / privato molti interni sono.

C'è un'opzione ovviamente (non così carina lo so) per utilizzare semplicemente l'API Win Derictly dopo che il codice di chiamata potrebbe essere yttad dai suddetti diafratti per costruire il proprio wrapper se necessario.

Buona fortuna.

Altri suggerimenti

Dalla documentazione Aspose:

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

Quindi sembra che tu possa passare l'oggetto PrinteStings modificato YUOR al documento di Word che stai cercando di stampare.Potresti dirmi se funziona?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top