2012-03-14 32 views
5

Tôi đang cố gắng sửa đổi đối tượng System.Drawing.Printing.PrinterSettings mà tôi nhận được từ System.Windows.Forms.PrintDialog sau khi hộp thoại đã được hiển thị cho người dùng. Mặc dù tôi có thể thay đổi các giá trị thuộc tính trên đối tượng PrinterSettings, nhưng không có thay đổi nào tôi thực hiện sau khi hộp thoại được hiển thị thực sự được xem xét khi in tài liệu.Sửa đổi PrinterSettings sau khi PrintDialog được hiển thị

Dưới đây là một ví dụ về những gì tôi có nghĩa là:

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

Bây giờ sử dụng PrinterSettings đối tượng để in. Tôi sử dụng bên thứ ba dll Aspose.Words cho điều này, vì tôi cần phải in Word, nhưng điều này có vẻ không phải là vấn đề. Có vẻ như sau khi hộp thoại đã được hiển thị, tất cả các cài đặt đã được cam kết với Máy in và việc thay đổi PrinterSettings không đạt được gì. Bất kỳ ý tưởng về cách để có được điều này để làm việc?

EDIT: Tôi có một số giải pháp cho việc này. Những gì tôi muốn ở đây là để có được một câu trả lời cho những câu hỏi cụ thể: Có thể thay đổi đối tượng PrinterSettings sau khi hộp thoại đã được hiển thị và những thay đổi này được xem xét trong in ấn hay không. Nếu ai đó biết chỉ có một cách làm thế nào điều này có thể làm việc (bạn có thể quyết định API bạn muốn sử dụng để in, nó không quan trọng miễn là đối tượng PrinterSettings được sử dụng), tôi sẽ rất biết ơn.

+0

Bất kỳ lý do nào khiến bạn không thay đổi cài đặt trước khi mở hộp thoại? –

+0

Có, trong đơn đăng ký của tôi, tôi có "tài liệu đã được hợp nhất", bao gồm nhiều tài liệu khác nhau. Trong hộp thoại in, chúng sẽ xuất hiện dưới dạng một tài liệu nhưng để in, tôi cần xử lý chúng riêng lẻ. Vì vậy, để được chính xác hơn: Một số các PrinterSettings nên áp dụng cho tất cả các tài liệu, những người khác tôi cần phải thiết lập cho từng tài liệu riêng lẻ. Các thuộc tính/cài đặt riêng lẻ tôi có thể tính toán mà không có sự tương tác của người dùng nhưng để in, tôi cần phải đưa chúng vào các cài đặt của máy in. – user1182735

+0

Hoàn toàn không rõ ràng từ đoạn mã cách đối tượng printerSettings đang được áp dụng cho công việc in thực tế. Ngoài ra, thiếu mã trong đó giải thích nguyên nhân của sự cố. –

Trả lời

2

Không chắc tại sao câu hỏi của bạn bị bỏ phiếu xuống, dường như khá hợp lý đối với tôi ????

Dù sao đi nữa, một vài điều tôi đã nhận thấy với PrintDialog (có thể hoặc không thể trả lời câu hỏi của bạn).

Điều đầu tiên là nó chỉ là một lớp bao bọc cho đối thoại cửa sổ com.

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

và thứ hai, và quan trọng nhất với tài liệu tham khảo cho bạn chất vấn tôi đoán: Lớp PrintDialog có thói quen này được gọi sau khi bế mạc PrintDlg gọi

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); 
    } 

Ngoài ra còn có một động lẫn nhau khá thú vị ở đây (mang trong tâm trí bạn thiết PrinterSettings.ToPage):

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

và sau đó

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

Không phải là một câu trả lời trực tiếp tôi biết, nhưng Tôi nghĩ rằng nên chỉ cho bạn đi đúng hướng vì sao nó không hoạt động. Có vẻ như trong quá trình sử dụng đối thoại, nó có thể vô hiệu hóa các cài đặt khi thay đổi vì nó sẽ được tái tạo khi hoàn thành, nhưng khi đối thoại hoàn tất, việc thay đổi cài đặt sẽ làm mất hiệu lực cài đặt in tài liệu cho đến khi nó được đặt lại. Nó có thể có thể làm điều này bằng tay, hoặc nó có thể được loch \ ked bởi M $ theo cách nội bộ/tư nhân thông thường nhiều internals được.

Có một tùy chọn tất nhiên (không tốt bằng tôi biết) để chỉ sử dụng API của Win sau khi mã gọi có thể được chuyển từ các đối số trên để tạo trình bao bọc của riêng bạn nếu cần.

Chúc may mắn.

+0

Tôi đã không kiểm tra này trong một thời gian và do đó tôi là một chút muộn với phát lại của tôi: Cảm ơn bạn rất nhiều. – user1182735

+0

Và btw. Tôi nghĩ rằng câu hỏi có một downvote vì một số người trên trang web này có xu hướng không đi vào xem xét các vấn đề thực sự và nội dung của câu hỏi. Không sẵn sàng thừa nhận rằng tác giả không chỉ là một ý tưởng siêu lập trình. Liên quan đến câu hỏi này, con đường dễ dàng để thực hiện là nghĩ rằng tôi đã phạm một số sai lầm trong một số phần khác của mã và vấn đề là trong sự thật không tồn tại. Và xin lỗi, tôi không có đủ tín dụng hoặc điểm hoặc bất cứ điều gì để upvote câu trả lời của bạn. – user1182735

1

Từ tài liệu Aspose:

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

Vì vậy, có vẻ như bạn có thể vượt qua PrinterSettings sửa đổi yuor phản đối việc tài liệu từ mà bạn đang cố gắng để in. Bạn có thể cho tôi biết nếu điều này hoạt động?

+0

Xin chào Steve, kết quả là như nhau. Chỉ các thiết lập từ printDialog mới được xem xét. Không phải thay đổi thủ công. Bây giờ tôi làm theo một cách tiếp cận khác và chuyển đổi tất cả các tài liệu thành xps (với Aspose), hợp nhất chúng thành một xps, và sau đó in một xps (hoặc các trang đã chọn) bằng cách sử dụng printdialog wpf. – user1182735

Các vấn đề liên quan