2012-05-15 51 views
6

Tôi đang cố gắng làm một biểu mẫu nguồn cấp dữ liệu & bỏ qua 1 trang trong khi in, tuy nhiên với các dòng mã dưới đây, tôi không thể tạo nguồn cấp dữ liệu biểu mẫu.Nguồn cấp dữ liệu trong C# in

private void InserPageBreak(System.Drawing.Printing.PrintPageEventArgs e) 
{ 
     Font sFont = new Font("Arial", 10); 
     Brush sBrush = Brushes.White; 
     e.Graphics.DrawString("\f", sFont, sBrush, 0, 0); 
} 

Tôi sử dụng PrintDialog để in nội dung trang. Tôi đang sử dụng ký tự nguồn cấp dữ liệu biểu mẫu "\ f" C#.

Bất kỳ suy nghĩ nào về cách triển khai/làm cho nguồn cấp dữ liệu biểu mẫu này hoạt động?

PS: Tôi thậm chí đã cố gắng này:

// ASCII mã 12 - Mã kiểm soát thức ăn dạng máy in.

string test = char.ConvertFromUtf32(12); 
e.Graphics.DrawString(test, sFont, sBrush, 0, 0); 

nội C# chuyển đổi đó để "\ f", nhưng đã không làm thức ăn chăn nuôi dạng, bất cứ ai đã thực hiện "\ f", xin vui lòng chia sẻ suy nghĩ của bạn.

+0

Chỉ vì tò mò, bạn đã thử thay đổi bút vẽ thành Đen? –

+0

Không, tôi đã thử với Đen quá, không hoạt động. – Sharpeye500

+0

Xem [PrintDocument.PrintPage Event] (http://msdn.microsoft.com/en-us/library/system.drawing.printing.printdocument.printpage%28v=vs.100%29.aspx) tìm thấy từ [Nguồn cấp dữ liệu biểu mẫu usage?] (http://bytes.com/topic/c-sharp/answers/274193-form-feed-usage). –

Trả lời

5

Trong .NET, thuộc tính PrintPageEventArgs.HasMorePage nên được sử dụng để gửi nguồn cấp dữ liệu biểu mẫu tới máy in. Bằng cách gọi e.Graphics.DrawString ("\ f", sFont, sBrush, 0, 0), bạn chỉ đơn giản là hiển thị văn bản cho tài liệu sẽ được in, điều này sẽ không bao giờ được máy in giải thích dưới dạng nguồn cấp dữ liệu biểu mẫu.

Vì bạn biết nơi bạn muốn ngắt trang, thay vì gọi phương thức InserPageBreak của bạn, hãy đặt PrintPageEventArgs.HasMorePages = true trong trình xử lý sự kiện PrintPage của bạn. Điều đó sẽ gửi một nguồn cấp dữ liệu biểu mẫu cho máy in và sự kiện PrintPage của bạn sẽ tiếp tục được kích hoạt cho đến khi bạn đặt HasMorePages = false.

Tôi hy vọng điều này sẽ hữu ích. Có thể hữu ích khi xem bạn đã triển khai trình xử lý sự kiện PrintPage của mình như thế nào.

Ví dụ:

Sử dụng các handler BeginPrint để khởi tạo dữ liệu trước khi in

void _document_BeginPrint(object sender, PrintEventArgs e) 
    { 
     //generate some dummy strings to print 
     _pageData = new List<string>() 
       { 
        "Page 1 Data", 
        "Page 2 Data", 
        "Page 3 Data", 
       }; 

     // get enumerator for dummy strings 
     _pageEnumerator = _pageData.GetEnumerator(); 

     //position to first string to print (i.e. first page) 
     _pageEnumerator.MoveNext(); 
    } 

Trong xử lý PrintPage, in một trang duy nhất tại một thời điểm, và thiết lập HasMorePages để cho biết hay không có một trang cần in. Trong ví dụ này, ba trang sẽ in, một chuỗi trên mỗi trang. Sau trang thứ 3, _pageEnumerator.MoveNext() sẽ trả về false, kết thúc lệnh in.

void _document_PrintPage(object sender, PrintPageEventArgs e) 
    { 
     Font sFont = new Font("Arial", 10); 
     Brush sBrush = Brushes.Black; 

     //print current page 
     e.Graphics.DrawString(_pageEnumerator.Current, sFont, sBrush, 10, 10); 

     // advance enumerator to determine if we have more pages. 
     e.HasMorePages = _pageEnumerator.MoveNext(); 
    } 
+0

+1 Đánh bại tôi với nó khoảng 30 giây. –

+0

Cảm ơn. Tôi đã cố gắng thiết lập PrintPageEventArgs.HasMorePages = true; Nó không làm một nguồn cấp dữ liệu mẫu. Bạn có bất kỳ mẫu/ví dụ nhanh nào để hiển thị không? – Sharpeye500

+1

Tôi đã thêm một mẫu ngắn. Tôi đã thử nghiệm nó trước khi đăng và nó in 3 trang riêng biệt. – figabytes

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