Question

J'essaie de modifier le système.Drawing.printing.PrinterSettings Objet que je reçois à partir du système.Windows.Forms.PrintDialog Une fois la boîte de dialogue affichée à l'utilisateur. Bien que je puisse modifier les valeurs de propriété sur l'objet PrintNetSettings, aucune des modifications que je nets après que la boîte de dialogue a été affichée est réellement prise en compte lors de l'impression d'un document.

Voici un exemple de ce que je veux dire:

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

Utilisez maintenant l'objet imprimeur d'imprimante pour l'impression. J'utilise la 3ème partie dll asposée.Words pour cela, car j'ai besoin d'imprimer Word, mais cela ne semble pas être le problème. Il semble que, après l'affiche de la boîte de dialogue, tous les paramètres ont déjà été confrontés à l'imprimante et à modifier les imprimeurs ne permet rien. Des idées sur la façon de faire fonctionner cela?

EDIT: J'ai des solutions de contournement pour cela. Ce que je veux ici, c'est d'obtenir une réponse à ces questions spécifiques: est-il possible de modifier l'objet PrintNetSettings une fois la boîte de dialogue et ces modifications sont considérées comme des impressions. Si quelqu'un ne connaît qu'une seule façon de savoir comment cela peut fonctionner (vous pouvez décider de l'API que vous souhaitez utiliser pour l'impression, cela n'a pas d'importance tant que l'objet PrintemseSettings est utilisé), je serais très reconnaissant.

Était-ce utile?

La solution

Je ne sais pas pourquoi votre question a eu un vote au bas, semblait assez raisonnable pour moi ????

Quoi qu'il en soit, quelques choses que j'ai remarquées avec PrintDialog (qui peut ou ne pas répondre à votre question).

première chose est que ce n'est qu'une classe wrapper pour le dialogue Windows Com.

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

et deuxième, et le plus important en ce qui concerne votre question, je suppose: La classe PrintDialog a cette routine qui s'appelle après la fermeture de l'appel 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); 
    }

Il existe également une interaction assez intéressante ici (en gardant à l'esprit que vous définissez des imprimeurs .Topage):

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

et ensuite

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

Pas une réponse directe que je connaisse, mais je pense que je devrais vous pointer dans la bonne direction de la raison pour laquelle cela ne fonctionne pas. Il me semble que lors de l'utilisation du dialogue, il peut être heureux de nuller les paramètres sur les modifications, car il sera recréé à la fin, mais lorsque la dialogue est terminée, la modification des paramètres invalide réellement les paramètres d'impression de document jusqu'à ce qu'il soit réparti. Il peut être possible de le faire manuellement, ou il peut être loch \ ked par M $ de manière interne / privée habituelle, de nombreux internaux sont.

Il y a une option bien sûr (pas aussi bien que je sache) simplement utiliser l'API Win Diectement après que le code de l'appel puisse être hythié à partir des entrées ci-dessus pour construire votre propre wrapper si nécessaire.

bonne chance.

Autres conseils

de la documentation asposée:

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

Il semble donc que vous puissiez passer votre objet imprimeur modifié Yuor dans le document Word que vous essayez d'imprimer.Pourriez-vous me dire si cela fonctionne?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top