2010-01-06 4 views

Odpowiedz

7

Podzbiór ustalonych wartości można było go przez powtarzanie nad PrinterSettings.PaperSizes kolekcji.

Nasza aplikacja umożliwia użytkownikowi wybór drukarki, dostarczając nam obiekt PrinterSettings. Zawarty w PrinterSettings jest listą PaperSize obsługiwanych przez drukarkę - nie wszystko (zwróć uwagę, że sterownik dokumentu XPS (win7) obsługuje wszystkie rozmiary).

W naszym przypadku ten podzbiór obsługiwanych rozmiarów jest wszystkim, czego potrzebujemy. Użytkownik podany PaperKind jest przekazywany do naszego kodu drukowania i przechodzi przez nasz obiekt PrinterSettings, dopóki nie znajdzie wyboru użytkownika lub zrezygnuje i używa wartości domyślnej.

W poniższym przykładzie widać, że obiekty PaperSize są poprawnie wypełnione.

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

To tylko podzbiór, ale może to również wystarczy. drukowanie API w .NET jest naprawdę niejasne, a msdn nie jest zbyt dużą pomocą ... Mam nadzieję, że postawi to na dobrej drodze!

2

Możesz wypróbować klasę System.Drawing.Printing.PaperSize. Istnieje własność RawKind, którą można ustawić na System.Drawing.Printing.PaperKind.

Coś jak:

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

No. W tym przypadku wysokość i szerokość są nadal 0. – alga

+0

człowiek, można by pomyśleć, że to jakiś rodzaj klasy pomocnika do tego. http://msdn.microsoft.com/en-us/library/system.drawing.printing.paperkind.aspx zawiera listę wszystkich PaperKind wraz z wysokością i szerokością. Być może powinieneś napisać klasę pomocnika i opublikować ją? – hackerhasid

+0

Widziałem tę enumową klasę. Ale chciałem nie pisać żadnych zajęć, ponieważ mogą być już napisane. – alga

5

LINQ sposób, aby osiągnąć swój cel jest coś takiego:

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

Powodzenia!

+0

// https://stackoverflow.com/questions/17602366/why-can-i-not-call-toarray -na-a-generic-ienumerable-object przy użyciu 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

Dodaj małe wyjaśnienie do swojej odpowiedzi, aby wyjaśnić, dlaczego to działa. – Morgoth

+0

użyj tego przy użyciu System.Drawing.Printing; –