2010-01-06 40 views

Trả lời

7

Một tập hợp con của các giá trị được xác định trước có thể có bằng cách duyệt qua một bộ sưu tập PrinterSettings.PaperSizes.

Ứng dụng của chúng tôi có người dùng chọn máy in, cung cấp cho chúng tôi một đối tượng PrinterSettings. Có trong PrinterSettings là danh sách các máy in được hỗ trợ bởi PaperSize - không phải mọi thứ (lưu ý rằng Trình điều khiển Tài liệu XPS (win7) hỗ trợ tất cả các kích cỡ).

Trong trường hợp của chúng tôi, tập hợp con các kích thước được hỗ trợ này là tất cả những gì chúng tôi cần. Người dùng được chỉ định PaperKind được chuyển tới mã in của chúng tôi và nó đi qua đối tượng PrinterSettings của chúng tôi cho đến khi tìm thấy lựa chọn của người dùng hoặc từ bỏ và sử dụng mặc định.

Trong ví dụ bên dưới, bạn có thể thấy rằng các đối tượng PaperSize được điền chính xác.

PrinterSettings settings = new PrinterSettings(); 
foreach (PaperSize size in settings.PaperSizes) 
    Debug.WriteLine(size); 

Chỉ là tập hợp con, nhưng có lẽ cũng đủ cho bạn. các API in trong .NET thực sự không rõ ràng và msdn không thực sự giúp ích nhiều ... Hy vọng nó sẽ giúp bạn đi đúng hướng!

2

Bạn có thể thử lớp System.Drawing.Printing.PaperSize. Có một thuộc tính RawKind có thể được đặt thành System.Drawing.Printing.PaperKind.

Cái gì như:

PaperSize size = new PaperSize(); 
size.RawKind = (int) PaperKind.A3; 
+0

số Trong trường hợp chiều cao và chiều rộng vẫn là 0. – alga

+0

người đàn ông, bạn sẽ nghĩ rằng có một số loại lớp helper cho việc này. http://msdn.microsoft.com/en-us/library/system.drawing.printing.paperkind.aspx liệt kê từng PaperKind cùng với chiều cao và chiều rộng. Có lẽ bạn nên viết một lớp trợ giúp và đăng nó? – hackerhasid

+0

Tôi đã thấy rằng lớp enum. Nhưng tôi không muốn viết bất kỳ lớp nào vì có thể có những lớp đã được viết. – alga

5

Một LINQ cách để đạt được mục tiêu của bạn là một cái gì đó như thế này:

PrinterSettings printerSettings = new PrinterSettings(); 
IQueryable<PaperSize> paperSizes = printerSettings.PaperSizes.Cast<PaperSize>().AsQueryable(); 
PaperSize a4rotated = paperSizes.Where(paperSize => paperSize.Kind == PaperKind.A4Rotated).FirstOrDefault(); 

Chúc may mắn!

+0

// https://stackoverflow.com/questions/17602366/why-can-i-not-call-toarray -on-a-generic-ienumerable-object bằng System.Linq; – udoline

2
public static PaperSize GetPaperSize(string Name) 
    { 
     PaperSize size1 = null; 
     Name=Name.ToUpper(); 
     PrinterSettings settings = new PrinterSettings(); 
     foreach (PaperSize size in settings.PaperSizes) 
      if (size.Kind.ToString().ToUpper() == Name) 
      { 
       size1 = size; 
       break; 
      } 
     return size1;    
    } 
0
PaperSize pkSize; 
PrintDocument printDoc = new PrintDocument(); 
for (int i = 0; i < printDoc.PrinterSettings.PaperSizes.Count; i++) 
{ 
    pkSize = printDoc.PrinterSettings.PaperSizes[i]; 
    cmbPaperSize.Items.Add(pkSize); 
} 
+2

Thêm một giải thích nhỏ cho câu trả lời của bạn để giải thích lý do tại sao nó hoạt động. – Morgoth

+0

sử dụng tính năng này bằng System.Drawing.Printing; –

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