Chapter 10: Case Scenario Answers Case Scenario 1: A Better PrintPreview Control To create a component like the one described, you would start by creating a new form that contains a Pr
Trang 1In the ValidationError event handler, we can save the XML file as is instead of process
ing it and add it to a queue of items that must be hand-examined
Case Scenario 2: The Merger
By designing our application around the XmlDocument class, we can accomplish this quickly and easily Each document can be loaded into an instance of the XmlDocument class We can retrieve the nodes in question by using the XmlDocument.GetElements-
ByTagName Because these elements wrap text, we can use the XmlNode.ReplaceChild
method to replace the child text elements with the text we specify
Chapter 10: Lesson Review Answers
Lesson 1
1 Correct Answer: C
A Incorrect The PrintPreviewDialog represents a print preview form but does
not allow the user to add printers
B Incorrect The PageSetupDialog represents a page setup form but does not
allow the user to add printers
C Correct Users can add printers from the PrintDialog
D Incorrect The PrintPreviewControl can be used to create customized print
preview components but does not allow the user to add printers
2 Correct Answers: A and C
A Correct You must set the Document property to the PrintDocument you
want to preview
B Incorrect The PrintPreviewDialog automatically generates the output for
the PrintDocument component and displays it No additional method or
event is necessary to generate the previewed document
C Correct You must display the form to preview the document
D Incorrect The PrintPreviewDialog automatically generates the output for
the PrintDocument component and displays it No additional method or
event is necessary to generate the previewed document
3 Correct Answer: C
A Incorrect Users can set the page orientation from the PageSetupDialog
component
Trang 2B Incorrect Users can set the paper tray from the PageSetupDialog component
C Correct The user can add a printer within the PrintDialog box only
D Incorrect Users can set the page margins from the PageSetupDialog com
ponent
Lesson 2
1 Correct Answer: B
A Incorrect PrintPages is the event that is raised to print pages, but it cannot
be called like a method
B Correct Set the HasMorePages property to True to raise the PrintPages event
again and print multiple pages
C Incorrect HasMorePages is a property, not a method
D Incorrect The Cancel property can be set to True to cancel the current print
job, but setting it to False does not automatically print additional pages
2 Correct Answer: A
A Correct To find the total lines on the printed page, you divide the height of
the MarginBounds by the height of the Font
B Incorrect The GetHeight method requires a Graphics object as a parameter
C Incorrect GetHeight is not a member of the Graphics object
D Incorrect Using the height of the PageBounds will calculate the total number
of lines in the page, including the excluded areas of the header and footer
3 Correct Answer: B
A Incorrect The BeginPrint event occurs at the beginning of a print job
B Correct The EndPrint event occurs after all pages have been printed, and it is
the appropriate event to handle to notify the user that a print job is complete
C Incorrect The PrintPages event is used to send data to the printer
D Incorrect The QueryPageSettings event occurs before each page is printed
to allow the user to use different page settings for each page
Lesson 3
1 Correct Answer: C
A Incorrect In the Zoom property, a value of 1 represents 100 percent normal
size Thus, 250 would correspond to a zoom of 25,000 percent
Trang 3B Incorrect In the Zoom property, a value of 1 represents 100 percent normal
size Thus, 25 would correspond to a zoom of 2,500 percent
C Correct In the Zoom property, a value of 1 represents 100 percent normal
size Thus, 2.5 would correspond to a zoom of 250 percent
D Incorrect In the Zoom property, a value of 1 represents 100 percent normal
size Thus, 25 would correspond to a zoom of 25 percent
2 Correct Answer: B
A Incorrect UseAntiAlias is a property, not a method
B Correct To smooth the appearance, set the UseAntiAlias property to True
C Incorrect UseAntiAlias is a property, not a method, and it exists in the
PrintPreviewControl class, not on the Document property
D Incorrect UseAntiAlias exists in the PrintPreviewControl class, not on the
Document property
Chapter 10: Case Scenario Answers
Case Scenario 1: A Better PrintPreview Control
To create a component like the one described, you would start by creating a new form
that contains a PrintPreviewControl that would be used to display the document By adding a Timer component, you can change the PrintPreviewControl.StartPage prop
erty at regular intervals to cycle through the pages One way of implementing page
skipping would be to subclass the PrintPreviewControl and add a property that indi
cated the step to take when skipping pages
Case Scenario 2: A Simple Report Tool
Because the form is already the size of a piece of paper, the task is quite simplified In
the method handling the PrintPages event, you can loop through the controls on the form For the label controls, you can use the Graphics.DrawString method to print the
string in the label using the same font and location as the label itself For image con
trols, you can likewise print the image using the Graphics.DrawImage method to draw
the image at the location specified by the image control
You can print a report for each record in the database by iterating through the records
in the PrintPage event handler After a page has been printed, the method should check to see if any more records exist If so, the e.HasMorePages property should be set
to True and the next record printed
Trang 4Chapter 11: Lesson Review Answers
Lesson 1
1 Correct Answer: D
A Incorrect Although most drag-and-drop operations begin in the
Mouse-Down event on the source control, it is not required that they begin here
B Incorrect Although most drag-and-drop operations end with the mouse
button being released, this is handled by the DragDrop event
C Incorrect The DragLeave event is used to execute code when data is dragged
out of a control, but it is not necessary for the drag-and-drop operation
D Correct The DragDrop event must be handled to complete a drag-and
drop-operation
2 Correct Answers: A, B, C, and D
A Correct The DoDragDrop method begins the drag-and-drop operation
B Correct If the target control does not allow one of the specified effects, the
operation will not be completed
C Correct If the data format is not correct, the operation cannot be completed
D Correct If AllowDrop is set to False, no drag-and-drop operation may occur
3 Correct Answer: B
A Incorrect Whereas the MouseDown event is used to initiate most drag-and
drop operations, the ItemDrag event is used to initiate a drag-and-drop operation in a TreeView control
B Correct Use the ItemDrag event to call the DoDragDrop method
C Incorrect The TreeView.DragEnter event should be used to set the effect
allowed for the and-drop operation, but it will not be raised if a and-drop operation has not already been started
drag-D Incorrect The TreeView.DragDrop event is used to complete the drag-and
drop operation
Lesson 2
1 Correct Answer: C
A Incorrect CurrentUICulture determines the localized version of the form
that is loaded but does not control data formatting
Trang 5B Incorrect Culture is set by the thread, not by the form
C Correct The CurrentCulture setting determines the formatting methods
used for application data
D Incorrect Culture is set by the thread, not by the form
2 Correct Answers: C and D
A Incorrect Because the default value for the RightToLeft property is Inherit,
you only need to set the Form.RightToLeft property to True for the control
text to be displayed right to left
B Incorrect Because the default value for the RightToLeft property is Inherit,
you only need to set the Form.RightToLeft property to True for the control
text to be displayed right to left
C Correct Setting the Form.RightToLeft property to True will cause all con
trols with a RightToLeft property value of Inherit to display text right to left
D Correct Setting the Form.RightToLeftLayout property to True, along with
setting the Form.RightToLeft property to True, will cause the entire form to
lay out in a right-to-left manner
Lesson 3
1 Correct Answers: A and C
A Correct You must create a parent form by setting the IsMdiParent property
to True
B Incorrect The ActiveMdiForm property is to determine which child form is
active, but it is not required to create a child form
C Correct You create a child form by setting the MdiParent property to an
appropriate parent form
D Incorrect It is not necessary to create a window list menu to create a child
form
2 Correct Answer: D
A Incorrect This method is used to activate a child form, not to get a refer
ence to the active form
B Incorrect This method adds an owned form but does not return a refer
ence to it
C Incorrect This property reports whether the form is a child form but does
not return a reference
Trang 6D Correct The ActiveMdiChild property holds a reference to the currently
active MDI form
Chapter 11: Case Scenario Answers
Case Scenario 1: Still More Document Control
By using an MDI application, you can enable users to view multiple child documents while containing and organizing them in a single form The parent form can include
a TreeView control to display the documents in the table of contents, and the docu
ments can be loaded as child forms when viewing is required You can use drag-and
drop functionality to enable reordering of the table of contents in the TreeView control
at run time
Case Scenario 2: Fabrikam Goes International
You can create an MDI form that displays two child forms simultaneously: one for the European market and one for the U.S market You can ensure that market data is for
matted appropriately by setting the CurrentCulture property to an appropriate culture
before creating the form
You can create localized versions of the user interface by researching what locales the application will be deployed in and creating localized strings and other resources for the user interface You can then use these strings to create localized versions of the
form At run time, the application will retrieve the CurrentUICulture from the system
and automatically display the correctly localized user interface If desired, you can
also allow the user to manually switch locales by setting the CurrentUICulture prop
erty in code
Chapter 12: Lesson Review Answers
Lesson 1
1 Correct Answers: A, B, and D
A Correct A user interface should be flexible to accommodate a variety of
accessibility styles
B Correct Consistency allows your application to interact with the system in
a predictable manner, thus enhancing accessibility
Trang 7C Incorrect An accessible interface does not have to be a simple interface
Even complicated interfaces can be made accessible
D Correct Accessible interfaces should be compatible with accessibility aids
2 Correct Answer: A
A Correct Although sound can be helpful, no information should be con
veyed by sound alone
B Incorrect This is an accessibility best practice
C Incorrect This is an accessibility best practice
D Incorrect This is an accessibility best practice
Lesson 2
1 Correct Answers: A and C
A Correct The PerformStep method will increment the value to whatever the
Step property is set to
B Incorrect After the Step property is set, you must call PerformStep to
advance the value
C Correct The Increment method advances the Value by the value indicated
D Incorrect The Increment method requires a value for the Value property to
be advanced It does not use the value of the Step property
2 Correct Answers: A, B, and C
A Correct If the next control that is navigated to after the text box does not
have the CausesValidation property set to True, the Validating event on the
text box will not be fired
B Correct To display the error icon, you must call the SetError method and
set the error to an informative string
C Correct To cancel the error, you must call the SetError method and set the
error string to an empty string
D Incorrect The ErrorProvider component does not have inherent validation
capabilities
3 Correct Answer: B
A Incorrect Although you must call SetShowHelp, you must also set the
Help-Navigator to Find
Trang 8B Correct You must call the SetShowHelp method to set ShowHelp to True,
and you must set the HelpNavigator to Find to open the search page
C Incorrect Whereas you must call the SetShowHelp method to set ShowHelp
to True, setting the HelpNavigator to Topic will open help to a topic, not to
the search page
D Incorrect Setting the HelpString will not have any effect when the
Help-Navigator has been set
Chapter 12: Case Scenario Answers
Case Scenario 1: Putting the Final Touches on the Document
Management System
You can use the HScrollBar or VScrollBar to build an interface that provides rapid nav
igation through the long list of files By tying the value of the scroll bar to the location
in the file list, you can allow the user to rapidly navigate to the approximate location
of the desired file and then use fine adjustments to find the exact location
You can use the ProgressBar control to provide feedback for the download status When download is complete, you can notify the user by playing a beep from System-
Sounds
You can provide help for the application by creating a compiled help file (.chm) and
using the HelpProvider component to connect it to your application For more imme diate and less in-depth help, you can use the ToolTip component to provide informa tive tooltips for the controls on your application The ErrorProvider component can be
used to provide feedback for invalid user input
Case Scenario 2: Making the Document Management Application Accessible
By using only system colors, you can support high-contrast mode If nonsystem colors are desired for the regular application interface, the application should detect if the system is in high-contrast mode and replace nonstandard colors with system colors
No information should be conveyed by sound alone, so when file downloads are complete, for example, you should provide a visual cue as well as an audible cue
Access keys should be used to enable keyboard access to all important functionality in the application, and this keyboard access should be fully documented
Trang 9System settings should be used throughout the application to support interaction with
usability aids In addition, the AccessibleDescription, AccessibleName, and AccessibleRole
properties should be set to appropriate values
Chapter 13: Lesson Review Answers
Lesson 1
1 Correct Answers: A and B
A Correct The RunWorkerAsync process fires the DoWork event, which con
tains the code that is executed on a background process
B Correct The DoWork event handler contains the code that is executed on
the background process
C Incorrect The ProgessChanged event is fired when the ReportsProgress
method is called, but it is not required for the background process to be run
D Incorrect The WorkerSupportsCancellation property indicates whether the
BackgroundWorker supports cancellation of the background process, but it
is not required for the background process to run
2 Correct Answers: A, B, and C
A Correct You must set the WorkerSupportsCancellation property to True to
allow the process to be cancelled
B Correct You must implement your own code to poll the CancellationPend
ing property and cancel the process
C Correct The CancelAsync method sets the CancellationPending property to
True
D Incorrect You cannot set the CancellationPending property directly You
must instead call the CancelAsync method
3 Correct Answers: A, B, and D
A Correct The ReportProgress method raises the ProgressChanged event and
allows you to specify a percentage of progress
B Correct You must handle the ProgressChanged event to implement code
that is executed when progress is reported
C Incorrect It is unnecessary to poll the IsBusy property to report progress
D Correct You cannot call the ReportProgress method unless the
Worker-ReportsProgress property is set to True
Trang 10C Incorrect Although commonly used to complete an asynchronous
method call, EndInvoke is required to complete the call only if a method
result is required
D Incorrect The DynamicInvoke method is used to call methods synchro
nously using late binding
2 Correct Answers: A and B
A Correct Thread objects are instances of the Thread class, and each thread
must be individually created
B Correct The Thread.Start method starts the new background process
C Incorrect Although you can provide an Object parameter to the new
thread, you can also start a thread with a method that takes no parameters
D Incorrect Once execution of a thread completes, the thread will stop Call
ing Thread.Abort is required only to stop a thread that is still running
3 Correct Answers: B and C
A Incorrect Calls to controls from background threads are inherently unsafe
and must be called through Control.Invoke
B Correct The InvokeRequired property can be queried from any thread to
determine if it is safe to make a direct call or whether Control.Invoke must be
used
C Correct The Control.Invoke method can be used to make safe calls to con
trols from background threads
D Incorrect The Control.IsAccessible property indicates if the control is acces
sible to accessibility aids and is not related to calls from background threads
Trang 11Chapter 13: Case Scenario Answers
Case Scenario 1: The Publishing Application
The central issue in this application design is the list of documents for download Both the UI thread and the background downloading thread must access this list You
should protect access to this list by using SyncLock or lock blocks where appropriate
to allow access to the list by only one thread at a time A background thread should be used to download the documents When download of a particular document is com
plete, the UI should be updated through the thread-safe Control.Invoke method
Case Scenario 2: Creating a Simple Game
The BackgroundWorker component allows you to implement separate process threads with relative ease In the preceding example, you could create a single Background-
Worker component that takes the path to the file to play as a parameter and then plays
the sound on a background thread When finished, the BackgroundWorker compo
nent can be used again without reinitializing
Chapter 14: Lesson Review Answers
Lesson 1
1 Correct Answers: A and B
A Correct Composite controls consist of preexisting Windows Forms con
trols bound together by common functionality
B Correct You can add new properties, methods, and events to a composite
control
C Incorrect Composite controls provide their own rendering code
D Incorrect Properties of constituent controls are not generally available to
the developer You can wrap the properties of constituent controls in new properties to make them available to the developer, but this is not available
by default
2 Correct Answers: A and D
A Correct A Toolbox bitmap must be a 16-by-16 pixel bitmap
Trang 12B Incorrect Size is important A Toolbox bitmap must be a 16-by-16 pixel
bit-map
C Incorrect The Image property determines what image is displayed in the
control at run time, not what is displayed next to the control in the Toolbox
D Correct The ToolboxBitmap attribute allows you to specify a path, a type, or
a type and a resource name to specify the Toolbox bitmap
Lesson 2
1 Correct Answers: B, C, and D
A Incorrect The methods exposed by the Graphics class use Pen and Brush
objects, but the Graphics class itself does not encapsulate them
B Correct The Graphics class is an in-code representation of the drawing sur
face associated with a visual element
C Correct All actual rendering is done via the Graphics class, and it exposes
all of the methods necessary to do so
D Correct The Graphics class has no constructor and, thus, cannot be
directly created, but you can obtain a reference via PaintEventArgs or by call ing the Control.CreateGraphics method
2 Correct Answers: A and B
A Correct Custom controls must provide all of their own rendering code
B Correct Custom controls can encapsulate other NET Framework compo
nents and, rarely, even other controls
C Incorrect There is no default visual interface for custom controls
D Incorrect Custom controls inherit from the Control class Composite con
trols inherit from the UserControl class
Lesson 3
1 Correct Answer: B
A Incorrect The Form.Show method does not return a DialogResult
B Correct The Form.ShowDialog method returns a DialogResult value
C Incorrect The Form.Show method does not return a DialogResult, nor does
it allow you to specify the parent form as a parameter
Trang 13D Incorrect The Form.ShowDialog method does not allow you to specify a
dialog result as a parameter
2 Correct Answer: C
A Incorrect Although you must override the OnPaint method to provide a
new appearance for an extended control, you are not required to provide a new appearance
B Incorrect If a Toolbox bitmap is not provided, the control will use the
bit-map used by the inherited control
C Correct All that is required to create an extended control is to inherit a
base control All other steps are optional
D Incorrect The extended control will expose all of the same properties and
methods as the control it inherits
Chapter 14: Case Scenario Answers
Case Scenario 1: Collecting and Displaying User Data
The best way to approach this problem is to create a composite control consisting of
TextBox controls to receive the user input This control can be hosted in a dialog box
to receive user input and in the general application to display user input The
Read-Only property of the TextBox controls can be wrapped in new properties in the com
posite control to allow developers to determine when the control is read-only and when it is read-write Finally, by creating a composite control, you will be able to reuse
it in subsequent applications, thereby minimizing developer hours
Case Scenario 2: Trey Research Stock Price
The best approach here is to create a custom control that accesses the Web service
The custom control can encapsulate a Timer component that is set to sample the Web
service every 15 seconds Custom rendering code can be provided to render the stock price and the graph Because it is a control, it can easily be integrated with any Windows Forms application
Trang 14Chapter 15: Lesson Review Answers
Lesson 1
1 Correct Answer: B
A Incorrect Required permissions will be determined when the application
is published You might be asked to approve a permission set, but you do not need to configure permissions
B Correct To install a Click-Once application, you need only to click the
Setup file and follow any instructions
C Incorrect The developer will determine how frequently the application
will check for updates before the application is published
D Incorrect The install mode is configured before the application is published
2 Correct Answer: C
A Incorrect Applications run from the Internet run under the Internet secu
rity zone by default
B Incorrect Applications run from the Internet run under the Internet secu
rity zone by default Applications run from file shares are run under the intranet security settings by default
C Correct Applications run from the Internet run under the Internet secu
rity zone by default
D Incorrect Applications run from the Internet run under the Internet secu
rity zone by default
Lesson 2
1 Correct Answer: A
A Correct The File System Editor is used to determine which files will be dis
tributed by a setup project
B Incorrect The File Types Editor is used to set associations between file
types and applications
C Incorrect The Custom Actions Editor is used to add custom actions to
your application
D Incorrect The User Interface Editor is used to edit the user interface of the
setup wizard
Trang 152 Correct Answer: B
A Incorrect This specifies a particular value for the operating system version
that may not actually exist You should use >= to specify that the operating system should be greater than a specified version
B Correct You should use >= to specify that the operating system should be
greater than a specified version
C Incorrect This requires the operating system to be earlier than Windows
2000 You should use >= to specify that the operating system should be greater than a specified version
D Incorrect This allows installation for any operating system except a partic
ular version of Windows 2000 You should use >= to specify that the operating system should be greater than a specified version
3 Correct Answer: B, C, and D
A Incorrect The Installer class should be added to the project you want to
deploy, not to the setup project itself
B Correct You must add an Installer class to the project you want to deploy
as a custom action
C Correct You must write your custom action in the Install method of an
Installer class
D Correct You must specify the project that contains the custom action in
the Custom Actions Editor
Chapter 15: Case Scenario Answers
Case Scenario 1: Distributing the Document Viewer
Using Click-Once technology, you can provide the version that is available now through a Web site that is accessible by your clients By setting the application to check for updates every time the application is run, you can ensure that your clients receive the most up-to-date version every time they run the application In addition, with a Click-Once application, your clients do not have to be administrative users to install the application
Trang 16Case Scenario 2: Installing the Document Core
By creating a setup project to install the document core, you can create a setup environment that accomplishes all of these goals Directory structures can be defined in the File System Editor, and registry keys can be created through the Registry Editor You can check for prerequisites in a custom action and, if they are not found, use the custom
action to either install the prerequisites, if possible, or throw an InstallException to
abort installation if it is not possible to install them
Trang 17accessible design The principle of designing a user interface to conform to certain principles that allow the application to be accessible by people with differing abilities
application scope When referring to application settings, settings with application scope are read-only at run time
BindingSource A Windows Form component that facilitates data binding controls to
a data source
BLOB A BLOB is a binary large object; a byte array that represents large items such as graphics, music files, executable files, or any large item represented in binary form
ClickOnce A new deployment technology that allows you to quickly publish any application to a Web site or file share, or to install an application on a computer ClickOnce applications typically run under default security settings
composite control A user-authored control that is made up of other controls and
inherits from the UserControl base class
Connection object A representation of a connection to a data source
connection pool A collection of connections available for reuse that reduce the overhead of continuously creating and disposing connections
connection string The information required to connect to a data source, such as database server name, database name, type of credentials to use, and so on
container control A control that can contain other controls, such as a Panel control, a
GroupBox control, or a TabControl control
control A component that has a visual interface and can be hosted in a form or container control Controls contain properties, methods, and events that act
together to create a common functionality Examples of controls include Button,
TextBox, and Label
custom action Code that is executed in the Install, Commit, Rollback, or Uninstall
phase of a Windows Installer installation Custom actions are written in Installer
classes and added to the projects that are to be installed
741
Trang 18custom control A user-authored control that supplies its own code for rendering the user interface
DataAdapter Represents a set of SQL commands and a database connection that are
used to fill the DataSet and update the data source
data binding The concept of displaying data in a control on a form that implements two-way communication between the control and the data source Changes in one are reflected in the other
DataColumn The object in a DataTable that represents the column in a database
table
DataSet An in-memory cache of data that is structured like a relational database with tables and relationships
DataTable The object in a DataSet that represents a single set of returned data
DataView A customizable view of the data in a DataTable that can be sorted, filtered,
and set to display records in a specific state, such as all deleted records
delegate A type-date function pointer that can be used to call a method synchronously or asynchronously
drag-and-drop An operation by which the user grabs data on a form by pressing the left mouse button, drags it across the form, and drops it onto another control by releasing the left mouse button
encryption The process of altering data into an unreadable form that must be decrypted
globalization The process of formatting application data in a locale-specific manner
Graphics object An object that represents a drawing surface When printing, the
Graphics object is used to draw content to the printed page
InstallException An exception that can be thrown by an Installer class Throwing an
InstallException in a custom action will result in the installation being rolled
back
Trang 19integrated security Also known as Windows Authentication This method of security uses existing domain credentials to access a data source
list A group of related objects that are available to an application, usually exposed through a collection A control that works with a list will typically have methods
to add, remove, and otherwise manage members of the list
list-based control A control that is designed to expose or display a list of items Com
mon examples include the ListBox, ComboBox, and CheckedListBox controls
localization The process of displaying a user interface that is customized in a specific manner
locale-mask The format for text entry and display in a MaskedTextBox
MDI child A form that is contained in an MDI parent form
MDI parent A form that contains, hosts, and organizes MDI child forms
MenuStrip A specialized ToolStrip control that is specialized to host
parameter When creating database queries, a variable used to provide alternate values to expressions such as SQL statements and stored procedures
PrintDocument The primary component in printing A PrintDocument component
represents a printed document
PrintPreview An on-screen preview of a printed document You can preview a
Print-Document component in either a PrintPreviewDialog or a PrintPreviewControl
setting A value that properties can be bound to that is persisted between application sessions Also called application setting
setup project A project that produces a Windows Installer application A setup project provides a highly configurable and controllable environment for creating deployments
snaplines Visual aids that appear in the IDE to aid control alignment
thread An operation that occurs concurrently with other operations in an applica
tion Can also refer to an instance of the Thread class, which is used to create and
manage a thread
Trang 20Toolbox A window in the Microsoft Visual Studio IDE from which a control can be dragged onto the designer
ToolStrip A control that is used to host ToolStripItems and can be easily configured by
the user at run time
ToolStripItem A control that can be hosted in a ToolStrip It can represent a menu item,
or any of a number of controls that can be hosted in the ToolStrip
ToolStripMenuItem A control that represents a menu item and is usually hosted in a
value-setting control A control that allows the user to set a value in the user interface
Common examples include CheckBox, RadioButton, and TrackBar controls
XmlDocument A class that provides an in-memory representation of XML data
XmlNode An in-memory representation of an XML node, including child nodes, if any
XmlReader An abstract class that provides non-cached, forward-only access to an XML file or stream
XmlWrite An abstract class that provides a forward-based XML writing model
Trang 21A
B
745