When settings for a print job need to be configured by the user, you can enable the user to make appro priate selections by displaying the PrintDialog component and the PageSetupDialog
Trang 1Lab: Use the XmlDocument Class
In this lab, you will add XmlDocument functionality to a preexisting partial solution You will load the content from the BookStore.xml file into an XmlDocument instance, and then you will add new elements to the XmlDocument instance
� Exercise 1: Add XMLDocument Functionality to a Partial Solution
1 From the directory on the companion CD, load the partial solution for the lan
guage you are working in
2 Open Form1 in the Designer Then, double-click the Load XML button to open
the btnLoadXml_Click event handler
3 Beneath the content already in this method, add the following code:
7 Beneath the first line of code already in this method (for Visual Basic) or within
the if block (for C#), add the following code:
' VB
Trang 2For Each j As ListViewItem In ListView1.Items Dim bElement As Xml.XmlElement
bElement = doc.CreateElement("chapter") bElement.SetAttribute("num", j.SubItems(0).Text) bElement.SetAttribute("name", j.SubItems(1).Text) Dim atext As Xml.XmlText
atext = doc.CreateTextNode(j.SubItems(2).Text) bElement.AppendChild(atext)
Trang 38 Press F5 to compile and run your application
9 Press the Load Xml button and navigate to the Bookstore.xml file located in the
directory on the companion CD Select the file to load it into the XmlDocument
instance
10 Press the View Xml button to view the XML Then, close Form2
11 In Form1, add entries for ISBN, Title, and Price
12 Add entries for Chapter Name and Chapter Text and click the Add Chapter but
ton Repeat this step as many times as you like
13 Press the Add Book button to add the book data to your XmlDocument class
14 Click the View Xml button to view the updated XML Note that the book you
added appears at the end of the XML file
Trang 4Lesson Summary
■ The XmlDocument class provides an in-memory representation of XML data that
can be modified in a direction-independent manner XML data can be read into
an XmlDocument instance through the XmlDocument.Load and XmlDocu ment.LoadXml methods
■ The XmlDocument class contains methods for creating all different kinds of XML
nodes Once a node has been created, it must be inserted into the XML repre
sented by the XmlDocument class by a separate method
■ The XmlDocument class exposes several methods and properties that provide for
the direct modification of the XML that it contains You can change the value of existing nodes, replace specific nodes or an entire set of nodes, replace a range of characters in a value, or set attribute values
■ You can write XML from the XML document to an instance of the XmlWriter class by using the XmlDocument.WriteTo method
■ XmlNamedNodeMap consists of an unordered set of XmlNode instances that can
be accessed by index or name XmlNodeList represents an ordered set of Node instances that can be accessed by index
Xml-■ The XmlDocument class raises events in response to changes in the XML struc
ture You can handle these events to execute code in response to changes in the XML
■ The XML declaration provides information about the XML version and the encoding used for the XML data You can set the encoding property to a value appropriate for different international locales
Lesson Review
The following questions are intended to reinforce key information presented in this lesson The questions are also available on the companion CD if you prefer to review them in electronic form
NOTE Answers
Answers to these questions and explanations of why each choice is right or wrong are located in the “Answers” section at the end of the book
Trang 51 Given an XmlDocument named myDoc and an XmlNode that it contains named
myNode, which of the following code samples will create a new element named Test and add it as a child of myNode?
2 Given an instance of XmlNode named Node1 that has a child node named
child-Node and a string aString that contains a set of XML nodes, you want to replace the child node of Node1 with the XML contained in aString Which of the follow
ing code samples is correct for this scenario?
A ' VB
Node1.ReplaceChild(childNode, aString)
// C#
Node1.ReplaceChild(childNode, aString);
Trang 7Chapter Review
To further practice and reinforce the skills you learned in this chapter, you can perform the following tasks:
■ Review the chapter summary
■ Review the list of key terms introduced in this chapter
■ Complete the case scenarios These scenarios set up real-world situations involving the topics of this chapter and ask you to create a solution
■ Complete the suggested practices
■ Take a practice test
Chapter Summary
■ The XmlReader class is an abstract class Implementations of this class provide cached, forward-only access to an XML file or stream XmlTextReader, XmlNode- Reader, and XmlValidatingReader all provide implementations of the XmlReader class The XmlReader.Read method advances the reader to the next node of the
non-XML and reads the name and value of that node You can navigate the attributes of
an element with the MoveToAttribute method
■ The XmlWriter class is an abstract class Implementations of this class are used
for writing XML content in a forward-based manner You can obtain an instance
of a default implementation of XmlWriter through the XmlWriter.Create method
■ The XmlDocument class provides an in-memory representation of XML data It
provides methods for creating XML nodes, inserting them into the XML document, copying nodes, removing nodes, and modifying nodes
■ The XmlDocument class raises events in response to changes in the XML struc
ture You can handle these events to execute code in response to these changes
Trang 8Case Scenarios
In the following case scenarios, you will apply what you’ve learned about working with XML You can find answers to these questions in the “Answers” section at the end of this book
Case Scenario 1: Report Archiving
Well, you’re moving on up in the world of the Humongous Insurance company, and they’ve put you on another very important project One thing that they love at Humongous Insurance is paperwork Recently, affiliate offices all over the world have switched to sending weekly reports to the home office in an XML format These reports all need to be stored and archived and will be compressed using a proprietary technology in-house Your job is to make sure that reports coming in can be automatically parsed and fed into the compression API
Questions
1 How can we automatically parse incoming reports?
2 How can we ensure that reports conform to our published schema?
3 How can we ensure that errors can be corrected by a human being when they
occur?
Case Scenario 2: The Merger
Humongous Insurance has just acquired Trey Research The main reason for the acquisition of Trey Research was a vast store of proprietary paperwork in custom XML formats The acquisition is now complete and Humongous Insurance needs to replace the name of Trey Research with its own as well as with some other particulars Unfortunately, due to variations in some of the content, a textual find-and-replace is out of the question, and the content must be replaced based on the element name that surrounds the content, not on the content itself
Questions
■ How can we create a simple application that can quickly replace some of the information contained in these nodes with our own information but leave the rest of the documents intact?
Trang 9Suggested Practices
■ Build an application that allows the user to enter data into a grid and then uses
the XmlWriter class to write it to an XML file
■ Create a subclass of XmlDocument that validates the structure of the XML against
an inline or referenced schema whenever the structure of the XML changes Use
the data object model (DOM) events to write the XML content of the XmlDocu ment instance to a stream that is read by XmlValidatingReader that raises events
when an error occurs
Take a Practice Test
The practice tests on this book’s companion CD offer many options For example, you can test yourself on just the content covered in this chapter, or you can test yourself on all the 70-526 certification exam content You can set up the test so that it closely simulates the experience of taking a certification exam, or you can set it up in study mode
so that you can look at the correct answers and explanations after you answer each question
MORE INFO Practice tests
For details about all the practice test options available, see the “How to Use the Practice Tests” sec tion in this book’s Introduction
Trang 11Creating printed documents is an essential task in most business environments, but
it can be a complicated and confusing task to program Microsoft Visual Studio 2005 provides several classes and dialog boxes that simplify the task of programming
printing This chapter describes the use of the various print dialog boxes, the Document component, and the PrintPreview control
Print-Exam objectives in this chapter:
■ Manage the print process by using print dialogs
❑ Configure Windows Forms print options at run time
❑ Change the printers attached to a user’s computer in Windows Forms
❑ Configure the PrintPreviewDialog control
❑ Display a Print Preview window in Windows applications
❑ Set page details for printing using the PageSetupDialog component
■ Construct print documents
❑ Configure the PrintDocument component
❑ Print a text document in a Windows Form
❑ Print graphics in a Windows Form
❑ Print a document by using the PrintDialog component
❑ Alert users to the completion of a print job
■ Create a customized PrintPreview component
❑ Set the Document property to establish the document to be previewed
❑ Set the Columns and Rows properties to establish the number of pages dis
played horizontally and vertically on the control
❑ Set the UseAntiAlias property to True to make the text appear smoother
❑ Set the Zoom property to establish the relative zoom level when the docu
ment preview appears
485
Trang 12❑ Set the StartPage property to establish which document page is displayed
when the document preview appears
❑ Set additional properties
❑ Add custom methods and events to a PrintPreviewControl
Lessons in this chapter:
■ Lesson 1: Managing the Print Process by Using Print Dialogs 487
■ Lesson 2: Constructing Print Documents 496
■ Lesson 3: Creating a Customized PrintPreview Component 509
Before You Begin
To complete the lessons in this chapter, you must have:
■ A computer that meets or exceeds the minimum hardware requirements listed in the “Introduction” at the beginning of the book
■ Visual Studio 2005 Professional Edition installed on your computer
■ An understanding of Microsoft Visual Basic or C# syntax and familiarity with the Microsoft NET Framework
Real World
Matt Stoecker
The process of creating print documents can be frustrating and difficult Before the NET Framework was introduced, I found the process of actually getting a document to the printer to be so difficult that I avoided it whenever I possibly could With the introduction of the NET Framework, printing is now easy to code and it is easier to create added value in the applications I create
Trang 13Lesson 1: Managing the Print Process by Using Print
Dialogs
When printing a document, a user typically will want to have a high level of configurability over the printing process Users typically want to be able to choose options such as paper orientation, margins, and paper size The NET Framework contains classes that allow you to expose a broad range of options to your users while still retaining control over the range of options you permit
After this lesson, you will be able to:
■ Configure Windows Forms print options at run time
■ Change the printers attached to a user’s machine in Windows Forms
■ Configure the PrintPreviewDialog control
■ Display a Print Preview in Windows applications
■ Set page details for printing using the PageSetupDialog component
Estimated lesson time: 45 minutes
The PrinterSettings Class
The class that contains all of the information about a print job and the page settings
associated with that print job is the PrinterSettings class Each PrintDocument compo nent exposes an instance of the PrinterSettings class and accesses this instance to get
the settings for the print job Most of this is done automatically, and the developer
need not worry about accessing the PrinterSettings class directly When settings for a
print job need to be configured by the user, you can enable the user to make appro
priate selections by displaying the PrintDialog component and the PageSetupDialog
component
The PrintDialog Component
The PrintDialog component encapsulates a Print dialog box This dialog box can be
displayed to the user at run time to allow the user to configure a variety of options for
printing as well as allowing the user to choose a printer The PrintDialog component
at run time is shown in Figure 10-1
Trang 14Figure 10-1 The PrintDialog component at run time
The PrintDialog component also exposes a variety of properties to the developer that allow him or her to configure the interface of the PrintDialog component when
it is shown The important properties of the PrintDialog component are described in
AllowPrintToFile Indicates whether the Print To File check box is enabled
AllowSelection Indicates whether the Selection option button is enabled
AllowSomePages Indicates whether the Pages option button is enabled
Document The PrintDocument that is associated with the PrintDialog
box
PrinterSettings The PrinterSettings object associated with the selected
printer These settings are modified when the user changes settings in the dialog box
Trang 15Table 10-1 Important Properties of the PrintDialog Component
PrintToFile Indicates whether the Print To File checkbox is selected
ShowHelp Indicates whether the Help button is shown
ShowNetwork Indicates whether the Network button is shown
Modifying Selected Print Options with the PrintDialog Component
When the PrintDialog component is shown, the user can make changes to the config
uration of the print job by setting options that are displayed in the PrintDialog box
You can restrict the options displayed by modifying the properties of the PrintDialog
component This generally involves setting one of the Boolean properties described in
Table 10-1 to True to enable the option or False to disable the option The following
example demonstrates how to enable the user to select a range of pages to print
' VB
PrintDialog1.AllowSomePages = True
// C#
printDialog1.AllowSomePages = true;
By setting the properties described in Table 10-1, you can configure your PrintDialog
component to allow or restrict whatever options you desire For example, the follow
ing code example demonstrates how to create a PrintDialog component that allows
the user to print all pages, the current page, a selection, or a specified range of pages:
Changing the Selected Printer at Run Time
The PrintDialog component allows the user to change the selected printer at run time
by choosing a printer displayed in the Print dialog box When the user selects a new
printer, the PrinterSettings property is updated to reflect this
Trang 16Using the PrintDialog Box to Print a PrintDocument Component
After options have been selected, you can query the DialogResult returned by the Dialog.ShowDialog method If the DialogResult is OK, you can print the associated PrintDocument component by calling the PrintDocument.Print method An example is
Print-shown here:
' VB
// C#
PrintDialog1.Document.Print();
The PageSetupDialog Component
The PageSetupDialog component enables users to select options about the setup of the pages for a print job A PageSetupDialog component at run time is shown in Figure 10-2
Figure 10-2 The PageSetupDialog component at run time
Trang 17Changes made by the user in the PageSetupDialog are automatically reflected in the PrinterSettings class of the PrintDocument component that is associated with the Page- SetupDialog box You can set the options that will be displayed to the user by setting the properties of the PageSetupDialog component Important properties of the Page- SetupDialog component are shown in Table 10-2
Table 10-2 Important Properties of the PageSetupDialog Component
AllowMargins Indicates whether the margins section of the dialog box
is enabled
AllowOrientation Indicates whether the orientation section of the dialog
box (landscape versus portrait) is enabled
AllowPaper Indicates whether the paper section of the dialog box
(paper source and paper size) is enabled
AllowPrinter Indicates whether the printer button is enabled
Document The PrintDocument associated with this component EnableMetric Indicates whether the margin settings, when displayed
in millimeters, should be automatically converted to and from hundredths of an inch
MinMargins Indicates the minimum margins, in hundredths of an
inch, the user is allowed to select
ShowHelp Indicates whether the Help button is visible
ShowNetwork Indicates whether the Network button is visible
To show a PageSetupDialog, the component must be associated with an instance of the PageSettings class The preferred way of doing this is to set the Document property to
an instance of the PrintDocument class, which automatically sets the PrintDocu ment.PrinterSettings instance to the PageSetupDialog.PrinterSettings property The fol lowing code example demonstrates how to set the Document property of the PageSetupDialog component and then display it to the user
' VB
' Assumes an instance of PrintDocument named PrintDocument1 and an
' instance of PageSetupDialog named PageSetupDialog1
Trang 18// C#
The PrintPreviewDialog Component
The PrintPreviewDialog component is a self-contained dialog box that allows you to preview a print document It does so by calling the Print method of the PrintDocument component that is specified in the component’s Document property and redirecting
the output to a graphical representation of the page contained in the dialog box The
PrintDocumentDialog component is shown at run time in Figure 10-3
Figure 10-3 The PrintDocumentDialog component at run time
The dialog box allows the user to view each page before printing, adjust the number
of pages displayed, and adjust the zoom factor so that pages can be viewed close up
or at a distance After viewing the preview, the user can choose to print the document
by clicking the Print button, which calls the Print method of the PrintDocument com
ponent and directs the output to the printer The following code example demon
strates how to associate a PrintDocument component with a PrintPreviewDialog
component and display it to the user at run time:
' VB
PrintPreviewDialog1.Document = PrintDocument1
PrintPreviewDialog1.ShowDialog()
Trang 19// C#
printPreviewDialog1.Document = printDocument1;
printPreviewDialog1.ShowDialog();
Quick Check
1 What is the purpose of the PrintDialog component?
2 What is the purpose of the PrintPreview component?
Quick Check Answers
1 The PrintDialog component represents a Print dialog box, and it allows you
to configure print options for presentation to the user At run time, you can
call the PrintDialog.ShowDialog method to display the Print dialog box to
the user
2 The PrintPreviewDialog component represents a print preview dialog box,
and allows you to configure options for displaying the document to the user prior to actually sending it to the printer
Lab: Use Print Dialogs
In this lab, you will create a simple application that enables the user to use Dialog, PrintDialog, and PrintPreviewDialog to control the printing of a test document
PageSetup-� Exercise 1: Using Print Dialogs
1 Open the partial solution for Chapter 10, Lab 1 from Open Form1 Note that it
already has a PrintDocument component named PrintDocument1 and that there
is code in the event handler for the PrintPage event
2 From the Toolbox, drag a MenuStrip onto the form Add a top-level menu item
named File
3 Beneath the File menu item, add the following menu items: Page Setup, Print,
Print Preview
4 From the Toolbox, drag a PageSetupDialog component, a PrintDialog component,
and a PrintPreviewDialog component onto the form
5 In the Properties window, set the Document property of each dialog component
to PrintDocument1
6 In the Properties window, set the AllowSomePages property of PrintDialog1 to
True
Trang 207 In the Designer, double-click PageSetupToolStripMenuItem and add the follow
10 Press F5 to run your application Choose each of the menu items to demonstrate
how to open the different print dialog boxes
Lesson Summary
■ The PrintDialog component represents a Print dialog box By setting the Docu ment property of a PrintDialog component, you can enable the user to change the print settings for that document The PrintDialog component exposes several
properties that allow you to set what options the user can configure
■ The PageSetupDialog component represents a Page Setup dialog box By set ting the Document property of a PageSetupDialog component, you can enable the user to change the page settings for that document The PageSetup compo
nent exposes several properties that allow you to set what options the user can configure
■ The PrintPreviewDialog component represents a Print Preview dialog box The Document property indicates the PrintDocument component that is currently
Trang 21being previewed The PrintPreviewDialog component allows the user to config
ure the presentation of the previewed document through buttons in the user interface
Lesson Review
The following questions are intended to reinforce key information presented in this lesson The questions are also available on the companion CD if you prefer to review them in electronic form
2 Which of the following is required to display a PrintDocument in a
PrintPreview-Dialog component? (Choose all that apply.)
A You must set the PrintPreviewDialog.Document property
B You must call the PrintPreviewDialog.Print method
C You must call either the PrintPreviewDialog.Show or the PrintPreviewDialog
.ShowDialog method
D You must raise the PrintPreviewDialog.PrintPages event
3 Which of the following can you not enable a user to do with the PageSetupDialog
component?
A Set the page orientation
B Set the paper tray
C Add a printer
D Set the page margins
Trang 22Lesson 2: Constructing Print Documents
The PrintDocument component represents a document that is sent to a printer You can use the PrintDocument component to print text documents or graphical docu ments In this lesson, you will learn to configure the PrintDocument component and
use it to create printed documents
After this lesson, you will be able to:
■ Configure the PrintDocument component
■ Print a text document in a Windows Form
■ Print graphics in a Windows Form
■ Print a document by using the PrintDialog component
■ Alert users to the completion of a print job
Estimated lesson time: 45 minutes
The PrintDocument Component
A printed document is represented by the PrintDocument component It is a compo
nent that does not have a visual representation at run time but appears in the component tray at design time and can be dragged from the Toolbox to the design surface
The PrintDocument component encapsulates all of the information necessary to print
a page
Overview of Printing
In the NET Framework printing model, printed content is provided directly by the
application logic A print job is initiated by the PrintDocument.Print method This starts the print job and then raises one or more PrintPage events If there is no client
method to handle this event, printing does not take place By providing a method to handle this event, you specify the content to be printed
If the print job contains multiple pages, one PrintPage event is raised for each page in the job This, in turn, causes the method handling the PrintPage event to execute mul
tiple times Thus, that method must implement functionality to track the print job and ensure that successive pages of a multipage document are printed Otherwise, the first page of the document will print multiple times
Trang 23The PrintPage Event
The PrintPage event is the main event involved in printing documents To actually
send content to the printer, you must handle this event and provide code to render
the content in the PrintPage event handler All of the objects and information needed
to send content to the printer are wrapped in the PrintPageEventsArgs object, which is received by the handler for this event Table 10-3 describes the properties of the Print- PageEventArgs object
Table 10-3 Properties of the PrintPageEventArgs Object
Cancel Indicates whether a print job should be cancelled You can
cancel a pending print job by setting the Cancel property to True
Graphics The Graphics object is used to render content to the printed
page Encapsulates the drawing surface represented by the printer
HasMorePages Gets or sets a value that indicates whether additional pages
should be printed Set this property to True in the event han
dler to raise the event again
MarginBounds Gets the Rectangle object that represents the portion of the
page within the margins
PageBounds Gets the Rectangle object that represents the total page area PageSettings Gets or sets the PageSettings object for the current page
Content is rendered to the printed page by the Graphics object provided in the PageEventArgs object The printed page behaves just like a form, control, or any other drawing surface that can be represented by a Graphics object To render content, you
Print-use the same methods Print-used to render content to a form The following code example demonstrates a simple method to print a page:
' VB
' This method inscribes an ellipse inside the bounds of the page This
' method must handle the PrintPage event in order to send content to the printer
Public Sub PrintEllipse(ByVal sender As System.Object, ByVal e As _
System.Drawing.Printing.PrintPageEventArgs)
e.Graphics.DrawEllipse(Pens.Black, e.MarginBounds)
End Sub
Trang 24// C#
// This method inscribes an ellipse inside the bounds of the page This
// method must handle the PrintPage event in order to send content to the printer
public void PrintEllipse(object sender, System.Drawing.Printing.PrintPageEventArgs e) {
The MarginBounds and PageBounds properties represent areas of the page surface You
can specify printing to occur inside the margin bounds of the page by calculating
printing coordinates based on the MarginBounds rectangle Printing that is to take
place outside of the margin bounds, such as headers or footers, can be specified by
calculating the printing coordinates based on the PageBounds rectangle Print coordi
nates are in pixels by default
You can specify that a print job has multiple pages by using the HasMorePages prop erty By default, this property is set to False When your application logic determines that multiple pages are required to print a job, you should set this property to True When the last page is printed, the property should be reset to False Note that the method handling the PrintPage event must keep track of the number of pages in the
job Failure to do so can cause unexpected results while printing For example, if you
fail to set the HasMorePages property to False after the last page is printed, the applica tion will continue to raise PrintPage events
You can cancel a pending print job without finishing by setting the Cancel property to True You might do this, for example, if the user clicked a Cancel button on your form You can end create an event handler for the PrintPage event by double-clicking the PrintDocument instance in the Designer to create a default event handler
Printing Graphics
Printing graphics is essentially the same as rendering them to the screen You use the
Graphics object supplied by PrintPageEventArgs to render graphics to the screen Sim
ple shapes can be printed, or complex shapes can be created and printed using the
GraphicsPath object The following code example shows how to print a complex shape with a GraphicsPath object:
' VB
' This method must handle the PrintPage event
Trang 25End Sub
// C#
// This method must handle the PrintPage event
public void PrintGraphics(object sender, System.Drawing.Printing.PrintPageEventArgs e) {
}
To print a graphics job that has multiple pages, you must manually divide the job among pages and implement the appropriate logic For example, the following method uses twelve pages to draw an ellipse that is six times as long as the page and two times as wide
' VB
' These two variables are used to keep track of which page is printing
Private x As Integer
Private y As Integer
' This method must handle the PrintPages event
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, _