Need to Know More? - Shaheen Education Family

Transcription

Need to Know More? - Shaheen Education Family
Developing and
Implementing WindowsBased Applications with
Visual C# .NET and Visual
Studio .NET
Kalani Kirk Hausman
Amit Kalani
Priti Kalani
Developing and Implementing Windows-Based
Applications with Visual C# .NET and
Visual Studio .NET Exam Cram 2 (Exam 70-316)
Publisher
Paul Boger
Copyright  2003 by Que Certification
All rights reserved. No part of this book shall be reproduced, stored in
a retrieval system, or transmitted by any means, electronic, mechanical,
photocopying, recording, or otherwise, *without written permission
from the publisher. No patent liability is assumed with respect to the
use of the information contained herein. Although every precaution
has been taken in the preparation of this book, the publisher and
author assume no responsibility for errors or omissions. Nor is any liability assumed for damages resulting from the use of the information
contained herein.
International Standard Book Number: 0-7897-2902-4
Library of Congress Catalog Card Number: 2003100978
Printed in the United States of America
Executive Editor
Jeff Riley
Development Editor
Ginny Bess Munroe
Managing Editor
Charlotte Clapp
Project Editor
Tricia Liebig
First Printing: May 2003
05
04
03
02
4
3
2
1
Indexer
Mandie Frank
Trademarks
All terms mentioned in this book that are known to be trademarks or
service marks have been appropriately capitalized. Que Certification
cannot attest to the accuracy of this information. Use of a term in this
book should not be regarded as affecting the validity of any trademark
or service mark.
Windows is a registered trademark of Microsoft Corporation.
Visual C# and Visual Studio are registered trademarks of Microsoft
Corporation
Warning and Disclaimer
Every effort has been made to make this book as complete and as accurate as possible, but no warranty or fitness is implied. The information
provided is on an “as is” basis. The authors and the publisher shall have
neither liability nor responsibility to any person or entity with respect
to any loss or damages arising from the information contained in this
book or from the use of the CD or programs accompanying it.
Proofreader
Juli Cook
Team Coordinator
Pamalee Nelson
Technical Editors
Steve Heckler
Greg Guntle
Multimedia Developer
Dan Scherf
Page Layout
Michelle Mitchell
Graphics
Tammy Graham
Que Certification • 201 West 103rd Street • Indianapolis, Indiana 46290
A Note from Series Editor Ed Tittel
You know better than to trust your certification preparation to just
anybody. That’s why you, and more than two million others, have
purchased an Exam Cram book. As Series Editor for the new and
improved Exam Cram 2 series, I have worked with the staff at Que Certification to
ensure you won’t be disappointed. That’s why we’ve taken the world’s best-selling
certification product—a finalist for “Best Study Guide” in a CertCities reader poll
in 2002—and made it even better.
As a “Favorite Study Guide Author” finalist in a 2002 poll of
CertCities readers, I know the value of good books. You’ll be
impressed with Que Certification’s stringent review process,
which ensures the books are high-quality, relevant, and
technically accurate. Rest assured that at least a dozen industry
experts—including the panel of certification experts at
CramSession—have reviewed this material, helping us deliver an
excellent solution to your exam preparation needs.
We’ve also added a preview edition of PrepLogic’s powerful, full-featured test
engine, which is trusted by certification students throughout the world.
As a 20-year-plus veteran of the computing industry and the original creator and
editor of the Exam Cram series, I’ve brought my IT experience to bear on these
books. During my tenure at Novell from 1989 to 1994, I worked with and around
its excellent education and certification department. This experience helped push
my writing and teaching activities heavily in the certification direction. Since then,
I’ve worked on more than 70 certification-related books, and I write about
certification topics for numerous Web sites and for Certification magazine.
In 1996, while studying for various MCP exams, I became frustrated with the
huge, unwieldy study guides that were the only preparation tools available. As an
experienced IT professional and former instructor, I wanted “nothing but the facts”
necessary to prepare for the exams. From this impetus, Exam Cram emerged in
1997. It quickly became the best-selling computer book series since “…For
Dummies,” and the best-selling certification book series ever. By maintaining an
intense focus on subject matter, tracking errata and updates quickly, and following
the certification market closely, Exam Cram was able to establish the dominant
position in cert prep books.
You will not be disappointed in your decision to purchase this book. If you are,
please contact me at etittel@jump.net. All suggestions, ideas, input, or constructive
criticism are welcome!
Need More In-Depth Study?
Get a Training Guide at 40% Savings!!
Developing and Implementing
Windows-based Applications
with Visual C# .NET and Visual
Studio .NET Training Guide
(Exam 70-316)
Amit Kalani
ISBN 0-7897-2823-0
$49.99 US/$77.99 CAN/£36.50 Net UK
Your cost is only $29.99 US!
Free shipping for US orders only.
Have you discovered that you
need more in-depth study before
taking that exam?
Check out the Training Guide series, also from Que Certification.
These comprehensive study guides get you up-to-speed on the
information tested in the exam, as well as provide test-taking tips
and advice for exam day. Inside you’ll find
• Study and Exam Tips section at the start of the book
• Exam objectives highlighted in every chapter
• Step-by-step exercises for hands-on practice
• Final review with Fast Facts and a Practice Exam
• CD of PrepLogic Practice Tests for complete evaluation of
your knowledge
Get 40%
off your next
Training Guide
purchase!
Here’s what to do:
1) Visit www.quepublishing.com
2) Select the Training Guide of your choice
3) Proceed to checkout
4) Enter coupon code TGUIDE321 when prompted
Offer good on purchase of one Training Guide through December 31, 2003.
www.examcram.com
Contents at a Glance
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Introduction
xxiii
Self-Assessment
xxxiii
Chapter 1
Introducing Windows Forms
1
Chapter 2
Controls on Forms
Chapter 3
Handling Exceptions
Chapter 4
Components and .NET Assemblies
Chapter 5
Data Binding
Chapter 6
Consuming and Manipulating Data
Chapter 7
Web Services
Chapter 8
Globalization
Chapter 9
Working with Legacy Code
33
71
93
119
141
173
191
213
Chapter 10
User Assistance and Accessibility
233
Chapter 11
Printing
Chapter 12
Testing and Debugging
Chapter 13
Deploying a Windows Application
Chapter 14
Maintaining and Supporting a Windows
Application 307
Chapter 15
Configuring a Windows Application
Chapter 16
Sample Test #1
Chapter 17
Answer Key for Sample Test #1
251
269
287
347
387
325
Chapter 18
Sample Test #2
401
Chapter 19
Answer Key for Sample Test #2
437
Appendix A:
Microsoft Certification Exams
Appendix B:
What’s on the CD
Appendix C:
Using the PrepLogic Practice Tests, Preview
Edition Software 475
Glossary
Index
483
497
451
471
Table of Contents
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Introduction ...................................................................xxiii
Self-Assessment ............................................................xxxiii
Chapter 1
Introducing Windows Forms ...................................................1
Introduction to the .NET Framework and Visual Studio .NET 2
Objects and Classes 2
Class Inheritance 3
Namespace 4
Using the Windows Forms Designer 5
Creating a Blank Form 6
Modifying a Form’s Properties 6
Displaying a Form 6
Exploring Code View 7
Compiling the Form 8
Using Classes 9
The Application Class 9
The Form Class 10
Custom Properties 11
Visual Inheritance 13
Event Handling 13
Attaching a Delegate 14
Overriding a Protected Method of the Base Class 16
Building Graphical Interface Elements by Using the System.Drawing
Namespace 17
Understanding the Graphics Object 18
The System.Drawing Namespace 18
Drawing Text on a Form 19
Drawing Shapes Using the Draw Method 21
Creating Filled Shapes Using the Fill Method 23
Practice Questions 25
Need to Know More? 31
viii
Contents
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Chapter 2
Controls on Forms .............................................................33
Common Properties of Controls 34
Anchor 35
Dock 35
Enabled 35
Font 36
Location 37
Name 37
Size, Height, and Width 37
TabIndex and TabStop 37
Text 37
Visible 38
Common Windows Forms Controls 38
GroupBox and Panel 38
Label and LinkLabel 40
TextBox and RichTextBox 41
PictureBox 43
Button, RadioButton, and CheckBox 43
ListBox and CheckedListBox 44
ComboBox 46
DomainUpDown and NumericUpDown 47
MonthCalendar and DateTimePicker 49
TreeView and ListView 50
Timer, TrackBar, and ProgressBar 53
HScrollBar and VScrollBar 54
TabControl 55
ToolTip 56
Dialog Boxes 56
Common Dialog Boxes 56
Modal and Modeless Dialog Boxes 57
Menus
57
Creating Menus and Menu Items 57
StatusBar 58
ToolBar 59
Single- and Multiple-Document Interface Applications 60
Adding Controls to Forms 61
Adding Controls with the Windows Forms Designer 61
Adding Controls Programmatically 63
Practice Questions 65
Need to Know More? 70
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Contents
. . . . .
Chapter 3
Handling Exceptions ..........................................................71
Understanding Exceptions 72
Handling Exceptions 73
try Block 73
catch Blocks 74
finally Block 76
The throw Statement 77
Creating Custom Exceptions 78
Managing Unhandled Exceptions 79
Validating User Input 80
Control-Based Validation 80
Control-Access Restriction 81
Keystroke-Level Validation 81
Field-Level Validation 82
Practice Questions 86
Need to Know More? 92
Chapter 4
Components and .NET Assemblies .........................................93
Creating .NET Components 94
Creating Components Derived from the Component
Class 95
Creating Components Derived from the Control Class 98
Components Derived from the UserControl Class 99
Creating .NET Assemblies 105
Single-File and Multifile Assemblies 107
Static and Dynamic Assemblies 107
Private and Shared Assemblies 107
Satellite and Resource-Only Assemblies 109
Practice Questions 111
Need to Know More? 117
Chapter 5
Data Binding ..................................................................119
Binding Data to the User Interface 120
Simple Data Binding 120
Complex Data Binding 124
One-Way and Two-Way Data Binding
The Data Form Wizard 129
129
ix
x
Contents
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Transforming and Filtering Data 129
The Server Explorer 130
Filtering and Transforming Data 131
Practice Questions 133
Need to Know More? 139
Chapter 6
Consuming and Manipulating Data .......................................141
Transact-SQL 142
The SELECT Statement 142
The INSERT Statement 145
The UPDATE Statement 145
The DELETE Statement 146
Querying SQL Server 146
Ad-Hoc Queries 146
Stored Procedures 148
Data Access 150
Disk Files 150
The ADO.NET Object Model 153
XML Data 162
Handling Database Errors 165
Practice Questions 167
Need to Know More? 172
Chapter 7
Web Services .................................................................173
Understanding Web Services 174
Simple Object Access Protocol (SOAP) 174
Disco and Universal Description, Discovery, and Integration
(UDDI) 175
Web Services Description Language (WSDL) 175
Using Web Services 176
Adding a Web Reference 176
The Web Services Discovery Tool (disco.exe) 178
The Web Services Description Language Tool (wsdl.exe) 178
Creating Web Services 180
Testing the New Web Service 181
Practice Questions 183
Need to Know More? 189
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Contents
. . . . .
Chapter 8
Globalization ..................................................................191
Introduction to Localization 192
The Localization Process 192
Localization Considerations 193
User Interface Localization 193
Cultures 194
Resource Files 198
Character Encodings 201
Unicode 201
Converting Encodings 201
User Interface Mirroring 202
Mirroring in .NET 203
Managing User Input 203
String Indexing 203
Comparing and Sorting Data 205
Practice Questions 206
Need to Know More? 212
Chapter 9
Working with Legacy Code ................................................213
Using ActiveX Controls 214
The Windows Forms ActiveX Control Importer
(aximp.exe) 215
Importing Controls Using the Visual Studio .NET
Toolbox 217
Using ActiveX Controls 219
Using COM Components 219
Runtime Callable Wrappers 219
The Type Library Importer Tool (tlbimp.exe) 220
Using COM Components Directly 222
Using COM+ Components 222
Using Platform Invoke 223
Practice Questions 225
Need to Know More? 231
Chapter 10
User Assistance and Accessibility ........................................233
HTML Help 234
Inside HTML Help 1.3 235
Creating a Help Project 236
Creating Topic Files 236
xi
xii
Contents
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Linking Topic Files 237
Creating a Table of Contents 237
Creating an Index 238
Compiling and Testing an HTML Help File
Implementing User Assistance 239
The Help Class 240
The HelpProvider Component 240
Pop-Up Help 241
The ToopTip Component 241
Accessibility 242
Control Properties for Accessibility 243
Supporting High Contrast Mode 244
Practice Questions 245
Need to Know More? 250
239
Chapter 11
Printing ........................................................................251
The PrintDocument Component 252
Printing Text 253
The PrintPageEventArgs Class 255
Printing Graphics 256
Using the Printing Controls 257
The PageSetupDialog Component 258
The PrintPreviewDialog Component 259
The PrintPreviewControl Control 260
The PrintDialog Component 261
Practice Questions 263
Need to Know More? 268
Chapter 12
Testing and Debugging ......................................................269
Application Testing 270
Unit Testing 271
Integration Testing 271
Regression Testing 272
Tracing 272
Trace Listeners 273
Trace Switches 274
Conditional Compilation 275
Debugging 276
Stepping Through Code During Execution
Using Breakpoints 277
Debugging When an Exception Is Thrown
276
278
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Contents
. . . . .
Debugging a Running Process 278
Analyzing Program State 279
Practice Questions 281
Need to Know More? 286
Chapter 13
Deploying a Windows Application ........................................287
Deployment Tools 288
Deploying Your Application 288
Setup Projects 289
Customizing Setup Projects 292
Shared Assemblies 293
Signing the Assembly 294
Adding an Assembly to the GAC 295
Creating and Deploying the Installation Components
URL Remoting 297
Deployment Considerations 298
Windows Logo Program Requirements 299
Practice Questions 300
Need to Know More? 305
296
Chapter 14
Maintaining and Supporting a Windows Application ...................307
Introduction 308
The Process Class 308
Starting and Stopping Processes 308
Getting Process Information 312
Windows Event Logs 313
Accessing Event Logs 314
Monitoring Performance 315
Reading Performance Data 315
Publishing Performance Data 316
Practice Questions 318
Need to Know More? 324
Chapter 15
Configuring a Windows Application .......................................325
Dynamic Application Configuration 326
Using Dynamic Properties 326
Using the .NET Framework Configuration Tool
Configuring Security 329
Permissions 330
Requesting Minimum Permissions 332
328
xiii
xiv
Contents
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Code Groups 333
Permission Sets 334
Granting Permissions 334
Computing Final Permissions 336
Configuring Authorization 337
Identity and Principal Objects 337
The PrincipalPermission Class 339
Practice Questions 340
Need to Know More? 345
Chapter 16
Sample Test #1 ...............................................................347
How to Take the Sample Exams
Exam-Taking Tips 348
Sample Exam 1 350
348
Chapter 17
Answer Key for Sample Test #1 ............................................387
Answer Key 388
Detailed Answers 388
Chapter 18
Sample Test #2 ...............................................................401
Practice Test
402
Chapter 19
Answer Key for Sample Test #2 ............................................437
Answer Key 438
Detailed Answers 438
Appendix A
Microsoft Certification Exams ..............................................451
Assessing Exam-Readiness 451
What to Expect at the Testing Center 452
Exam Layout and Design: New Case Study Format 453
Multiple-Choice Question Format 454
Build-List-and-Reorder Question Format 455
Create-a-Tree Question Format 457
Drag-and-Connect Question Format 458
Select-and-Place Question Format 460
Microsoft’s Testing Formats 461
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Contents
. . . . .
Strategies for Different Testing Formats 463
Case Study Exam Strategy 463
Fixed-Length and Short-Form Exam Strategy
Adaptive Exam Strategy 465
Question-Handling Strategies 466
Mastering the Inner Game 467
464
Appendix B
What’s on the CD-ROM ......................................................471
PrepLogic Practice Tests, Preview Edition 472
Exclusive Electronic Version of Text 472
Easy Access to Online Pointers and References
473
Appendix C
Using the PrepLogic Practice Tests,
Preview Edition Software ...................................................475
Exam Simulation 476
Question Quality 476
Interface Design 476
Effective Learning Environment 476
Software Requirements 477
Installing PrepLogic Practice Tests, Preview Edition 477
Removing PrepLogic Practice Tests, Preview Edition from Your
Computer 477
Using PrepLogic Practice Tests, Preview Edition 478
Starting a Practice Test Mode Session 478
Starting a Flash Review Mode Session 479
Standard PrepLogic Practice Tests, Preview Edition Options 479
Time Remaining 480
Your Examination Score Report 480
Review Your Exam 481
Get More Exams 481
Contacting PrepLogic 481
Customer Service 481
Product Suggestions and Comments 481
License Agreement 482
Glossary .......................................................................483
Index ............................................................................497
xv
About the Authors
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Kalani Kirk Hausman (MCSE+I, MCSD, MCDBA, MCSA, MCT,
CCNA, CIW-A, Security+, A+, Network+, I-Net+) has been an IT professional for more than 25 years in the roles of director, consultant, trainer,
programmer, security administrator, database administrator, manager, and
network administrator. He is currently working as a Lead Security Analyst
and Computer Systems Manager for Texas A&M University. Mr. Hausman’s
studies include security, computer science, electronics technology, electrical
engineering, mechanical engineering, and philosophy. His hobbies include
designs in high-speed transportation, submersible propulsion, cosmology,
interactive telepresence, technology in education, and virtual reality for use
by those with disabling conditions.
His current independent projects include development of a shared interactive telepresence system designed to allow remote experience of widely varying environments by students regardless of geographic location or disabling
condition. He is also working on implementing a zoological wireless telepresence system that is capable of allowing remote observation of animals in
both natural and human-created environments and is involved with grants
relating to the leveraging of emerging technologies towards the development
of improved bilingual distance education programs, along with many other
ongoing projects. Kirk can be reached by email at khausman@hotmail.com.
Amit Kalani is a Microsoft Certified Application Developer (MCAD) and
Microsoft Certified Solution Developer (MCSD) for the Microsoft .NET
platform. He is the author of MCAD/MCSD Training Guide: Developing and
Implementing Web Applications with Visual C# .NET and Visual Studio .NET
(Exam 70-315), MCAD/MCSD Training Guide: Developing and Implementing
Windows-based Applications with Visual C# .NET and Visual Studio .NET (Exam
70-316), and MCAD/MCSD Training Guide: Developing XML Web Services
and Server Components with Microsoft Visual C# .NET and Microsoft .NET
Framework (Exam 70-320).
Amit has been long associated with Microsoft certifications exams. In an earlier job, he also managed a Microsoft Certified Technical Education Center
(CTEC), where he closely worked with students to understand their requirements, and he guided them towards passing the certification exams. You can
reach Amit at amit@techcontent.com.
Priti Kalani is a Microsoft Certified Application Developer (MCAD) and
Microsoft Certified Solution Developer (MCSD) for Microsoft .NET. Priti
has been programming with Visual Studio .NET and the .NET Framework
since their early beta versions. She is a co-author of the MCAD/MCSD
Training Guide (Exam 70-320): Developing XML Web Services and Server
Components with Microsoft Visual C# .NET and Microsoft .NET
Framework. She has also been a technical reviewer for several popular books
about the .NET Framework and related technologies. Priti welcomes your
comments about the book at her email address, priti@techcontent.com.
About the Technical Editors
Steve Heckler is president of Accelebrate, an IT training and programming
firm based in Atlanta. An avid ASP.NET, Java, and ColdFusion developer
and trainer, Steve served more than six years as a senior manager and instructor at a leading East Coast IT training firm prior to founding Accelebrate.
He holds Bachelors and Masters degrees from Stanford University.
Greg Guntle is a twenty-one year veteran of developing PC applications
using languages, including C, C++, VB, VB .NET, and C# .NET. He has
been technical editing computer programming books for the past 18 years.
He has also co-authored several books, including Teach Yourself Advanced C
and Borland C++ Builder.
Dedication
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
To our parents. Amit and Priti
Acknowledgements
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
We would like to acknowledge following people, who in diverse ways helped
to create this book: Ginny Bess, Tricia Liebig, Krista Hansing, Steve
Heckler, Greg Guntle, Ken Cox, and the design and production team. A special thanks to Jeff Riley for giving us the opportunity to work on this project.
Thanks also to Kalani Kirk Hausman and Mike Gunderloy for their allaround contributions towards this book.
—Amit Kalani
—Priti Kalani
We Want to Hear from
You!
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
As the reader of this book, you are our most important critic and commentator. We value your opinion and want to know what we’re doing right, what
we could do better, what areas you’d like to see us publish in, and any other
words of wisdom you’re willing to pass our way.
As an executive editor for Que Certification, I welcome your comments. You
can email or write me directly to let me know what you did or didn’t like
about this book—as well as what we can do to make our books better.
Please note that I cannot help you with technical problems related to the topic
of this book. We do have a User Services group, however, where I will forward specific technical questions related to the book.
When you write, please be sure to include this book’s title and author as well
as your name, email address, and phone number. I will carefully review your
comments and share them with the author and editors who worked on the
book.
Email:
feedback@quepublishing.com
Mail:
Jeff Riley
Executive Editor
Que Certification
201 West 103rd Street
Indianapolis, IN 46290 USA
For more information about this book or another Que title, visit our Web
site at www.quepublishing.com. Type the ISBN (excluding hyphens) or the title
of a book in the Search field to find the page you’re looking for. For information about the Exam Cram 2 Series, visit www.examcram2.com.
Introduction
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Welcome to Microsoft’s 70-316 Exam Cram 2! Whether this is your first or
your fifteenth Exam Cram series book, you’ll find information here that will
help ensure your success as you pursue knowledge, experience, and certification. This introduction explains Microsoft’s certification programs in general and talks about how the Exam Cram 2 series can help you prepare for
Microsoft’s developer certification exams for Microsoft .NET. Chapters 1
through 15 are designed to remind you of everything you’ll need to know in
order to take—and pass—the 70-316 Microsoft certification exam. Two sample tests at the end of the book should give you a reasonably accurate assessment of your knowledge, and yes, we’ve provided the answers and their
explanations to the tests. Read the book, and you’ll stand a very good chance
of passing the test. The appendix includes a description of the testing environment, and a discussion of test-taking strategies.
Exam Cram 2 books help you understand and appreciate the subjects and
materials you need to pass Microsoft certification exams. Exam Cram 2 books
are aimed strictly at test preparation and review. They do not teach you
everything you need to know about a topic. Instead, we present and dissect
the questions and problems you’re likely to encounter on a test. We’ve
worked to bring together as much information as possible about Microsoft
certification exams.
Nevertheless, to completely prepare yourself for any Microsoft test, we recommend that you begin by taking the Self-Assessment that is included in this
book, immediately following this introduction. The Self-Assessment tool
will help you evaluate your knowledge base against the requirements for a
Microsoft Certified Application Developer (MCAD) or Microsoft Certified
Solution Developer (MCSD) for Microsoft .NET.
Based on what you learn from the Self-Assessment, you might decide to
begin your studies with some classroom training or some background reading. On the other hand, you might decide to pick up and read one of the
many study guides such as the award-winning MCAD/MCSD Training Guide
series from Que Publishing. We also recommend that you supplement your
study program with visits to www.examcram2.com to receive additional practice
xxii Introduction
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
questions, get advice, and track the MCAD and MCSD for Microsoft .NET
program.
We also strongly recommend that you install, configure, and play around
with the software that you’ll be tested on because nothing beats hands-on
experience and familiarity when it comes to understanding the questions
you’re likely to encounter on a certification test. Book learning is essential,
but without a doubt, hands-on experience is the best teacher of all!
Taking a Certification Exam
After you’ve prepared for your exam, you need to register with a testing center. In the United States and Canada, tests are administered by Prometric
and VUE. Here’s how you can contact them:
➤ Prometric—You can sign up for a test through the company’s Web site,
at www.prometric.com. Within the United States and Canada, you can register by phone at 1-800-755-3926. If you live outside this region, you
should check the Prometric Web site for the appropriate phone number.
➤ VUE—You can sign up for a test or get the phone numbers for local test-
ing centers through the Web at www.vue.com/ms.
To sign up for a test, you must possess a valid credit card or contact either
Prometric or VUE for mailing instructions to send a check (in the United
States). Only when payment is verified or a check has cleared can you actually register for a test.
To schedule an exam, you need to call the number or visit either of the Web
pages at least one day in advance. To cancel or reschedule an exam, you must
call before 7 p.m. Pacific Standard Time the day before the scheduled test
time (or you might be charged, even if you don’t show up to take the test).
When you want to schedule a test, you should have the following information ready:
➤ Your name, organization, and mailing address.
➤ Your testing ID. (If you are sitting for an Microsoft exam for the first time,
you will be assigned a testing ID when you register for the exam.)
➤ The name and number of the exam you want to take.
➤ A method of payment. (As mentioned previously, a credit card is the most
convenient method, but alternate means can be arranged in advance, if
necessary.)
xxiii
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introduction
. . . . . . .
After you sign up for a test, you are told when and where the test is scheduled. You should try to arrive at least 15 minutes early. You must supply two
forms of identification—one of which must be a photo ID—to be admitted
into the testing room.
All exams are completely closed book. In fact, you are not permitted to take
anything with you into the testing area, but you are given a few blank sheets
of paper and a pen or, in some cases, an erasable plastic sheet and a marker.
We suggest that you immediately write down on that sheet of paper all the
information you’ve memorized for the test. In Exam Cram 2 books, this
information appears on a tear-out sheet inside the front cover of each book.
You are given some time to compose yourself, record this information, and
take a sample orientation exam before you begin the real thing. We suggest
that you take the orientation test before taking your first exam, but because
all the certification exams are more or less identical in layout, behavior, and
controls, you probably don’t need to do this more than once.
When you complete a Microsoft certification exam, the software tells you
whether you’ve passed or failed. If you need to retake an exam, you have to
schedule a new test with Prometric or VUE.
The first time you fail a test, you can retake the test the next day. However, if you fail
a second time, you must wait 14 days before retaking that test. The 14-day waiting
period remains in effect for all retakes after the second failure.
Tracking MCP Status
As soon as you pass any Microsoft exam, you attain MCP status. Microsoft
generates transcripts that indicate which exams you have passed. You can
view a copy of your transcript at any time by going to the MCP secured site
(www.microsoft.com/traincert/mcp/mcpsecure.asp) and selecting Transcript
Tool. This tool enables you to print a copy of your current transcript and
confirm your certification status.
After you pass the necessary set of exams, you are certified. Microsoft sends
you a Welcome Kit in about six to eight weeks. The kit contains a certificate
that is suitable for framing, along with a wallet card and a lapel pin. In addition you get a number of other benefits such as these:
➤ A license to use the MCP/MCAD/MCSD logo, which means that you can
use the logo on your letterhead and business cards. (Refer to the
Microsoft Web site for the logo usage guidelines and terms and conditions.)
xxiv Introduction
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ Access to the MCP Secure Web site, for the latest technical and product
information, and exclusive discount offers on products and services from
select companies.
➤ Invitations to Microsoft conferences, technical training sessions, and spe-
cial events.
➤ A free subscription to Microsoft Certified Professional Magazine Online,
which provides ongoing data about testing and certification activities,
requirements, and changes to the program.
Many people believe that the industry recognition of the
MCP/MCAD/MCSD credentials go well beyond the perks that Microsoft
provides to newly anointed members of this elite group. We’re starting to see
more job listings that request or require applicants to have MCP, MCAD,
MCSD, and other certifications, and many individuals who complete
Microsoft certification programs can qualify for increases in pay or responsibility. As an official recognition of hard work and broad knowledge, one of
the MCP credentials is a badge of honor in many IT organizations.
How to Prepare for an Exam
Preparing for Exam 70-316 requires that you obtain and study materials
designed to provide comprehensive information about the .NET Framework
and Visual Studio .NET, and their capabilities for Windows-based application development. The following list of materials can help you study and
prepare:
➤ The Visual Studio .NET product CD—Although you can develop
Windows-based applications using the freely available .NET Framework
SDK (www.microsoft.com/net/), I also recommend that you use Microsoft
Visual Studio .NET. Several questions on the exam will test your skills on
Visual Studio .NET. If do not have access to Visual Studio .NET, consider getting a trial version from Microsoft.
➤ MSDN (Microsoft Developer Network) online (msdn.microsoft.com)—
This Web site provides access to the most up-to-date product documentation, articles, product support knowledge base, and seminars.
➤ The .NET Framework community sites—Sites such as
www.
and www.windowsforms.net provide the latest news and
announcements related to the Windows-based application development
using the .NET Framework. In addition to accessing this information,
you can discuss your topics of interests with other developers.
gotdotnet.com
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introduction
. . . . . . .
➤ The Exam Cram 2 Web site—The official Exam Cram 2 Web site
(www.examcram2.com) provides various exam-preparation tools, including
advice, practice tests, questions of the day, and discussion groups.
➤ Search engines—Search engines such as
www.google.com make it easy for
you to find the information that you are looking for. You can search for
Microsoft-specific information using Google’s Microsoft search Web site,
www.google.com/microsoft.
The Google Groups Web site (groups.google.com) requires special mention
because it not only allows you to post questions in the subject-related
newsgroups such as microsoft.public.cert.exam.mcad and microsoft.
public.cert.exam.mcsd, but it also allows you to search the Usenet archive.
You can use the Usenet archive to see whether other developers have
already posted solutions for the problems that you are facing.
In addition, you might find any or all of the following materials useful in
your exam preparations:
➤ Self-study MCAD/MCSD training guides—Que Certification offers a
comprehensive self-study training guide for the MCAD and the MCSD
for Microsoft .NET exams. The training guides cover the subject in much
greater level of detail than the Exam Cram2 books, and are designed to
teach you everything you need to know about the subject covered by the
exam. For the 70-316 exam, refer to the MCAD/MCSD Training Guide:
Developing and Implementing Windows-Based Applications with Visual C#
.NET and Visual Studio .NET (Exam 70-316), by Amit Kalani.
➤ Classroom training—Although classroom training is an expensive solu-
tion, many novice developers find it useful. Many companies, including
the Microsoft Certified Technical Education Centers (CTECs), and
third-party training companies (such as Wintellect and DevelopMentor)
offer classroom training on subjects related to the 70-316 exams.
➤ Other publications—There’s no shortage of materials available about
the .NET Framework and Visual Studio .NET. You can select the topics
in which you are having difficulty and then find a book related to that
topic for an in-depth study. You can find several books and sample chapters online at the InformIT Web site (www.informit.com).
What This Book Will Not Do
This book will not teach you everything you need to know about the .NET
Framework, or even about a given topic. Nor is this book an introduction to
xxv
xxvi
Introduction
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
computer programming. If you’re new to applications development and are
looking for an initial preparation guide, check out www.quepublishing.com,
where you will find whole sections dedicated to the books about the
MCSD/MCAD certifications and computer programming. This book
reviews what you need to know before you take the test, with the fundamental purpose dedicated to reviewing the information needed on the Microsoft
70-316 certification exam.
This book uses a variety of teaching and memorization techniques to analyze
the exam-related topics and to provide you with ways to input, index, and
retrieve everything you’ll need to know to pass the test. Once again, it is not
an introduction to application development.
What This Book Is Designed to Do
This book is designed to be read as a pointer to the areas of knowledge you
will be tested on. In other words, you might want to read the book one time,
to get an insight into how comprehensive your knowledge of computers is.
The book is also designed to be read shortly before you go for the actual test
and to give you a distillation of the entire field of Windows-based application development using the Microsoft .NET Framework in as few pages as
possible. We think you can use this book to get a sense of the underlying
context of any topic in the chapters, or to skim-read for Study Alerts, bullet
points, summaries, and topic headings.
We’ve drawn on material from Microsoft’s own listing of knowledge requirements, from other preparation guides, and from the exams themselves.
We’ve also drawn from a battery of third-party test-preparation tools, technical Web sites, and from our own experience with application development.
Our aim is to walk you through your knowledge you will need, looking over
your shoulder, so to speak, and pointing out those things that are important
for the exam (study alerts, practice questions, and so on).
The 70-316 exam makes a basic assumption that you already have a strong
background of experience with the Windows development platform and its
terminology. On the other hand, because the .NET development environment is so new, no one can be a complete expert. We’ve tried to demystify
the jargon, acronyms, terms, and concepts, and wherever we think you’re
likely to blur past an important concept, we’ve defined the assumptions and
premises behind that concept.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introduction
. . . . . . .
About This Book
If you’re preparing for the 70-316 certification exam for the first time, we’ve
structured the topics in this book to build upon one another. Therefore, the
topics covered in later chapters often refer to previous discussions in earlier
chapters. In our opinion, many computer manuals and reference books are
essentially a list of facts. Rather than simply listing raw facts about each topic
on the exam, we’ve tried to paint an integrated landscape, where each exam
fact becomes an obvious conclusion to the problems evolving out of earlier
technology.
We suggest you read this book from front to back. You won’t be wasting your
time: Nothing we’ve written is a guess about an unknown exam. What might
appear to be a detour into rambling discussions is based upon our many years
of working with less experienced computer users. We’ve had to explain certain underlying information on such a regular basis that we’ve included those
explanations here. Time and again, we’ve found that by understanding the
conceptual underpinnings of a topic, our audience members were much better able to recall the resulting details.
After you’ve read the book, you can brush up on a topic by using the index
or the table of contents to go straight to the topics and questions you want
to re-examine. We’ve tried to use the headings and subheadings to provide
outline information about each given topic. After you’ve been certified, we
think you’ll find this book useful as a tightly focused reference and an essential foundation of Windows application development.
Chapter Formats
Each Exam Cram 2 chapter follows a regular structure, along with graphical
cues about especially important or useful material. The structure of a typical
chapter includes:
➤ Opening hotlists—Each chapter begins with lists of the terms you’ll
need to understand and the concepts you’ll need to master before you can
be fully conversant with the chapter’s subject matter. We follow the
hotlists with a few introductory paragraphs, setting the stage for the rest
of the chapter.
➤ Topical coverage—After the opening hotlists, each chapter covers at
least three topics related to the chapter’s subject.
➤ Exam Alerts—Throughout the topical coverage section, we highlight
material most likely to appear on the exam by using a special Exam Alert
layout that looks like this:
Introduction
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
This is what an Alert looks like. An Alert stresses concepts, terms, software, or activities that will most likely appear in one or more certification exam questions. For that
reason, we think any information found offset in Alert format is worthy of unusual
attentiveness on your part.
Even if material isn’t flagged as an Alert, all the content in this book is
associated in some way with test-related material. What appears in the
chapter content is critical knowledge.
➤ Notes—This book is an overall examination of computers. As such, we
dip into nearly every aspect of Windows application development. Where
a body of knowledge is deeper than the scope of the book, we use Notes
to indicate areas of concern or specialty training.
Cramming for an exam will get you through a test, but it won’t make you a competent
IT professional. While you can memorize just the facts you need, to become certified,
your daily work in the field will rapidly put you in water over your head if you don’t
know the underlying principles of application development.
➤ Tips—We provide tips that will help you to build a better foundation of
knowledge or to focus your attention on an important concept that will
reappear later in the book. Tips are a helpful way to remind you of the
context surrounding a particular area of a topic under discussion.
You should also read Appendix A, “Microsoft Certification Exams,” for helpful
strategies used in taking a test. The introduction to the sample tests at the end of
the book contains additional tips on how to figure out the correct response to a
question, or what to do if you draw a complete blank.
➤ Practice questions—This section presents a short list of test questions
related to the specific chapter topic. Each question has a following explanation of both correct and incorrect answers. The practice questions
highlight the areas we found to be most important on the exam.
➤ Need to know more?—Every chapter ends with a section entitled “Need
to Know More?” This section provides pointers to resources that we
found to be helpful in offering further details on the chapter’s subject matter. If you find a resource you like in this collection, use it, but don’t feel
compelled to use all these resources. We use this section to recommend
resources that we have used on a regular basis, so none of the recommendations will be a waste of your time or money. These resources might go
out of print or be taken down (in the case of Web sites), so we’ve tried to
reference widely accepted resources.
xxix
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introduction
. . . . . . .
The bulk of the book follows this chapter structure, but we would like to
point out a few other elements:
➤ Sample tests—The sample tests, which appear in Chapters 16 and 18 are
very close approximations of the types of questions you are likely to see on
the current 70-316 exam.
➤ Answer keys—Here you’ll find the answers to the sample tests, with a
following explanation of both the correct response and the incorrect
responses.
➤ Glossary—This is an extensive glossary of important terms used in this
book.
➤ The Cram Sheet—This appears as a tear-away sheet inside the front
cover of this Exam Cram 2 book. It is a valuable tool that represents a collection of the most difficult-to-remember facts and numbers we think you
should memorize before taking the test. Remember, you can dump this
information out of your head onto a piece of paper as soon as you enter
the testing room. These are usually facts that we’ve found require bruteforce memorization. You need to remember this information only long
enough to write it down when you walk into the test room. Be advised that
you will be asked to surrender all personal belongings before you enter
the exam room itself.
You might want to look at the Cram Sheet in the parking lot or in the
lobby of the testing center just before you walk into the testing center.
The Cram Sheet is separated into headings, so you can review the appropriate parts just before each test.
➤ CD-ROM—The CD-ROM that comes with this book contains the com-
plete code listing from the Que Certification’s MCAD/MCSD Training
Guide: Developing and Implementing Windows-Based Application With Visual
C# .NET and Visual Studio .NET (Exam 70-316). This code listing provides you an opportunity to read, understand, and extend a lot of additional code that demonstrates various concepts related to the 70-316 exam
objectives. The CD also contains the PrepLogic Practice Tests, Preview
Edition exam simulation software. The preview edition exhibits most of
the full functionality of the premium edition but offers only questions sufficient for one practice exam. To get the complete set of practice questions
and exam functionality, visit www.preplogic.com.
Code Lines
Limitations of printed pages many times will introduce false line breaks in
programming code, character strings, pathnames, and other related text. We
make every effort to ensure that a line break or line wrap generated by the
page margins does not change the meaning of the information.
Contacting the Authors
We’ve tried to create a real-world tool that you can use to prepare for and
pass the 70-316 MCAD/MCSD certification exam. We are interested in any
feedback you care to share about the book, especially if you have ideas about
how we can improve it for future test-takers. We will consider everything you
say carefully and will respond to all reasonable suggestions and comments.
You can reach us via email at feedback@quepublishing.com.
Let us know if you found this book to be helpful in your preparation efforts.
We’d also like to know how you felt about your chances of passing the exam
before you read the book and then after you read the book. Of course, we’d
love to hear that you passed the exam, and even if you just want to share your
triumph, we’d be happy to hear from you.
Thanks for choosing us as your personal trainers, and enjoy the book. We
would wish you luck on the exam, but we know that if you read through all
the chapters, you won’t need luck—you’ll pass the test on the strength of real
knowledge!
Self-Assessment
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
This self-assessment helps you evaluate your readiness to tackle Microsoft
certifications. It should also help you understand what you need to know to
master the topic of this book—namely, Exam 70-316, “Developing and
Implementing Windows-Based Applications with Microsoft Visual C#
.NET and Microsoft Visual Studio .NET.” But before you tackle this selfassessment, let’s talk about the developer certifications offered by Microsoft
for Microsoft .NET.
Microsoft Developer Certifications
for Microsoft .NET
Microsoft currently offers two levels of developer certification for Microsoft
.NET—MCAD and MCSD for Microsoft .NET. In fact, the MCAD certification is a subset of the MCSD certification. In this section, you will learn
how the two certifications are structured and what you can expect from an
ideal MCAD or MCSD candidate.
The MCAD Certification
The MCAD is a certification for the developers who develop, deploy, and
maintain applications and components using the Microsoft .NET
Framework and Microsoft Visual Studio .NET. To obtain the MCAD certificate, you are required to pass three exams that include two core exams and
one elective exam, as listed in the following sections.
MCAD Core Exams
You must pass two of the following core exams to earn credit toward the
MCAD certification:
➤ 70-305, “Developing and Implementing Web Applications with Microsoft
Visual Basic .NET and Microsoft Visual Studio .NET”
or
xxxii
Self-Assessment
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ 70-306, “Developing and Implementing Windows-Based Applications
with Microsoft Visual Basic .NET and Microsoft Visual Studio .NET”
or
70-315, “Developing and Implementing Web Applications with Microsoft
Visual C# .NET and Microsoft Visual Studio .NET”
or
70-316, “Developing and Implementing Windows-Based Applications
with Microsoft Visual C# .NET and Microsoft Visual Studio .NET”
➤ 70-310, “Designing XML Web Services and Server Components with
Microsoft Visual Basic .NET and the Microsoft .NET Framework”
or
70-320, “Designing XML Web Services and Server Components with
Microsoft Visual C# .NET and the Microsoft .NET Framework”
MCAD Elective Exams
You must pass one of the following elective exams to earn credit toward the
MCAD certification:
➤ 70-229, “Designing and Implementing Databases with Microsoft SQL
Server 2000 Enterprise Edition”
➤ 70-230, “Designing and Implementing Solutions with Microsoft BizTalk
Server 2000 Enterprise Edition”
➤ 70-234, “Designing and Implementing Solutions with Microsoft
Commerce Server 2000”
You also can count as an elective one of the four core exams 70-305, 70-306,
70-315, and 70-316. The one that you can count as an elective is the exam
from the opposite technology from the exam that you count as a core exam.
For example, if you take the exam “Developing and Implementing
Windows-Based Applications with Microsoft Visual C# .NET and Microsoft
Visual Studio .NET (70-316)” as a core exam, you can take either exam 70315 or exam 70-305 as an elective, but you cannot take exam 70-306 as an
elective.
An Ideal MCAD Candidate
An ideal MCAD candidate is someone who has one to two years of experience in developing and maintaining department-level applications, Web or
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Self-Assessment
. . . . . . . . .
desktop clients, XML Web services, and back-end data services using the
Microsoft .NET Framework and Microsoft Visual Studio .NET. The ideal
MCAD candidate also might be someone who works in teams that use
Microsoft .NET Framework and other Microsoft technologies to develop
enterprise-level applications. Typical job titles for an ideal MCAD candidate
include programmer, programmer/analyst, and software developer.
The MCSD for Microsoft .NET Certification
The MCSD for Microsoft .NET certification is for those developers who
design and develop enterprise-level solutions using the Microsoft .NET
Framework and other Microsoft development tools and technologies. For
the MCSD for Microsoft .NET certification, you must pass four core exams
and one elective exam, as listed in the following sections.
MCSD for Microsoft .NET Track Core Exams
You must pass four of the following core exams to earn credit toward the
MCSD for Microsoft .NET certification:
➤ 70-305, “Developing and Implementing Web Applications with Microsoft
Visual Basic .NET and Microsoft Visual Studio .NET”
or
70-315, “Developing and Implementing Web Applications with Microsoft
Visual C# .NET and Microsoft Visual Studio .NET”
➤ 70-306, “Developing and Implementing Windows-Based Applications
with Microsoft Visual Basic .NET and Microsoft Visual Studio .NET”
or
70-316, “Developing and Implementing Windows-Based Applications
with Microsoft Visual C# .NET and Microsoft Visual Studio .NET”
➤ 70-310, “Designing XML Web Services and Server Components with
Microsoft Visual Basic .NET and the Microsoft .NET Framework”
or
70-320, “Designing XML Web Services and Server Components with
Microsoft Visual C# .NET and the Microsoft .NET Framework”
➤ 70-300, “Analyzing Requirements and Defining .NET Solution
Architectures”
xxxiv Self-Assessment
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MCSD for Microsoft .NET Track Elective Exams
You must pass one of the following elective exams to earn credit toward the
MCSD for Microsoft .NET certification:
➤ 70-229, “Designing and Implementing Databases with Microsoft SQL
Server 2000 Enterprise Edition”
➤ 70-230, “Designing and Implementing Solutions with Microsoft BizTalk
Server 2000 Enterprise Edition”
➤ 70-234, “Designing and Implementing Solutions with Microsoft
Commerce Server 2000”
Exam 70-316 also qualifies as an elective toward a different certification, the
Microsoft Certified Database Administrator (MCDBA) on Microsoft SQL Server
2000 certification.
An Ideal MCSD for Microsoft .NET Candidate
An ideal MCSD for Microsoft .NET candidate is someone who has at least
two years of experience in designing and developing enterprise-level solutions with the Microsoft .NET Framework and other Microsoft technologies. An ideal MCSD for Microsoft .NET candidate should be able to work
as a lead developer, performing tasks such as analyzing business and technical requirements and defining solution architecture. In addition, an MCSD
for Microsoft .NET candidate should be able to perform tasks typical to the
MCAD certification, such as building, deploying, and maintaining the applications. Typical job titles for an ideal MCSD for Microsoft .NET candidate
include software engineer, application analyst, application developer, and
technical consultant.
Put Yourself to the Test
The following series of questions and observations is designed to help you
figure out how much work you must do to pursue Microsoft certification and
what kinds of resources you might consult on your quest.
Two things should be clear from the outset, however:
➤ Even a modest background in computer science and programming will be
helpful.
➤ Hands-on experience with Microsoft products and technologies is an
essential ingredient to certification success.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Self-Assessment
. . . . . . . . .
1. Do you have experience with computer programming or with the C#
programming language?
Experience with a programming language, even if with a different language, will really help in passing Exam 70-316. However, If you do not
have much experience with programming—or, in particular, with the C#
programming language—we recommend that you read the following
book:
C# How to Program, by Harvey M. Deitel et al. Prentice Hall, 2001.
2. Do you have a general understanding of what the .NET Framework is
and what it has to offer to you as a developer?
The .NET Framework has a lot to offer. Even if you have been developing applications in the .NET Framework for the past few months, you
might not have had the opportunity to experiment with all the features
of the .NET Framework. In that case, I recommend that you read the
following book:
Understanding .NET: A Tutorial and Analysis, by David Chappell. Addison
Wesley Professional, 2002.
This book gives you a bird’s-eye view of Microsoft .NET and how it
affects you as a developer. Many questions in the 70-316 exam require
you to have a high-level view of the .NET Framework and related technologies.
3. Have you installed, configured, or used Visual Studio .NET and the
.NET Framework Software Development Kit (SDK)?
Experience is necessary for passing Exam 70-316. If you haven’t worked
much with the .NET Framework SDK and with Visual Studio .NET,
now is the time to do so. Before you sit for the exam, make sure you
spend enough time in programming using both the Microsoft .NET
Framework SDK and Visual Studio .NET.
The Microsoft .NET Framework is available as a free download from
http://msdn.microsoft.com/netframework/downloads/howtoget.asp. Unlike
the .NET Framework, you’ll have to buy a license for using Visual
Studio .NET; if you do not plan to do so, you should at least consider
ordering a trial version of Visual Studio .NET, at
http://msdn.microsoft.com/vstudio/productinfo/trial.
4. Have you reviewed the exam objectives?
If you have not reviewed the exam objectives lately, look at them now
when you are assessing your exam readiness. The up-to-date exam
xxxv
xxxvi
Self-Assessment
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
objectives for the 70-316 exam are available at www.microsoft.com/
traincert/exams/70-316.asp. You should review each objective and then
ask yourself if you have used Visual C# .NET and Visual Studio .NET
enough to answer questions related to that particular exam objective. If
you are not confident, consider looking at the related topics in the following resources:
➤
http://msdn.microsoft.com
➤
http://support.microsoft.com
➤ MCAD/MCSD
Training Guide (70-316): Developing and
Implementing Windows-Based Applications with Visual C# and Visual
Studio.NET, by Amit Kalani. Que Certifications, 2002.
5. Have you taken a few practice exams for Exam 70-316?
This book has two sample exams in Chapter 16 and Chapter 18. You
should attempt these exams to access how ready you are. If you require
additional practice, you might also take practice exams from other test
providers.
Onward, Through the Fog!
After you’ve assessed your readiness, undertaken the right background studies, obtained the hands-on experience that will help you understand the
products and technologies at work, and reviewed the many sources of information to help you prepare for a test, you’ll be ready to take a round of practice tests. When your scores come back positive enough to get you through
the exam, you’re ready to go after the real thing. If you follow our assessment
regime, you’ll know not only what you need to study, but also when you’re
ready to set a test date at Prometric (www.2test.com) or VUE (www.vue.com).
Good luck!
1
Introducing Windows
Forms
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terms you’ll need to understand:
✓ .NET Framework
✓ Common Language Runtime (CLR)
✓ Framework Class Library (FCL)
✓ Integrated development environment (IDE)
✓ Class
✓ Inheritance
✓ Namespace
✓ Application and Form class
✓ Event handling
✓ Delegate
✓ System.Drawing namespace
✓ Draw and Fill method
Techniques you’ll need to master:
✓ Create a form and edit its properties at design time using the
Properties window and at run time within the form’s code.
✓ Understand how to handle events in a Windows Forms application.
✓ Experiment with the classes in the System.Drawing namespace.
✓ Understand the use of the Draw and Fill methods of the
Graphics class.
2
Chapter
. . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A user interface enables you to input and modify information for use by an
application. Many types of controls can be added to the user interface to
allow information input, manipulation, and selection in different ways. A
Windows form can be used to integrate these controls and provide a structure for the deployed interface. This chapter examines the basic creation of
Windows forms and simple event handling using the Visual Studio .NET
development environment.
Introduction to the .NET Framework
and Visual Studio .NET
The Microsoft .NET initiative brings about a change in the fundamental
structure of development and deployment. The .NET development platform
integrates support for multiple development languages such as Visual Basic
.NET and C# (pronounced see-sharp) with a Common Language Runtime
(CLR) and a shared Framework class library (FCL). These enable programmers to develop in whatever language they are most comfortable with.
To prepare a machine to support .NET applications, the Common Language Runtime
(CLR) must be present. This is accomplished by loading the .NET Framework, available through the Windows Update site or included within the Microsoft .NET
Framework Software Development Kit (SDK) from the Microsoft MSDN downloads
site.
Code development for the .NET environment can be performed using a text
editor and the command-line compilers within the Microsoft .NET
Framework SDK, but a more robust solution exists in the form of Microsoft’s
Visual Studio .NET product. This product includes an integrated development environment (IDE) and advanced editing tools that make it possible to
rapidly develop code and other .NET structures, use integrated debugging
and automation tools, and simplify application distribution and update by
using the Windows Installer technology.
You are expected to be able to use the Visual Studio .NET product, and to understand
code written using the C# language.
Objects and Classes
C# is an object-oriented language in which every construct is considered
an object that has associated attributes and methods and that, in turn, can
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducing
. . . . . . Windows
. . . . . .Forms
. . .
contain other objects. The abstract concept of a group of objects with common qualities is a class.
The class is a fundamental concept that you will encounter throughout this book.
You should be very familiar with the idea of classes.
A class is a blueprint for an object rather than an object itself. A class encapsulates both data (such as constants and fields) and behavior (including
methods, properties, constructors, and events) into a single concept. To the
programs using a class, a property looks like a field—that is, a storage
location. Properties and fields have the same usage syntax, but their implementations differ. In a class, a property is not a storage location; instead, it
defines accessors that contain code to be executed when the property value is
being read or written. This piece of code allows properties to preprocess the
data before it is read or written, to ensure integrity of a class. Using properties is the preferred way of exposing attributes or characteristics of a class.
A class can have static members (fields, properties, methods, and so on).
Static members belong to the class itself instead of to a particular instance of
that class.
Class Inheritance
Inheritance enables you to create new classes that are based on classes that
already exist. The newly created classes are called derived classes, and the
classes from which they inherit are called base classes. However, a class can
inherit from only one base class at a time; that base class can be inherited
from another base class. Therefore, the chain of inheritance provides a hierarchy on which the classes are based. Figure 1.1 provides an example of the
chain of inheritance from a Windows form through its parent and, in turn,
back to the most fundamental class: the Object class.
The properties, or members, of a class that can be inherited can be limited
by including an access modifier in their declaration. The default modifier for
the properties, or members, of a class is private. Visual C# .NET provides
four access modifiers:
➤ public—This member is globally accessible.
➤ private—This member is accessible only to its containing type.
3
4
Chapter
. . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ protected—This member is accessible to the containing type and all
classes derived from the containing type.
➤ internal—This member is accessible to all classes within the current
project.
System.Object
System.MarshalByRefObject
System.ComponentModel.Component
System.Windows.Forms.Control
System.Windows.Forms.ScrollableControl
System.Windows.Forms.ContainerControl
System.Windows.Forms.Form
Figure 1.1 This is an example of class inheritance by the form class from its parent classes.
Namespace
The .NET Framework FCL includes hundreds of classes, and you will develop many more for each project. To provide organization and structure to
what could rapidly become an unmanageable number of classes, the .NET
Framework makes use of the concept of a namespace. This is a hierarchical
naming system in which classes can be grouped as required.
The standard naming convention for creation of a namespace is shown here:
CompanyName.ApplicationName
An example of this is the creation of a namespace for this book as
ExamCram2.70316. Here, 70316 is the child namespace of the parent
ExamCram2 namespace. If you created a class named ExamItems within the
70316 namespace, the class would be designated as ExamCram2.70316.
ExamItems. A separate ExamItems class could exist within a different namespace, as in ExamCram2.70306.ExamItems. These are unrelated classes
sharing only the common class name, separated by the namespace groupings
of 70316 and 70306 within the parent ExamCram2 namespace.
In FCL, the root namespace that includes all other classes and namespaces is
the System namespace. This contains the Object class (System.Object),
which is the parent for all other classes in the .NET Framework. System also
includes other namespaces that you will deal with, such as the
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducing
. . . . . . Windows
. . . . . .Forms
. . .
System.Drawing namespace that includes classes used to create graphical
elements, and the System.Windows namespace that includes the
System.Windows.Forms child namespace, which, in turn, includes the classes used to create Windows forms objects.
The namespace hierarchy is simply used to organize classes and is separate from the
hierarchy in a chain of class inheritance. A class can inherit from another class located in any namespace.
Now that you are familiar with the basics of the conceptual side of the .NET
development environment, let’s examine the creation of a form within the
Windows Forms Designer.
Using the Windows Forms Designer
Because the .NET Framework supports development across multiple languages, it provides a common development interface for the creation of
objects such as a Windows form. As seen in Figure 1.2, the Windows Forms
Designer displays a form in Design view.
Figure 1.2
The Windows Forms Designer showing the default creation of Form1.
5
6
Chapter
. . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Blank Form
To create a new Windows form, first launch Visual Studio .NET and then
perform the following steps:
1. Click the New Project button in the Start page or select File, New,
Project from the Visual Studio .NET menu.
2. Select Visual C# Projects as the project types and Windows
Application for the template. Provide a meaningful name for the project and a location for the project’s files.
3. As shown in Figure 1.2, you will see the new blank form in Design
view along with the project’s Solution Explorer and Properties windows. If the Solution Explorer is not displayed by default, you can find
it within the View options.
4. To change the name of the form, right-click the form in the Solution
Explorer and select Rename. Then provide the desired name.
Modifying a Form’s Properties
The Properties window within the design environment provides access to
the properties of a selected form in the current project. Values can be edited
here by clicking on the desired property, such as the Text property, which
specifies the text that will be displayed in a form’s title bar.
Displaying a Form
To see the results of your changes, select Start from the Debug menu or press
the F5 key. This displays the form. Clicking the Close button on the form
returns you to Design view. You can switch to Code view of the form by
right-clicking the form and selecting View Code. This opens a new window
displaying the code that corresponds to the Windows form (see Figure 1.3).
When a new Windows application is created, it automatically includes a blank
Windows form.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducing
. . . . . . Windows
. . . . . .Forms
. . .
Figure 1.3
The Windows Forms Designer showing the Code view of Form1.
Exploring Code View
Within the Code view of a form, you can expand the code blocks by clicking
the (+), and you can collapse the block by clicking the (–). As in Figure 1.3,
hovering the cursor over the code block displays the first lines of the collapsed code. A code block can be specified by bracketing the code with
#region and #endregion.
In Code view, you can directly edit the code that creates the form. Changes
here are reflected on your form automatically. One item to note is the inheritance from the System.Windows.Forms.Form class so that the new form
instance automatically includes the inherited members necessary to allow it
to contain other controls and inherit form-related methods. This is accomplished by the automatic code shown here:
public class Form1 : System.Windows.Forms.Form
{
//Form code goes here
}
You will also notice the constructor for the class, which allows for the creation of a new instance of a class. The constructor is recognizable by the
name of the class, as shown here:
7
8
Chapter
. . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public Form1()
{
// Required for Windows Forms Designer support
InitializeComponent();
// TODO: Add any constructor code after InitializeComponent call
}
The Windows Forms Designer uses the InitializeComponent() method for
storing the customizations done to the form through Design view. Additional
initialization of the new instance of the Form class, including programmatic
assignment of property values, can be performed within the
InitializeComponent() method of the class. To set the same Text value previously edited in the Solution Explorer, use the following code:
private void InitializeComponent()
{
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Name = “Form1”;
this.Text = “My First Form”;
}
Here, the keyword this indicates that the code is acting on the currently
selected object and is assigning the value of My First Form to the Text property of the new instance of the Form object.
The Main method within the code is automatically generated by Visual
Studio .NET and receives focus when the code first runs. The code for a
Single Threaded Apartment (STA) designated application would look like
this:
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
When you edit code, you will find that the Visual Studio .NET interface
offers access to any methods and properties available to an object of a class.
This feature, called IntelliSense, will help in rapid development of your
application.
Compiling the Form
When you run the form by selecting Start from the Debug menu or using
the F5 key, Visual Studio .NET attempts to compile the form’s code using a
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducing
. . . . . . Windows
. . . . . .Forms
. . .
suitable language compiler. Errors are displayed so that you can correct them
and compile again, if necessary. If no errors are encountered, Visual Studio
.NET creates an executable (.exe) file with the project’s name, located in the
\bin\debug folder in the location selected to contain the project’s files.
Using Classes
Many classes included in the Framework class library (FCL) can be used
within your application. Many of these classes provide methods, properties,
and events that are used to perform specific tasks in your application.
The Application Class
An Application class provides properties that the code can use to obtain
information about the current application (see Table 1.1), as well as provide
methods to start and close an application, and to process windows messages
(see Table 1.2).
Table 1.1 Important Static Properties of the Application Class
Property
Description
CompanyName
Company name associated with the application
CurrentCulture
Culture information for the current thread
CurrentInputLanguage
Input language for the current thread
ExecutablePath
Path to the EXE file that started the application
ProductName
Product name for the current application
ProductVersion
Product version for the current application
Table 1.2 Important Static Methods of the Application Class
Method
Description
DoEvents
Processes Windows messages currently in the queue
Exit
Closes and exits the application
ExitThread
Exits the message loop on the current thread and closes all
windows on the current thread
Run
Begins a standard application message loop on the current
thread
9
10
Chapter
. . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Form Class
Whenever you create an instance of the System.Windows.Forms.Form class,
the instance inherits many useful properties that can be configured programmatically or through the properties window, as described earlier in this
chapter. Table 1.3 lists important properties of the Form class.
Table 1.3 Important Properties of the Form Class
Property
Description
BackColor
Specifies the background color of the form
BackgroundImage
Specifies the background image for the form
ClientSize
Specifies the size of the client area of the form
ControlBox
Indicates whether a control box needs to be displayed in the caption bar of the form
DesktopLocation
Determines the location of the form on the Windows desktop
Enabled
Indicates whether a control can respond to user interaction
FormBorderStyle
Specifies the border style of the form
Handle
Gets the window handle (hWnd) of the form
HelpButton
Indicates whether a Help button is to be displayed on the caption
bar of the form
Icon
Specifies the icon for the form
MaximizeBox
Indicates whether a Maximize button is to be displayed on the caption bar of the form
MaximumSize
Determines the maximum size to which this form can be resized
MinimizeBox
Indicates whether a Minimize button is to be displayed in the caption bar of the form
MinimumSize
Determines the minimum size to which this form can be resized
Modal
Indicates whether the form will be displayed modally
Name
Gives the name of the form
Opacity
Specifies the opacity level of the form, measured as a decimal percentage from 0 (transparent) to 1 (fully opaque)
ShowInTaskbar
Indicates whether this form is displayed in the Windows taskbar
Size
Determines the size of the form
StartPosition
Specifies the starting position of the form at runtime
TopMost
Indicates whether this form is displayed as the topmost form of the
application
Forms also include many methods that can be used to act upon an instance
of the Form class. These include the Show() method, which displays an
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducing
. . . . . . Windows
. . . . . .Forms
. . .
instance of the class; the Hide() method, which temporarily stops displaying
the form without closing it; and the Close() method, which terminates an
instance of a form.
To provide the final result, some of the methods take into account other
properties set on a form at the time the Show() method is invoked, such as
the specification of the Opacity property. If this property is set at a value
between 0 (transparent) and 1 (opaque), the resultant form will be partially
transparent when the Show() method is called. To place a form on top of others already present, you would set the form’s TopMost property to true
before invoking the Show() method.
Custom Properties
In addition to using the existing properties, you can add custom properties
to a Windows Form. You can use a custom property to store applicationspecific data.
For example, you can add the following code in the class definition to declare
a property named FormState that stores the value of the custom-defined
State enumeration:
//define constant values for State
public enum State{Idle, Connecting, Processing}
//use this field as storage location for FormState property
private State formState;
//set attributes for FormState property
[Browsable(true),
EditorBrowsable(EditorBrowsableState.Never),
Description(“Sets the custom Form state”),
Category(“Custom”)]
//Creating FormState property
public State FormState
{
get
{
return formState;
}
set
{
formState = value;
switch (formState)
{
case State.Idle:
this.BackColor = Color.Red;
this.Text = “Idle”;
break;
case State.Connecting:
this.BackColor = Color.Orange;
this.Text = “Connecting...”;
break;
case State.Processing:
11
12
Chapter
. . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
this.BackColor = Color.Green;
this.Text = “Processing”;
break;
}
}
}
The preceding code first defines the memory variable formState to hold the
value of the FormState property, which is a custom-defined State enumeration member.
Therefore, custom properties can hold any type of data. You can set the value
for custom properties through code as follows:
//set the FormState property of this form
this.FormState = State.Processing;
When you create a new property, you can control its behavior by configuring its attributes. You can customize the custom property to appear in the
Properties window (for the derived forms) or in IntelliSense by applying
attributes to the property. The attributes you should be aware of are listed in
Table 1.4.
Table 1.4 Attributes That Control the Behavior of a Custom Property
Attribute
Description
Browsable
Indicates whether the property will be displayed in the Properties
window. Its default value is true.
EditorBrowsable
Indicates whether the property should appear in the IntelliSense list
of an object in Code view. Its value is set to a member of the
EditorBrowsableState enumeration, with three possible values:
Advanced, Always, or Never. Its default value is Always.
Description
Provides a description of the property. When specified, it is displayed in the description area when the property is selected.
Category
Specifies the category of the property. This is used in the Properties
window to categorize the property list.
When you create a new property, you must specify its accessors (get and set). These
are access methods that apply to the new property.
Without a defined get accessor, the property becomes write-only; a property lacking
a set accessor definition is read-only.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducing
. . . . . . Windows
. . . . . .Forms
. . .
Visual Inheritance
Visual inheritance is a process by which a visual element such as a form or a
control inherits from an existing element. Visual inheritance helps reuse
existing code and maintains consistency among visual elements.
You can inherit a form from an existing form by using visual inheritance. You
can add an inherited form using the Visual Studio .NET IDE: In the
Solution Explorer, right-click the project name and select Add, Add
Inherited Form. This opens the Add New Item dialog box. In the dialog box,
name the new form and click the Open button. This opens the Inheritance
Picker dialog box (see Figure 1.4).
Figure 1.4 The Inheritance Picker shows components that can be selected for inheritance.
When a form inherits from another form, the derived form inherits all the
members of the base class, but the private members of the base class are not
accessible in the derived class. This is because the variables with a private
access modifier are not accessible beyond the class definition. You can also
add extra functionality to the inherited form. The new functionality does not
affect any of the base classes; it is available only in the inherited form and the
other classes you derive from it.
Event Handling
Event handling is the process of reacting to events and is an important part of
programming a user interface. An event is generated as the result of user
actions, such as resizing a form, clicking the form, or moving the mouse over
the form. An event also can be generated by changes in the environment,
such as when a change in time occurs or when another application performs
some action that affects the current application.
13
14
Chapter
. . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Two basic methods of event handling exist:
➤ Attaching a delegate
➤ Overriding a protected method of the base class
Attaching a Delegate
When a form is loaded, a Load event is raised. When you click the left or
right buttons of a mouse, a MouseDown event is raised. Therefore, events
enable a class to provide notifications to other objects that something of
interest to them has happened.
If you want to perform some actions when events occur, you can define an
appropriate event handler. An event handler is a method that is executed as a
response to an event. The event handler should be registered with the event
source so that when the event occurs, the handler is invoked (this is also
referred to as event wiring).
The event handler is a method with a specific signature specified by the event
delegate. An event handler normally has a void return type and accepts two
arguments: the object on which the event occurred and an argument of type
EventArgs (or a type derived from it, such as MouseEventArgs).
The following code shows the way the delegate for the MouseDown event is
defined:
public delegate void MouseEventHandler(object sender, MouseEventArgs e);
The preceeding definition means that the MouseEventHandler, the delegate
for the MouseDown event, is capable of storing references to any method
whose return type is void and which accepts two arguments: the first one of
type System.Object and the other one of type MouseEventArgs.
The following code shows how to define the event handler so that it can be
registered with the help of the MouseEventHandler delegate:
private void MouseClicker_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e)
{
MessageBox.Show(String.Format(“X ={0}, Y={1}”, e.X, e.Y),
String.Format(“The {0} mouse button hit me at:”,
e.Button.ToString()));
}
Now, after creating the event handler with the desired signature, you need to
attach this event handler with the event. For this, you need to create a new
instance of the delegate (in this case, MouseEventHandler) and then attach
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducing
. . . . . . Windows
. . . . . .Forms
. . .
the delegate object to the event. The following code shows how to attach a
delegate:
[STAThread]
static void Main()
{
MouseClicker MyForm= new MouseClicker();
MyForm.MouseDown += new MouseEventHandler(MyForm.MouseEventHandler);
Application.Run(MyForm);
}
In the preceeding code, MyForm represents the current form, MouseDown
is the name of the event, MouseEventHandler is the delegate, and
MouseClicker_MouseDown() is the event handler to attach.
When you are attaching a delegate object to the event, you should usually use the +=
syntax instead of the = syntax. This is because = attaches the current delegate but
loses the other previously attached delegates. Using += ensures that the list of previously attached delegates is preserved. You can detach an event handler from an
event by using the -= syntax.
After the delegate containing the event handler definition is attached, in this
example, whenever the MouseDown event triggers, the MouseClicker_
MouseDown() event handler is executed. This displays the current position
of the mouse over the form in a message box, as shown in Figure 1.5.
Figure 1.5 A message box displaying the results of the MouseDown event.
The properties window in Visual Studio .NET provides an easy-to-use interface for attaching an event handler to the event. Using this method, you
select the Events icon of the properties window and then select an event such
as the MouseDown event from the list of events. After you select the
MouseDown event, you specify the name of the event handler that should be
executed when the event occurs. This simple step attaches the event handler
to the event. Behind the scenes, Visual Studio .NET generates code to actually attach the event handler to the event. Using a delegate is the preferred
way of attaching event handlers in Visual Studio .NET.
It is possible to have a single event handler respond to multiple events if the
delegates of the event require event handlers to be of the same signature. It
is also possible to have multiple event handlers interested in responding to
an event.
15
16
Chapter
. . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
If you designate multiple event handlers to respond to the same event, they execute
sequentially in the order they are registered.
The MouseEventArgs Type
The second argument of the event handler is an object of type EventArgs, or
one derived from EventArgs that contains event-related data. In the previous
example, the MouseDown event handler had defined the second argument of
MouseEventArgs type, which consisted of MouseDown event-related data.
This class is derived from the System.Windows.EventArgs type. Table 1.5
lists some of the properties of the MouseEventArgs type.
Table 1.5 MouseEventArgs Properties
Member
Description
Button
Returns a value of type MouseButtons that specifies which mouse button
was pressed.
Clicks
Returns the number of times the mouse button was pressed and released.
Delta
Gives a signed count of the number of detents the mouse wheel has rotated. A detent is one notch of the mouse wheel.
X
The x-coordinate of a mouse click.
Y
The y-coordinate of a mouse click.
Overriding a Protected Method of the Base
Class
When you create a Windows Form, it inherits from the Form class. By virtue
of this inheritance, it can access a set of public and protected methods, as well
as properties available to it from one of its base classes. Some of the classes
provide sets of protected methods that raise events. You can easily identify
these methods because their naming convention is the word On followed
by the name of the event. For example, OnMouseDown() is a protected
method that raises the MouseDown event. The Form class gets this protected method from the Control class.
You can perform event handling by just overriding the base class method.
The following code provides an example by overriding the OnMouseDown
method of the Control class in the form:
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducing
. . . . . . Windows
. . . . . .Forms
. . .
protected override void OnMouseDown(
System.Windows.Forms.MouseEventArgs e)
{
// Calling the base class version of the method
base.OnMouseDown(e);
MessageBox.Show(String.Format(“X ={0}, Y={1}”, e.X, e.Y),
String.Format(“The {0} mouse button hit me at:”,
e.Button.ToString()));
}
When you override the protected method of the base class, you should
always call the base-class version of the method. This way, the derived class
will always have the minimum level of functionality offered by the base class.
On the other hand, if you don’t call the base-class version of the method, you
will not be able to access all the functionality provided by the base class in
the derived class. In the case of event handling, calling the base-class version
of the method is all the more important because the protected method of the
base class takes care of invoking the attached delegates:
public event MouseEventHandler MouseDown;
protected virtual void OnMouseDown(MouseEventArgs e)
{
if (MouseDown != null)
{
//Invokes the delegates.
MouseDown(this, e);
}
}
}
Therefore, it is always a good practice to call the base-class version of the
method when overriding.
Building Graphical Interface
Elements by Using the
System.Drawing Namespace
The .NET FCL provides an advanced implementation of the Windows
Graphics Device Interface (GDI) known as GDI+. GDI+ includes the following four namespaces in System.Drawing.dll:
➤ System.Drawing
➤ System.Drawing.Drawing2D
17
18
Chapter
. . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ System.Drawing.Imaging
➤ System.Drawing.Text
The GDI+ classes in these preceeding namespaces can be used to build
graphical interface elements such as drawing text, fonts, lines, shapes, and
images. GDI+ enables you to develop device-independent applications; you
just need to work with the Graphics object instead of worrying about the
specific details of the underlying platform.
The Graphics object is discussed in the following section.
Understanding the Graphics Object
The Graphics object represents a drawing surface that can be used to draw
graphical elements without worrying about the underlying devices. The
Graphics object is an instance of the Graphics class, which resides in the
System.Drawing namespace. It is a sealed class and, therefore, cannot be further inherited like the Form class. The Graphics class does not contain any
constructors, so it cannot be instantiated. You can retrieve a Graphics object
through one of the following methods:
➤ Through the Graphics property of the PaintEventArgs argument passed
to the Paint event handler of a control or a form. The resultant
Graphics object represents the drawing surface of the object that called
the event.
➤ By calling the CreateGraphics() method of a control or form.
➤ By calling the Graphics.FromHwnd() method and passing to it the han-
dle of the current form.
➤ By calling the Graphics.FromImage() method. This method takes an
image object and returns a Graphics object corresponding to that image.
You can use the resultant Graphics object to manipulate the image.
The Graphics class provides properties and methods that can be used to draw
graphical elements on a form. These properties and methods are discussed
later in the chapter.
The System.Drawing Namespace
Within the System.Drawing namespace, you can use several structures to
manipulate a Graphics object. Table 1.8 lists those you should be familiar
with.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducing
. . . . . . Windows
. . . . . .Forms
. . .
Table 1.8 System.Drawing Namespace Structures
Structure
Description
CharacterRange
A range of character positions within a string.
Color
A structure with 140 static properties, each representing the name of
a color and four properties—A, R, G, and B, specifying the alpha,
red, green, and blue portions of the color. A Color value can be created using the static methods FromArgb(), FromKnownColor(), and
FromName().
Point
An ordered pair of integer x and y that defines a point in a twodimensional plane. It includes a set of methods and operators to
work with points.
PointF
A float version of the Point structure.
Rectangle
Stores the integer location and size of a rectangular region. You can
create a Rectangle structure by using a Point structure and a Size
structure. Point represents the top-left corner, while Size specifies its
width and length from the given point.
RectangleF
A float version of the Rectangle structure.
Size
The integer size of a rectangular region (width, height).
SizeF
A float version of the Size structure.
The size of a form is measured from its top-left corner, which serves as its origin
(0,0). The client area of a form is the portion excluding the title bar, borders, and a
menu, if present. The value of x increases as you measure to the right, while the value
of y increases as you measure downward.
Drawing Text on a Form
To draw text on a Windows form, use the DrawString() method of the
Graphics class. The following code gives an example:
private void PaintExample_Paint(
object sender, System.Windows.Forms.PaintEventArgs e)
{
Graphics grfx = e.Graphics;
String str = String.Format(
“Form Size is: Width={0}, Height={1}”, Width, Height);
grfx.DrawString(str, Font, Brushes.Black, 0, 0);
}
[STAThread]
static void Main()
{
Application.Run(new PaintExample());
}
19
20
Chapter
. . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The preceding code uses the Paint event handler of the form to retrieve a
Graphics object and draw text. The Paint event is selected because it is generated each time the form is redrawn, including when the Show() method is
called to initially create or restore a hidden form. The DrawString method
displays the height and width of the form. The arguments passed to the
DrawString method in the preceeding example are as follows:
GDI+ and the Windows forms library include full support for the Unicode character
set, making it possible to draw text in any language supported by the system.
➤ The first argument is the string to be displayed.
➤ The second argument is the font of the string. Here, the default font is
used.
➤ The third argument is the type of brush. The Brushes enumeration pro-
vides you with a variety of Brush objects, each with a distinct color.
Here, the Brushes.Black value was selected to draw text in the color
black.
➤ The fourth and fifth arguments are used to specify the x and y locations
for the point that marks the start of a string on the form. Both of these
values are required to be of float data type. Here, the 0 value implicitly
is converted to a Float value.
Using the Invalidate Method
The Paint event is generated whenever the form is redrawn. To draw text
during other events, such as during a form Resize event, you can call the
Invalidate() method. The following code invokes the Invalidate() method
when the Resize event of the form occurs:
private void PaintExample_Resize(object sender, System.EventArgs e)
{
// Call the Invalidate method
Invalidate();
}
The Invalidate() method is called without any arguments in this example, to
cause a Paint event to occur for the entire form. You also can provide a
Rectangle parameter to restrict a specific portion of a form to be redrawn
when the Invalidate() method is called.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducing
. . . . . . Windows
. . . . . .Forms
. . .
Using the ResizeRedraw Property
You also can set the ResizeRedraw property of the form to true so that
the form can redraw itself when it is resized. When you set this property to
true, and when the form is resized, the code in the Paint event handler is executed.
Drawing Shapes Using the Draw Method
It is often desirable to draw shapes and graphics on a form. The Graphics
class enables you to draw many shapes. Table 1.9 lists the drawing methods
of the Graphics class and the shapes you can create with them.
Table 1.9 Drawing Methods from the Graphics Class
Method
Description
DrawArc
An arc that represents a portion of an ellipse
DrawBezier
A Bézier curve defined by four points
DrawBeziers
A series of Bézier curves
DrawClosedCurve
A closed curve defined by an array of points
DrawCurve
A curve defined by an array of points
DrawEllipse
An ellipse defined by a bounding rectangle specified by a pair of
coordinates, a height, and a width
DrawIcon
The image represented by the specified Icon object located at the
given coordinates
DrawImage
An Image object at the specified location, preserving its original
size
DrawLine
A line connecting two points
DrawLines
A series of line segments that connect an array of points
DrawPath
A GraphicsPath object
DrawPie
A pie shape defined by an ellipse and two radial lines
DrawPolygon
A polygon defined by an array of points
DrawRectangle
A rectangle specified by a point, a width, and a height
DrawRectangles
A series of rectangles
DrawString
Draws the given text string at the specified location with the specified Brush and Font objects
The Draw methods make use of the Pen object to draw the graphic elements.
You can retrieve a Pen object with the help of different Pen-related classes in
the System.Drawing namespace.
21
22
Chapter
. . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 1.10 lists the Pen-related classes within the System.Drawing namespace. Table 1.11 lists some of the properties of the Pen class you should be
familiar with.
Table 1.10 Classes Related to Pen in the System.Drawing Namespace
Class
Description
Pen
Represents an object used to draw lines and curves.
Pens
Provides 140 static properties, each representing a Pen object of a standard color.
SystemPens
Provides a set of static properties named after a Windows display element. Each of these properties returns a Pen object of width 1.
Table 1.11 Properties of the Pen Class
Property
Description
Alignment
Alignment for the Pen object
Brush
Brush object that determines attributes of the Pen object
Color
Color of the Pen object
DashCap
Cap style used at the end of the dashes in dashed lines
DashPattern
An array of custom dashes and spaces
DashStyle
The style used for dashed lines
EndCap
Cap style used at the end of lines
LineJoin
Join style for the ends of two consecutive lines
PenType
Style of lines
StartCap
Cap style used at the beginning of lines
Width
Width of the Pen object
When you draw graphical shapes using the methods of the Graphics class,
you can set the rendering quality of these elements with the help of the
SmoothingMode property. The SmoothingMode property can be set to one
of the values of the SmoothingMode enumeration. Table 1.12 details these
enumerated values. Antialiasing is the process in which semitransparent
pixels are included at the boundaries of two colors to create a smootherappearing boundary.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducing
. . . . . . Windows
. . . . . .Forms
. . .
Table 1.12 SmoothingMode Enumeration Members
Member Name
Description
AntiAlias
Antialiased rendering.
Default
Same as None.
HighQuality
High-quality, low-performance rendering. Same as AntiAlias.
HighSpeed
High-performance, low-quality rendering. Same as None.
Invalid
Invalid mode. Raises an exception.
None
Does not use antialiasing.
Creating Filled Shapes Using the Fill
Method
An additional option for the creation of graphical objects on a form includes
using the Fill method to create filled objects with colors or patterns. Table
1.13 details the Fill methods of the Graphics class.
Table 1.13 Fill Methods of the Graphics Class
Method
Description
FillClosedCurve
Fills the interior of a closed curve defined by an array of points
FillEllipse
Fills the interior of an ellipse defined by a bounding rectangle
FillPath
Fills the interior of a GraphicsPath object
FillPie
Fills the interior of a pie section defined by an ellipse and two radial
lines
FillPolygon
Fills the interior of a polygon defined by an array of points
FillRectangle
Fills the interior of a rectangle specified by a point, a width, and a
height
FillRectangles
Fills the interiors of a series of rectangles
FillRegion
Fills the interior of a Region object
The Fill methods use Brush objects to determine the type of fill that
will occur. You can retrieve a Brush object with the help of different Brushrelated classes in the System.Drawing and System.Drawing.Drawing2D
namespaces. Table 1.14 details the types of Brush-related classes that can be
used.
23
24
Chapter
. . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 1.14 Brush Classes in System.Drawing and System.Drawing.Drawing2D
Namespaces
Class
Description
Brush
An abstract base class. Used to create brushes such as
SolidBrush, TextureBrush, and LinearGradientBrush. These are
used to fill the interiors of graphical shapes such as rectangles, pies, polygons, and paths.
Brushes
Has 140 static properties, one for the name of each standard
color.
HatchBrush
Used to fill a region using one of a large number of patterns
available in HatchStyle.
LinearGradientBrush
Used to create two-color gradients and multicolor gradients.
The default is a linear gradient from one color to another along
a specified line.
SolidBrush
Defines a brush of a single color. Brushes are used to fill
graphics shapes, such as rectangles, pies, polygons, and
paths.
SystemBrushes
A set of properties named after a Windows display element.
Each of these properties returns a SolidBrush object representing the color of the display element.
TextureBrush
A Brush object that uses an image to fill the interior of a
shape.
This section discussed how to use the Graphics class to draw deviceindependent graphical elements such as text, lines, and shapes. It also
discussed how to work with other key graphics elements, such as brushes,
colors, and pens.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducing
. . . . . . Windows
. . . . . .Forms
. . .
Practice Questions
Question 1
The Framework class library (FCL) enables you to access which of the following?
❍ A. Custom classes created by a particular developer
❍ B. Custom classes shared by a particular project
❍ C. Public classes common to the .NET Framework
❍ D. Private classes common to the .NET Framework
Answer C is correct. The FCL includes hundreds of public classes that can
be used in an application developed within the .NET Framework. Answers
A and B are incorrect because the FCL contains classes common to the
.NET Framework rather than custom user-created classes. Answer D is
incorrect because the private classes within the FCL are inaccessible.
Question 2
You want to change the font setting of a form so that all text placed on it will
appear in bold. Which of the following statements would you use to set the font
programmatically?
❍ A.
this.Font.Bold = true;
❍ B.
this.Font = new Font(this.Font, FontStyle.Bold);
❍ C.
this.Font.FontStyle = FontStyle.Bold;
❍ D.
this.Font = new Font(this.Font, this.Font.Bold);
Answer B is correct. You cannot directly set the Bold property of a Font
object because it’s a read-only property (the set accessor is not available).
Therefore, the only way to set the Font object’s Bold property is by calling
its constructor to create a new Font object with the desired settings.
25
26
Chapter
. . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 3
You need to define a property named ModuleNumber. This property should be
accessible only inside the same project. Which of the following access modifiers
will you use to define this property? (Choose all correct answers.)
❑ A. public
❑ B. private
❑ C. protected
❑ D. internal
Answer D is correct. Members defined with the internal access modifier are
accessible only within the same project. Answer A is not correct because
members defined with the public access modifier are globally accessible.
Answer B is not correct because members defined with the private access
modifier are not accessible outside their own class. Answer C is not correct
because members defined with the protected access modifier are accessible
by the derived classes, which can be defined within the same or different
project.
Question 4
You have configured a redraw handler using the Invalidate() method without
providing any input parameters. What will be the result of this?
❍ A. The application will terminate at the instance of the Invalidate()
method.
❍ B. The application will continue but will fail to redraw the graphic elements.
❍ C. The entire form will be redrawn.
❍ D. Only the area under the cursor will be redrawn.
Answer C is correct. A call to the Invalidate() method without specifying any
parameters causes the entire form to be redrawn. Answers A and B are incorrect because the Invalidate() call does not cause the application to terminate.
Answer D is incorrect because the cursor location is not used by the
Invalidate() method.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducing
. . . . . . Windows
. . . . . .Forms
. . .
Question 5
Which method of the Form class must you call to remove a form and be able to
open it later with the same information present?
❍ A. Exit
❍ B. Hide
❍ C. Close
❍ D. Show
Answer B is correct. The Hide method allows a form to be temporarily hidden and later accessed with the information intact. Answer A is incorrect
because the Form class does not contain an Exit method. Answer C is incorrect because the Close method closes a form completely, losing its current
settings if it is later reopened. Answer D is incorrect because the Show
method is used to reveal a form rather than to conceal it.
Question 6
You are creating a drawing board application. After clicking a button that enables
drawing, you are required to draw on the form as the mouse moves over the
form. You have already written an event handler to handle drawing. You now
want to attach the event handler to the event. Which of the following statements
will you place in the Main method?
❍ A.
MyForm.MouseDown += new System.Windows.Forms
MouseEventHandler(
DrawingForm_MouseDown);
❍ B.
MyForm.MouseMove += new System.Windows.Forms.
MouseEventHandler(
DrawingForm_MouseMove);
❍ C.
MyForm.MouseDown += DrawingForm_MouseDown;
❍ D.
MyForm.MouseMove += DrawingForm_MouseMove;
Answer B is correct. To attach an event handler, you should create a delegate
object that stores a reference to the event handler and attach the delegate
object to the event. Here, you need to attach an event handler that gets executed whenever the mouse moves; you need to attach the event handler to
the MouseMove event. Answers A and C are incorrect because these statements use the MouseDown event instead of the MouseMove event. Answer
27
28
Chapter
. . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
D is incorrect because you should create a delegate object and then attach it
to the event rather than attaching the event handler directly.
Question 7
Which of the following is true if your form, Form1, has been configured with an
Opacity of .3, while Form2 has been configured with an Opacity of 1?
❍ A. Form1 will be displayed on top of Form2.
❍ B. Form2 will be displayed on top of Form1.
❍ C. Form1 is 30% transparent.
❍ D. Form1 is 70% transparent.
❍ E. Form2 is transparent.
Answer D is correct. The opacity value is set on a form to determine how
much of a covered form it will occlude. A setting of .3 opacity means that
30% of the background will be occluded, so the form is 70% transparent.
Answers A and B are incorrect because the Opacity property does not dictate
which form will be on top; the TopMost property provides this information.
Answer C is incorrect because a 30% transparency would require an opacity
of .7, while Answer E is incorrect because neither form is transparent. Form2
is completely opaque with an opacity of 1, which means that it is 100%
opaque.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducing
. . . . . . Windows
. . . . . .Forms
. . .
Question 8
You need to draw graphical shapes such as circles, ellipses, rectangles, and pies
on a Windows Form. You need to draw these shapes filled with a hatch style
selected by the user. You have discovered that you have to use the HatchBrush
class for a Brush object and call Fill methods of the Graphics class to draw filled
shapes with a hatch style. You want to refer to these classes in your programs
directly. Which of the following using directives will you include in your program
to enable this?
❍ A.
using System.Drawing;
❍ B.
using System.Drawing.Drawing2D;
❍ C.
using System.Drawing.Imaging;
❍ D.
using System.Drawing.Text;
Answers A and B are correct. The Graphics class resides in the
System.Drawing namespace. Therefore, you need to include a using directive for this namespace to access it directly. The HatchBrush class and
HatchStyle enumeration reside in System.Drawing.Drawing2D namespace.
Therefore, you need to include a using directive for this namespace to access
them directly.
Question 9
You need to measure the size of a form. You know that the corner opposite the
origin (0,0) is at location (128,164). The form has a 3-pixel-wide border and a
20-pixel-high title bar. What is the width and height of the form?
❍ A. Width: 122, height: 138
❍ B. Width: 138, height: 122
❍ C. Width: 128, height: 144
❍ D. Width: 128, height: 164
29
30
Chapter
. . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Answer D is correct. The Size property specifies the overall size of the form,
measured from its origin. Answer A is incorrect because it specifies only the
user area of the form, excluding the borders and title bar. Answer B is incorrect because it is the measure of the user area reversed in width and height
measure. Answer C is incorrect because it specifies the proper measures for
the user area if the borders were 0 pixels wide.
Question 10
Which of the following methods can be used to get a Graphics object for a
Windows Form?
❍ A. Graphics.FromHWnd
❍ B. Graphics.FromForm
❍ C. Graphics.FromImage
❍ D. Graphics.CreateObject
Answer A is correct. Graphics.Hwnd method gets a Graphics object for a
Windows Form. Answer C is not correct because Graphics.FromImage
method can get only the Graphics object for an image file. Answers B and D
are not correct because these methods do not exist.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducing
. . . . . . Windows
. . . . . .Forms
. . .
Need to Know More?
Albahari, Ben, Peter Drayton, and Brad Merrill. C# Essentials.
O’Reilly, 2002.
Petzold, Charles. Programming Windows with C#. Microsoft Press,
2001.
Chappell, David. Understanding .NET. Addison-Wesley, 2001.
Windows Forms Community Site: www.windowsforms.net/.
Windows Forms FAQ: www.syncfusion.com/FAQ/winforms.
31
2
Controls on Forms
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terms you’ll need to understand:
✓ Control
✓ Container
✓ TabIndex property
✓ TabStop property
✓ ToolTip
✓ Dialog box
✓ Menu
✓ Status bar
✓ Toolbar
Techniques you’ll need to master:
✓ Experiment with the common Windows controls that are available in the Windows Forms Designer toolbox. Know their
important properties, methods, and events.
✓ Know how to add controls to container objects using the
Windows Forms Designer and programmatic code.
✓ Utilize the Z-order to properly sort overlapping controls.
✓ Configure the TabIndex and TabStop properties of the controls
to determine the order in which controls will gain focus.
✓ Know how to handle events for Windows Forms controls.
✓ Experiment creating main menus and context menus and
implement them in single-document and multidocument applications.
34
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The purpose of a user interface is to allow the user to input, view, and act
upon data presented by an application. C# includes a wide variety of standard
controls that can be added to a form to allow this functionality. Users can
create their own custom controls and include these in their applications as
well.
In this chapter, we discuss the properties, methods, and events of the control
types you should be familiar with before appearing for the exam. Finally, we
discuss the methods of adding controls to forms, and we contrast singledocument and multidocument applications.
Common Properties of Controls
The Windows form inherits from the ContainerControl class. As a result, it
is capable of containing other controls. The controls in the Windows form
design the user interface of an application. The Windows form controls
inherit from the Control class either directly or indirectly through their
chain of inheritance. As a result, these controls derive some common properties, methods, and events from the Control class.
As you already know from Chapter 1, “Introducing Windows Forms,” you
can easily modify the properties of controls using the Properties window
within the Visual Studio .NET IDE. Simply click the control to select it and
then modify the values within the Properties window. The Properties window provides a rich interface that enables you to modify simple properties as
well as properties that return structures and objects.
You can also modify the properties of a control using code by assigning the
desired value to the control’s property using the format
ControlObject.Property, where ControlObject is the name of the target control
and Property is the name of the property to which the new value should be
assigned.
The Z-order specifies the order in which controls are evaluated when layered atop
one another. The control with the lowest z-axis value is considered to be on top of
others with higher z-axis values. You can rapidly move a control’s z-axis location
within its container by right-clicking the control and selecting Bring to Front or
Send to Back from the shortcut menu.
The following sections review common properties of the controls that you
should know for the exam.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
Anchor
When a form is resized, you might want the controls to remain anchored to
a particular location on the form so that the result remains in a standard layout. The default anchor for controls is the top left of the form; as the form
is resized larger, controls remain in position at the top left of the expanded
form. You can change this within the Properties window, as seen in
Figure 2.1.
Figure 2.1 The Properties window for a control, showing the Anchor value selected with an
assigned anchor at the bottom-left corner of the form.
Dock
The Dock property enables a control to span an entire edge (left, right, top,
or bottom) of its parent control. Docking is often used with toolbars and status bars to maintain their position even as a form is resized. You can adjust
this value within the Properties window, as shown in Figure 2.2. Its default
value is None, meaning that a control is not docked to an edge.
Enabled
A control has a Boolean (true/false) value assigned to its Enabled property.
This value is generally true by default, though some controls such as Timer
have an Enabled value of false by default. If a control is not enabled, it
appears grayed out and cannot generate events or receive focus.
35
36
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Figure 2.2 The Properties window for a control showing the Dock property selected for bottomedge docking.
Font
Font describes the format for presenting textual information within the control. Figure 2.3 displays the Font dialog box used to set this property. The
Font dialog box can be accessed by clicking the ellipsis button (…) when you
select the Font property in the Properties window.
The Font property returns a Font object that contains different properties to
set the desired font. You cannot programmatically change one of the properties of this Font object because Font objects cannot be modified after they
are created. You must create a new Font object with the desired property settings and assign it to the Font property.
Figure 2.3 The Font dialog box shows the Microsoft Sans Serif font selected in Italic mode at
12-point size.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
Location
This property specifies the absolute location of the top-left corner of the
control, measured in pixels from the top-left corner of the form. This value
is automatically set when you place the control from the toolbox into the
Windows form within Visual Studio .NET.
Name
The name of a control is used to manipulate the control programmatically.
The default value of the Name property is an automatically generated value
based on the type of control and the order in which it is placed on the form.
For example, the names Label1, Label2, and Label3 refer to the first three
Label controls added to a form.
It is good coding practice to rename a control using a meaningful name and the
three-character Hungarian naming scheme prefix to display what type of control it
is. An example of this is a Label box that holds a description for the Sales form,
named lblSalesDesc.
Size, Height, and Width
The Size property refers to a structure that contains Height and Width
properties. The Size property for a new control is assigned based on the control’s DefaultSize value. It can be altered as desired to fit on the application’s
form.
TabIndex and TabStop
The Tab key can be used to allow a user to rapidly change focus from one
control to the next. The TabStop property is a Boolean (true/false) value, set
to true by default that indicates whether a control receives the focus when a
user is tabbing between controls. If this value is set to false, the control is
skipped when the Tab key is pressed. If TabStop is set to true, the control
receives focus based on its order within the other controls, established by the
TabIndex value.
Text
The Text property is used in different ways by many types of controls. As you
saw in Chapter 1, the Text property of a form is displayed in its title bar,
37
38
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
while the Text value of a label is displayed on its face. Controls such as
TextBox display the Text property as an input value that can be changed.
The Text property can be used to provide keyboard shortcuts using the
ampersand character (&) in front of a text character, to use it as the access
key for that control. For example, a button with a Text value of &Save displays the S in Save As Underlined and accepts Alt+S to cause the Click event
of the control to be executed. Some controls, such as a Label control, cannot
receive the focus. If an access key is assigned to a control such as this, the
focus is received by the control with the next-highest TabIndex value.
To display an ampersand within the Text value, as in “Texas A&M University,” you
would include a double ampersand (&&), which tells the control to display the ampersand value itself.
Visible
The Visible property is a Boolean (true/false) value that determines whether
the control is visible to the user. Set to true by default, this value affects only
the visibility of the control to the user and does not prevent the control from
being manipulated programmatically. If this value is set to false, the control
remains visible within the Windows Forms Designer but is not visible to the
end user at runtime.
Common Windows Forms Controls
Many controls are available for use in your Windows forms application.
Most of these are derived from the System.Windows.Forms.Control class, as
detailed in Figure 2.4.
This section reviews properties, methods, and events of some of the common
controls. If you are very familiar with the Visual Studio .NET IDE, many of
these might be familiar to you already.
GroupBox and Panel
Like the Form control itself, some controls are meant to contain other controls to arrange or group controls together. The GroupBox and Panel controls can contain other controls. They are mostly used to arrange controls
and group similar controls. The GroupBox control does not include scrollbars, but it enables you to specify a caption for the group box. The Panel
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
control adds scrollbars to allow you to present more controls within the same
panel. The Panel control does not include a caption. Table 2.1 details the
important members of the GroupBox class, while Table 2.2 details those of
the Panel class.
Control
ButtonBase
ListView
ScrollBar
Button
MonthCalendar
HScrollBar
CheckBox
PictureBox
VScrollBar
RadioButton
PrintPreviewControl
Splitter
DataGrid
ProgressBar
StatusBar
DateTimePicker
ScrollableControl
TabControl
GroupBox
Label
LinkLabel
ListControl
ContainerControl
TextBoxBase
Form
RichTextBox
PropertyGrid
TextBox
UpDownBase
ToolBar
ComboBox
DomainUpDown
TrackBar
ListBox
NumericUpDown
TreeView
CheckedListBox
Panel
Figure 2.4 The Controls hierarchy showing many common Windows Forms controls.
Table 2.1 Important Members of the GroupBox Class
Member
Type
Description
Controls
Property
Collection of controls contained in the group box
Text
Property
Caption of the group box
Table 2.2 Important Members of the Panel Class
Member
Type
Description
AutoScroll
Property
Indicates whether scrollbars should be displayed when the
display of all controls exceeds the panel’s area
Controls
Property
Collection of controls contained in the panel
GroupBox and Panel controls can be used on the same form to group other
controls as desired or to allow the use of scrollbars to access a larger control
39
40
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
within a smaller area. Figure 2.5 shows the use of a Panel control to provide
a scrollable area containing a larger PictureBox control displaying an image;
a GroupBox control also is used here to show the file statistics for the image
file by grouping several Label controls.
Figure 2.5 Panel and GroupBox controls are used here in combination to display an image file and
its statistics.
Label and LinkLabel
The Label control displays read-only data to the user, including both text
and image information. The LinkLabel control extends this to include a
clickable hyperlink capability that can open a Web page, an application, or a
folder. Table 2.3 details the important members of the Label class, while
Table 2.4 details those of the LinkLabel class.
Table 2.3 Important Members of the Label Class
Member
Type
Description
Image
Property
Image displayed on the Label
Font
Property
Font for the displayed text
Text
Property
The displayed text
TextAlign
Property
Alignment of the text on the Label (Center, Left, or Right;
Bottom, Middle, or Top)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
Table 2.4 Important Members of the LinkLabel Class
Member
Type
Description
ActiveLinkColor
Property
Specifies the color used to display an active link.
DisabledLinkColor
Property
Specifies the color used to display a disabled link.
Links
Property
Gets the collection of Link objects in the LinkLabel.
The Link class contains information about the hyperlink. Its LinkData property allows you to associate a
URL with the hyperlink.
LinkArea
Property
Specifies which portion of text in the LinkLabel is
treated as part of the link.
LinkBehavior
Property
Specifies how the link will appear when the mouse
pointer is placed over it.
LinkClicked
Event
The default event. It is generated when the link is
clicked. Inside its event handler, the
LinkLabelLinkClickedEventArgs parameter provides
you with data for the event.
LinkColor
Property
Specifies the color used to display a link.
VisitedLinkColor
Property
Specifies the color used to display a previously visited link.
TextBox and RichTextBox
The TextBox and RichTextBox classes both derive from the TextBoxBase
class. They allow single or multiline user input, including masked input such
as that used in a password input field, where each input character is displayed
simply as the masking character—typically the asterisk (*). The RichTextBox
includes the capability to display formatted text using the Rich Text Format
(RTF). Table 2.5 details the important members of the TextBox class, while
Table 2.6 details those of the RichTextBox class.
Table 2.5 Important Members of the TextBox Class
Member
Type
Description
AcceptsReturn
Property
Consists of a Boolean value (true/false), where true
indicates that pressing the Enter key in a multiline
textbox inserts a new line.
CharacterCasing
Property
Controls the case of characters as they are entered
(Lower, Normal, or Upper). The default value is
Normal, which does not modify the case of entered
characters.
(continued)
41
42
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 2.5 Important Members of the TextBox Class (continued)
Member
Type
Description
MultiLine
Property
Specifies whether the TextBox can accept multiple
lines of input. The default value is false.
PasswordChar
Property
Used to display input characters with the specified
mask character. Typically used to protect the display of
sensitive information such as a password. The setting
is null by default; if this value is not set, characters are
displayed normally.
ReadOnly
Property
Determines whether the displayed text is read-only.
The control’s text cannot be edited. The default value
is false.
ScrollBars
Property
Specifies which scrollbars (none, horizontal, vertical,
or both) should appear in a multiline textbox.
Text
Property
Specifies the text contained in the textbox.
TextChanged
Event
The default event. Occurs when the value of the control’s Text property changes.
WordWrap
Property
Specifies whether text in a multiline control can automatically wrap words to the next line. The default
value is true.
Table 2.6 Important Members of the RichTextBox Class
Member
Type
Description
DetectUrls
Property
Specifies whether the control automatically detects and
formats URLs.
Rtf
Property
Specifies the text of the RichTextBox control, including
all RTF codes.
SelectionColor
Property
Sets the color of the currently selected text.
SelectionFont
Property
Sets the font of the currently selected text.
SelectedRtf
Property
Specifies the currently selected RTF text.
TextChanged
Event
The default event. Occurs when the value of the control’s Text property changes.
WordWrap
Property
Specifies whether the control can automatically wrap
words to the next line, if required.
ZoomFactor
Property
Gives the current zoom level.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
PictureBox
The PictureBox control can display graphical images from many sources,
including icon (.ICO), bitmap (.BMP), metafile (.WMF), JPEG/JPG, PNG,
and GIF files. Table 2.7 details the important members of the PictureBox
class.
Table 2.7 Important Members of the PictureBox Class
Member
Type
Description
Click
Event
The default event. Occurs when the control is clicked.
Image
Property
Is the displayed image.
SizeMode
Property
Specifies how the image is displayed. Holds one of the
PictureBoxSizeMode enumeration values—AutoSize (autosized
to the image size), CenterImage (displayed in the center of the
control), Normal (placed in the upper-left corner of the control), or StretchImage (stretched or reduced to fill the control).
Button, RadioButton, and CheckBox
When you need to obtain selection information from users, the Button,
RadioButton, and CheckBox controls can be used. These derive from the
ButtonBase control. The Button control is used to initiate actions when
clicked, while the RadioButton and CheckBox controls are used to select an
on or off state (that is, selected or not selected, and checked or unchecked).
A CheckBox control can be two-state (on/off) or three-state (on/off/indeterminate),
depending on the value of the ThreeState property.
A group of CheckBox controls can be used to allow selection of several states,
while a group of RadioButtons can be used to allow selection of one of the
options listed. If you want to place two groups of RadioButton controls on a
form and have each group allow one selection, you need to place them in different container controls, such as GroupBox or Panel controls, rather than
placing them directly on the form.
Table 2.8 details the important members of the Button class. Table 2.9 details
those of the RadioButton class, and Table 2.10 details those of the CheckBox
class.
43
44
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 2.8 Important Members of the Button Class
Member
Type
Description
Image
Property
Image displayed on the button.
Text
Property
Text displayed on the button.
Click
Event
The default event. Fires when the Button control is
clicked.
Table 2.9 Important Members of the RadioButton Class
Member
Type
Description
Checked
Property
Indicates whether the RadioButton is checked (true if
checked, false otherwise).
CheckedChanged Event
Default event of RadioButton. Fires every time this control is checked or unchecked.
Text
Shows text displayed along with the RadioButton.
Property
Table 2.10 Important Members of the CheckBox Class
Member
Member
Description
Checked
Property
Is true if the CheckBox is checked; otherwise, is false.
CheckedChanged Event
Default event for the CheckBox control. Fires every time
a CheckBox is checked or unchecked.
CheckState
Property
Gives the state of the CheckBox: Checked, Unchecked,
or Indeterminate.
ThreeState
Property
Determines whether the CheckBox allows three states. If
set to false, the CheckState can be set only to
Indeterminate state through code but not through the
user interface.
Text
Property
Shows text displayed adjacent to the CheckBox control.
AutoCheck Property—When this value is set to true (the default) on a CheckBox or
RadioButton control, the control will change its Checked and CheckState values as
well as the appearance of the control automatically. You can set the AutoCheck
property to false and then write code in the Click event handler to have these controls behave in a different manner.
ListBox and CheckedListBox
The ListBox and CheckedListBox controls both derive from the ListControl
class and allow selection of values from a predetermined list of options. The
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
ListBox can be configured to allow only a single selection or multiple selections from the displayed values, while the CheckedListBox control includes
integrated CheckBox controls for each item and cannot be restricted to allow
only a single value. Table 2.11 details the important members of the ListBox
class, while Table 2.12 details those of the CheckedListBox class.
Table 2.11 Important Members of the ListBox Class
Member
Type
Description
ColumnWidth
Property
Specifies column width in a multicolumn
ListBox.
ItemHeight
Property
Specifies the height of an item in the ListBox.
Items
Property
Specifies a collection of objects representing
the list of items in the ListBox.
FindString
Method
Finds the first item in the ListBox that starts
with the specified string.
FindStringExact
Method
Finds the first item in the ListBox that exactly
matches the specified string.
MultiColumn
Property
Determines whether the ListBox supports multiple columns.
SelectedIndex
Property
Gives the index of the currently selected item.
SelectedIndexChanged
Event
The default event. Occurs when the
SelectedIndex property changes.
SelectedIndices
Property
Specifies a collection of indices of currently
selected items.
SelectedItem
Property
Shows the currently selected item.
SelectedItems
Property
Specifies a collection of currently selected
items.
SelectionMode
Property
Specifies the number of items that can be
selected. The values are specified by the
SelectionMode enumeration. They can be
MultiSimple (allows multiple selections),
MultiExtended (allows multiple selections with
the help of the Ctrl, Shift, and arrow keys),
None (allows no selections—can be used to
just display data), and One (allows single selection).
Sorted
Property
Specifies whether the items are sorted alphabetically.
45
46
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 2.12 Important Members of the CheckedListBox Class
Member
Type
Description
CheckedIndices
Property
Is a collection of indices of currently checked items.
CheckedItems
Property
Is a collection of currently checked items.
ItemCheck
Event
Occurs when an item is checked or unchecked.
SelectionMode
Property
Indicates the number of items that can be checked.
The values are specified by the SelectionMode enumeration. They can be only None (no selections) or
One (allows multiple selections).
Figure 2.6 shows the use of a CheckBox control and a ListBox control to
provide selectable lists of values.
Figure 2.6 CheckBox and ListBox controls are used on the same form to display list-selection
options.
The SelectedIndex property in the ListBox, CheckedListBox, and
ComboBox controls returns a zero-based index of the currently
selected item, but if no item is selected in these controls, it returns
–1.
ComboBox
The ComboBox control is also derived from the ListControl class and is
used to allow selection of one value from a specified list or allow you to enter
a new value. It combines a scrollable list of values with a text entry area that
can be used to modify the selected value or to input a new value not already
in the list if the control has been configured to allow this. Table 2.13 details
the important members of the ComboBox class.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
Table 2.13 Important Members of the ComboBox Class
Member
Type
Description
DrawMode
Property
Specifies how the ComboBox items are drawn.
The value Normal specifies that the list of items is
drawn by the system. The other two values specify that elements are drawn by your own program
(preferably using the DrawItem event handler).
OwnerDrawFixed specifies that elements will all
be of the same size, while OwnerDrawVariable
specifies a variable size.
DropDownStyle
Property
Specifies the style of the combo box. The style
can be set to one of the values of the
ComboBoxStyle enumeration: DropDown (default
style—you click the arrow button to display
items, and the text portion is editable),
DropDownList (you click the arrow button to display items, but the text portion is not editable),
and Simple (no arrow button—the list and text
portions are always visible and text is editable).
DropDownWidth
Property
Specifies the width of the drop-down list portion
of the combo box.
Items
Property
Is a collection of items in the control.
MaxDropDownItems
Property
Specifies the maximum number of items the
drop-down list portion can display at a time. If
the number of items is more than specified by
this property, a scrollbar appears.
MaxLength
Property
Specifies the maximum length of text allowed in
the editable portion.
SelectedIndex
Property
Gives the index of the currently selected item.
SelectedIndexChanged
Event
The default event. Occurs when the selected index
property changes.
SelectedItem
Property
Shows the currently selected item.
SelectedText
Property
Shows the currently selected text in the editable
portion.
Sorted
Property
Specifies whether the items are sorted alphabetically.
DomainUpDown and NumericUpDown
The DomainUpDown and NumericUpDown controls inherit from the
System.Windows.Forms.UpDownBase class and allow selection of values
47
48
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
from an ordered list of values using the up and down buttons of the controls.
If the ReadOnly value is false (the default value), values can be directly
entered in the controls as well. The DomainUpDown control allows selection from a list of objects, with the result being returned as a string to the
control; the NumericUpDown control contains a numeric value that can be
adjusted between the Minimum and Maximum values by an amount specified by the Increment property. Table 2.14 details the important members of
the DomainUpDown class, while Table 2.15 details those of the
NumericUpDown class.
Table 2.14 Important Members of the DomainUpDown Class
Member
Type
Description
Items
Property
Is the collection of objects assigned to the control.
ReadOnly
Property
Specifies whether you can enter a value directly in
the control.
SelectedIndex
Property
Gives the index value of the currently selected
item.
SelectedItem
Property
Gives the selected value based on the selected
index.
SelectedItemChanged
Event
The default event. Occurs when the SelectedIndex
property is changed.
Sorted
Property
Determines whether the Items collection is sorted.
Wrap
Property
Specifies whether the SelectedIndex property
wraps to the first or the last item if the user continues past the end of the list.
Table 2.15 Important Members of the NumericUpDown Class
Member
Type
Description
Increment
Property
Value of the increment used to decrease or
increase the value when a button is clicked.
Maximum
Property
Maximum allowed value.
Minimum
Property
Minimum allowed value.
ReadOnly
Property
Specifies whether you can change the value
directly.
ThousandsSeparator
Property
Specifies whether a thousands separator should
be used when appropriate.
Value
Property
Value assigned to the control.
ValueChanged
Event
The default event. This event occurs when the
Value property is changed.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
MonthCalendar and DateTimePicker
The MonthCalendar and DateTimePicker controls allow the selection of
date and time values. The MonthCalendar control includes an easily navigable user interface to select a date or a range of dates, while the
DateTimePicker control allows the selection of date and time values using
different formats. Figure 2.7 provides an example of the use of the
MonthCalendar and DateTimePicker controls.
Figure 2.7 MonthCalendar and DateTimePicker controls displaying selected values.
Table 2.16 details the important members of the MonthCalendar class, while
Table 2.17 details those of the DateTimePicker class.
Table 2.16 Important Members of the MonthCalendar Class
Member
Type
Description
CalendarDimensions
Property
Number of columns and rows of months displayed.
DateChanged
Event
The default event. This event occurs when the
date selected in the control changes.
DateSelected
Event
Event that occurs when a date is selected in the
control.
FirstDayOfWeek
Property
The first day of week displayed by the calendar.
MaxDate
Property
Maximum allowable date to be selected.
MaxSelectionCount
Property
Maximum number of days that can be selected.
MinDate
Property
Minimum allowable date to be selected.
SelectionEnd
Property
End date of the selected range.
SelectionRange
Property
Selected range of dates.
SelectionStart
Property
Start date of the selected range.
(continued)
49
50
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 2.16 Important Members of the MonthCalendar Class (continued)
Member
Type
Description
ShowToday
Property
Whether today’s date should be displayed at the
bottom of the control.
ShowTodayCircle
Property
Whether today’s date should be circled.
ShowWeekNumbers
Property
Whether the week numbers (1–52) should be
displayed at the beginning of each row of days.
TodayDate
Property
Represents today’s date.
Table 2.17 Important Members of the DateTimePicker Class
Member
Type
Description
CustomFormat
Property
Represents a custom date and time format string.
Format
Property
Specifies the format of the date and time displayed in
the control. The values are specified by the
DateTimePickerFormat enumeration—Custom, Long
(the default), Short, and Time. Long, Short, and Time
display the date in the value formats set by the operating system. Custom lets you specify your own custom
format.
FormatChanged
Event
Occurs when the Format property changes.
MaxDate
Property
Gives the maximum allowable date and time to be
selected.
MinDate
Property
Gives the minimum allowable date and time to be
selected.
ShowCheckBox
Property
Specifies whether a check box should be displayed at
the left of the selected date.
ShowUpDown
Property
Specifies whether an up-down control should be displayed to allow user selections rather than the default
calendar control.
Value
Property
Gives the value of the date and time selected.
ValueChanged
Event
The default event. Occurs when the value changes.
TreeView and ListView
The TreeView and ListView controls allow the display of hierarchical collections of nodes. Within the TreeView control, nodes are represented by
TreeNode objects, each of which has its own collection of child nodes. The
ListView control includes a list of items, each of which can have a name,
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
icon, and additional columns of associated text. Figure 2.8 provides an example of the use of the TreeView and ListView controls.
Figure 2.8 TreeView and ListView controls used to display a simple folder hierarchy and objects
contained within the selected folder.
Table 2.18 details the important members of the TreeView class, and Table
2.19 details those of the ListView class.
Table 2.18 Important Members of the TreeView Class
Member
Type
Description
AfterCheck
Event
Occurs after a tree node is checked.
AfterCollapse
Event
Occurs after a tree node is collapsed.
AfterExpand
Event
Occurs after a tree node is expanded.
AfterSelect
Event
The default event. Occurs after a tree node is selected.
CheckBoxes
Property
Specifies whether a check box should appear along with
each item in the control.
ImageList
Property
Represents the ImageList that contains node icons.
Nodes
Property
Specifies a collection of TreeNodes in the control.
Scrollable
Property
Specifies whether scrollbars should be displayed when
needed. The default value is true.
SelectedNode
Property
Shows the currently selected node.
Sorted
Property
Specifies whether the tree nodes are sorted.
Table 2.19 Important Members of the ListView Class
Member
Type
Description
Activation
Property
Indicates how an item can be activated—
OneClick (single click), Standard (double click),
and TwoClick (double click and item color change
when the mouse hovers over it). These values
are defined in the ItemActivation enumeration.
(continued)
51
52
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 2.19 Important Members of the ListView Class (continued)
Member
Type
Description
CheckBoxes
Property
Specifies whether a check box should appear
along with each item in the control.
CheckedIndices
Property
Specifies a collection of indices of the currently
checked items.
CheckedItems
Property
Specifies a collection of currently checked items.
ItemActivate
Event
Occurs when an item is activated.
ItemCheck
Event
Occurs when an item’s check state changes.
Items
Property
Specifies a collection of items displayed by the
ListView control.
LargeImageList
Property
Represents the ImageList to be used to display
large icons.
MultiSelect
Property
Specifies whether multiple items can be selected.
Scrollable
Property
Specifies whether scrollbars need to be added
when the list of items exceeds the size of the
client area. Default value is true.
SelectedIndexChanged
Event
The default event. Occurs when the selected
index changes.
SelectedIndices
Property
Specifies a collection of indices of the currently
selected items.
SelectedItems
Property
Specifies a collection of currently selected items.
SmallImageList
Property
Represents the ImageList to be used to display
small icons.
Sorting
Property
Specifies the sort order of items in the control,
from SortOrder enumeration—Ascending,
Descending, or None (default).
View
Property
Represents the way items are displayed. The values are specified by the View enumeration—
Details (items are displayed with multicolumn
information about the item), LargeIcon (default
value—the item appears with a large icon and a
label below it in multicolumns), List (a singlecolumn list with small icons displayed with a
label to the right), and SmallIcon (a small icon
with a label on the right displayed in multicolumns).
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
Timer, TrackBar, and ProgressBar
Several progress-related controls are important to know well. The Timer
control is used when an event needs to occur after a particular interval. This
method is preferred for handling timer requirements within a form, rather
than using the System.Timers.Timer, which fires from another thread and
can cause unpredictable results. Table 2.20 details the important members of
the Timer class.
Table 2.20 Important Members of the Timer Class
Member
Type
Description
Enabled
Property
Indicates whether the timer is currently running
Interval
Property
Gives the time in milliseconds between Tick events of the
timer
Start
Method
Starts the Timer control
Stop
Method
Stops the Timer control
Tick
Event
Occurs when the timer interval elapses and the timer is
enabled
The TrackBar control is used to allow a user to select a value from a range
by sliding the scrollbar along the displayed scale, while the ProgressBar control is used to display progress during a lengthy operation. Figure 2.9 provides an example of the use of the TrackBar and ProgressBar controls.
Figure 2.9 TrackBar and ProgressBar controls display progress and slide-bar selection.
Table 2.21 details the important members of the TrackBar class, while Table
2.22 details those of the ProgressBar class.
53
54
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 2.21 Important Members of TrackBar Class
Member
Type
Description
LargeChange
Property
Specifies the number of units the Value property changes
when the scroll box is moved a large distance.
Maximum
Property
Specifies the upper bound of the TrackBar control’s range.
Minimum
Property
Specifies the lower bound of the TrackBar control’s range.
Orientation
Property
Specifies the orientation of the control (Horizontal or
Vertical).
Scroll
Event
The default event. Occurs when the scroll box is moved by
a keyboard or mouse action.
SmallChange
Property
Specifies the number of units the Value property changes
when the scroll box is moved a small distance.
TickFrequency Property
Specifies the frequency within which scale ticks are drawn
in the control.
TickStyle
Property
Specifies the way in which the control appears. The values
are specified by the TickStyle enumeration—Both,
BottomRight, None, or TopLeft.
Value
Property
The scroll box’s current position in the control.
ValueChanged
Property
Occurs when the Value property changes.
Table 2.22 Important Members of the ProgressBar Class
Member
Type
Description
Maximum
Property
Upper limit of the Value property
Minimum
Property
Lower limit of the Value property
Value
Property
The current position of the control
HScrollBar and VScrollBar
The HScrollBar and VScrollBar controls are members of the ScrollBar class
and are used in combination with other controls, such as the PictureBox control, to provide basic scrolling capability. Table 2.23 details the important
members of the ScrollBar class from which the HScrollBar and VScrollBar
controls inherit.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
Table 2.23 Important Members of ScrollBar Class
Member
Type
Description
LargeChange
Property
Specifies the amount the Value property changes
when the scroll box is moved a large distance.
Maximum
Property
Specifies the upper bound of the Value property.
Minimum
Property
Specifies the lower bound of the Value property.
Scroll
Event
The default event. Occurs when the scroll box is
moved by a keyboard or mouse action.
SmallChange
Property
Specifies the amount the Value property changes
when the scroll box is moved a small distance.
Value
Property
Specifies the current position of the control.
ValueChanged
Event
Occurs when the Value property changes.
TabControl
The TabControl can contain other controls, arranged on tabbed pages. This
control is useful in organizing large numbers of controls within a manageable format. Visual Studio itself relies on a tabbed display format. Table 2.24
details the important members of the TabControl class.
Table 2.24 Important Members of the TabControl Class
Member
Type
Description
Alignment
Property
The area where the tabs will be aligned: Bottom,
Left, Right, or Top (default).
ImageList
Property
The ImageList from which images are displayed
on tabs.
MultiLine
Property
Whether tabs can be displayed in multiple rows.
SelectedIndex
Property
The index of the selected tab page.
SelectedIndexChanged
Event
Default event. This event occurs when the selected index changes.
SelectedTab
Property
The selected tab page.
TabCount
Property
Count of tabs in the control.
TabPages
Property
Collection of tab pages in the control.
55
56
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ToolTip
A ToolTip is a feature that allows an application to provide useful information about a control when the user hovers the cursor over the control. Some
controls, such as StatusBarPanel, ToolBarButton, and TabPage, have a
ToolTipText property. For other controls, you must add a ToolTip component in the container object. For each control, you will find a new property
named ToolTip on ComponentName, where ComponentName is the name of
the ToolTip component that you added to the container previously. Entering
the ToolTip message into this property’s value provides the ToolTip functionality needed for each control.
Dialog Boxes
When an application needs to prompt a user for input, a dialog box is often
used. Several dialog box components are provided within the Windows
Forms library, or you can create a custom dialog box, if necessary.
Common Dialog Boxes
The Windows Forms library provides several ready-made dialog boxes for
Windows applications, including the following:
➤ ColorDialog—Displays a list of colors and returns a property contain-
ing the selected color
➤ FontDialog—Enables the user to select a font and set its properties,
such as size, style, and special effects
➤ OpenFileDialog—Enables the user to browse files and folders on the
computer and select one or more files
➤ PageSetupDialog—Enables the user to select various page-layout
settings
➤ PrintDialog—Enables the user to select various print options and sends
the specified document to the selected printer
➤ PrintPreviewDialog—Enables the user to preview a file before printing
➤ SaveFileDialog—Enables the user to browse the files and folders on the
computer and select a name for a file to be saved
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
These classes are also referred to as Windows Forms dialog components.
You will recognize many of these from your experience with the Windows
operating system and Microsoft products such as the Office suite. The dialog classes are derived from the CommonDialog class, which provides the
basic functionality for displaying a dialog box.
The dialog classes each provide a method named ShowDialog that presents
the dialog box. Each of the dialog classes has a set of properties that stores
the data relevant to its particular type.
Modal and Modeless Dialog Boxes
When a modal dialog box is open, the application can only receive input for
the modal dialog box, and the code that called the box remains suspended. If
a user wants to work with other windows in the application, the modal dialog box first must be closed. By contrast, a modeless dialog box allows the
application to receive input for other windows while the dialog box remains
open.
When using the ShowDialog method of the Form class, a modal dialog box is displayed. If you would like to display a modeless dialog box, use the Show method
instead.
Menus
To provide functionality within your application that spans a broader scope
than a single control within the form, Visual Studio .NET includes the capability to specify several types of menu and display status bars and toolbars.
Creating Menus and Menu Items
Menus are used to group commonly available and less used functions into a
user-friendly format. The MainMenu, ContextMenu, and MenuItem classes
are all derived from the Menu class. There can be only a single MainMenu
for a Windows form. A ContextMenu can be associated with each control, if
desired, to provide commands or information related to the control. Table
2.25 details the important members of the MenuItem class.
57
58
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 2.25 Important Members of the MenuItem Class
Member
Type
Description
Checked
Property
Specifies whether a checkmark or radio button should
appear near the MenuItem.
Click
Event
Fired when the user clicks on the MenuItem.
DrawItem
Event
Occurs when a request is made to draw an owner-drawn
menu item. DrawItem occurs only when the OwnerDraw
property is true.
Enabled
Property
Specifies whether the MenuItem is enabled.
MenuItems
Property
Gives the collection of MenuItem objects associated with a
menu. This property can be used to create hierarchical submenus.
OwnerDraw
Property
Specifies whether you can provide custom code to draw a
MenuItem instead of allowing Windows to handle it in a
standard way.
Parent
Property
The parent menu with which the menu item is associated.
You must specify a parent for a MenuItem object; otherwise, it is not displayed.
PerformClick
Method
Fires the Click event for the MenuItem as if the user
clicked it.
Popup
Event
Occurs just before displaying a submenu corresponding to
this MenuItem. This event handler is generally used to add,
remove, enable, disable, check, or uncheck menu items
depending on the state of an application when they are displayed.
RadioCheck
Property
Specifies whether the MenuItem should display a radio button instead of a check mark when its Checked property is
set to true.
Select
Event
Fired when the user selects a MenuItem by navigating to it.
Shortcut
Property
Represents the shortcut key combination associated with
this MenuItem.
Text
Property
Specifies the caption of the MenuItem.
StatusBar
The StatusBar control is typically used to display information such as a
message to the user or application status messages. You might be familiar
with the Windows taskbar, which is similar to a StatusBar for your operating
system. By convention, StatusBar controls are typically docked along the
bottom edge of a form and are used to provide information and feedback
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
useful to the user. If you set the Z-order of the StatusBar control to Send to
Back, the control will not overlap other controls at the bottom of the form.
One of the most important properties of a StatusBar is the Panels property,
which is a collection of StatusBarPanel objects that can be used to divide the
StatusBar into multiple functional areas. For example, one might display the
current editing status while another displays the date and time. Table 2.26
details the important members of the StatusBarPanel class.
Table 2.26 Important Members of the StatusBarPanel Class
Member
Type
Description
Alignment
Property
Specifies the alignment of the text and icon within the panel:
Center, Left, or Right.
AutoSize
Property
Specifies how the panel will size itself. Values are None,
Contents, and Spring from the StatusBarPanelAutosize enumeration.
BorderStyle
Property
Specifies the border style to be used: None, Raised, or
Sunken.
Icon
Property
Displayed in the StatusBar, always to the left of the text.
Style
Property
Specifies whether the StatusBarPanel object is OwnerDraw or
Text (System-drawn). The OwnerDraw style can be used to
give custom rendering to a StatusBarPanel object.
ToolTipText
Property
Specifies the ToolTip.
ToolBar
The ToolBar control is usually docked at the top of a form just below its
menu bar. Each ToolBar control is typically used to group tools of a similar
function together, such as text-editing and formatting tools or image-editing
tools. If you use Microsoft’s Office suite of products, you are likely very
familiar with ToolBar controls. If you set the Z-order of the ToolBar control
to Send to Back, the control will not block other controls at the top of the
form. Table 2.27 details the important members of the StatusBarPanel class.
Table 2.27 Important Members of the ToolBar Class
Member
Type
Description
Buttons
Property
Is a collection of ToolBarButton objects. Each
ToolbarButton represents a button on the ToolBar object.
ButtonClick
Event
Fires when a ToolBarButton is clicked.
(continued)
59
60
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 2.27 Important Members of the ToolBar Class (continued)
Member
Type
Description
ImageList
Property
Stores icons that will be displayed on ToolBarButton
objects.
SendToBack
Method
Sends the toolbar to the back of the Z-order.
ShowToolTips
Property
Specifies whether the toolbar should show ToolTips.
Single- and Multiple-Document
Interface Applications
Small applications might well reside within a single window, but as applications become larger and more robust, you might find it necessary to create a
Multiple-Document Interface (MDI) application capable of opening several
windows at once. The main application window of an MDI application is
referred to as the parent window; it is able to open several child windows.
Windows Forms in an MDI application are created using the
System.Windows.Forms.Form class. You need to know the following main
points about an MDI application:
➤ The child windows are limited to their parent window. You cannot move
child windows outside the main application window.
➤ The parent window can open several types of child windows.
➤ Child windows can be opened, closed, maximized, or minimized inde-
pendently of each other. When the parent window is closed, the child
windows are automatically closed.
➤ The MDI frame should have a menu. One common menu in an MDI
application is the Window menu, which allows a user to manipulate windows opened in the MDI container (parent) form.
To create an MDI parent form, create a Windows Form and change its
IsMdiContainer property to true. To create an MDI parent form, you create
a regular Windows form and change its IsMdiContainer property to true. To
create an MDI child form, you create a regular Windows form and programmatically assign the name of the parent MDI object to the MdiParent
property. Table 2.28 summarizes the important members of the Form class
related to the MDI forms.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
Table 2.28 Important Members of the Form Class Related to MDI Applications
Member
Type
Description
ActiveMdiChild
Property
The currently active MDI child window
IsMdiContainer
Property
Specifies whether the form is a container for MDI child
forms
MdiChildActivate
Event
Fires when an MDI child form is activated or closed
within an MDI application
MdiChildren
Property
An array of forms representing the MDI child form of
the parent form
MdiParent
Property
Specifies the MDI parent form for the current form
LayoutMdi
Method
Arranges the MDI child forms within an MDI parent
Adding Controls to Forms
Within the Visual Studio .NET Forms Designer, controls can be placed on
the surface of any container object, such as Windows Forms, or controls such
as Panel, GroupBox, or TabControl. You also can add controls to a form programmatically.
When creating controls programmatically, you must remember to associate them
with a parent container control. If you don’t do this, controls will be created but not
displayed.
Adding Controls with the Windows Forms
Designer
Within the Forms Designer interface, you can drag and drop controls from
the toolbox or using the View menu. Figure 2.10 shows this toolbox.
From the toolbox, there are three different ways to add controls to a container object:
➤ Adding controls to forms: method 1—In the first method, you can
select a control from the toolbox and draw it on the container surface by
following these steps:
1. Select a control by clicking the control’s icon in the Toolbox win-
dow (see Figure 2.10).
61
62
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Figure 2.10 Controls toolbox.
2. Release the mouse button and move the mouse pointer to the posi-
tion on the container where you want to draw the control.
3. Hold down the mouse button and draw a rectangle on the contain-
er surface to indicate the size and position for the control instance.
➤ Adding controls to forms: method 2—With the second method, you
drag the control directly from the toolbox to the desired location on the
form. Follow these steps:
1. Select a form or other container control in which you want to add
a control.
2. Drag the control’s icon from the toolbox and drop it at the desired
location on the container control. The control is added with its
default size.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
➤ Adding controls to forms: method 3—With the third method, you
can add the control to the form by double-clicking in the Toolbox.
Follow these steps:
1. Select a form or other container control in which you want to add
a control.
2. Double-click the control’s icon in the toolbox. This adds the con-
trol to the top-left corner of the form or other container control in
its default size. You can later use the mouse or properties of the
control to modify its position and size.
Adding Controls Programmatically
You can add controls to a container object programmatically. When doing
so, you should remember to add code to take care of three things:
1. Create a private variable to represent each of the controls you want to
place on form.
2. In the form’s constructor, place code to instantiate each control and to
customize each by using its properties, methods, or events.
3. Add each control to the form’s control collection.
When creating controls programmatically, you should also specify the location and size of the controls numerically. You can add a control to a Windows
Form programmatically by following these steps:
1. Add a new Windows Form to your C# project.
2. Switch to Code view and add the following variables just above the
form’s constructor code:
//create variables to hold controls
private Label lblName, lblPassword;
private TextBox txtName, txtPassword;
private Button btnLogin;
3. Add the following code to the form’s constructor:
//specify the form’s size
this.ClientSize = new System.Drawing.Size(272, 182);
//set up the label for prompting Name
lblName = new Label();
lblName.Text = “Name: “;
//Specify the location for proper placement
63
64
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
//the default location will be (0, 0) otherwise
lblName.Location = new Point(16, 16);
//set up label for prompting Password
lblPassword = new Label();
lblPassword.Text = “Password: “;
lblPassword.Location = new Point(16, 80);
//setup a text box that allows user to enter Name
txtName = new TextBox();
txtName.Location = new Point(152, 16);
//setup text box for entering password
txtPassword = new TextBox();
txtPassword.Location = new Point(152, 80);
txtPassword.PasswordChar = ‘*’;
//set up a command button
btnLogin = new Button();
btnLogin.Text = “Login”;
btnLogin.Location = new Point(96, 128);
//Add control to the form
//Method 1: Specify the current form as parent container for a control
lblName.Parent = this;
//Method 2: Add a control to form’s control collection
this.Controls.Add(txtName);
//Method 3: Add an array of controls to form’s control collection
this.Controls.AddRange(new Control[] {lblPassword, txtPassword,
btnLogin});
4. Insert the Main method to launch this form and set the form as the
startup object for the project.
5. Run the project. The form is displayed as shown in Figure 2.11.
Figure 2.11 A form with controls loaded programmatically.
The examples in this section add controls to a Windows Form, but the same
concepts will work with any of the container controls. A container control
has a property named Controls, which is a collection of Control objects that
the container control contains. When you add or remove a control to a container, it is added to or removed from the container’s Controls collection.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
Practice Questions
Question 1
Which of the following are container controls? (Choose all correct answers.)
❑ A. Windows Form
❑ B. Label
❑ C. Panel
❑ D. RadioButton
❑ E. GroupBox
Answers A, C, and E are correct. The Windows Form is itself both a container and a control, as are the Panel and GroupBox controls. Answer B is
incorrect because the Label control is a read-only control used to display
text. Answer D is incorrect because a RadioButton control is a check box–like
control used to allow a user to select only one of several items.
Question 2
You want to prevent a TextBox control from receiving the focus through user
tabbing and to not accept changes to its stored value if a user clicks it. What
action or actions should you take to complete this task using the least amount
of effort? (Choose all correct answers.)
❑ A. Change the TextBox’s Z-order using Send to Back.
❑ B. Set the TextBox’s Enabled value to false.
❑ C. Set the TextBox’s TabIndex value to 1.
❑ D. Set the TextBox’s TabStop value to false.
❑ E. Set the TextBox’s Visible value to false.
Answer B is correct. By setting the control’s Enabled value to false, it will be
grayed out, will not receive the focus, and cannot be changed by the user.
This single action is the simplest solution to the requirement. Answer A is
incorrect because the Z-order will not affect its ability to be selected through
tabbing or direct clicking. Answer C is incorrect because setting the
TabIndex to any value simply affects the order in which it receives the focus.
Answers D and E are potentially correct because setting the TabStop to false
prevents it receiving focus through tabbing; if the Visible value is set to false,
it will not be directly accessible to the user. However, this solution is not the
simplest and thus is incorrect.
65
66
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 3
You are using a CheckedListBox control in one of the Windows forms of an
application. You want to allow the user to select multiple items from the
CheckedListBox control. What value of the SelectionMode property would you
choose?
❍ A. SelectionMode.None
❍ B. SelectionMode.One
❍ C. SelectionMode.MultiSimple
❍ D. SelectionMode.MultiExtended
Answer B is correct. The CheckedListBox control supports only two values
for the SelectionMode property: SelectionMode.None, which does not allow
any selection, and SelectionMode.One, which allows multiple selections. If
the other two selection modes are set through the Properties window, the
IDE generates an error message; if the modes are set programmatically, an
ArgumentException error is raised.
Question 4
You want to use a container control that allows scrolling around a large area.
Which of the following controls is best suited to this? (Select one from the following.)
❍ A. StatusBar
❍ B. Label
❍ C. Panel
❍ D. RadioButton
❍ E. GroupBox
Answer C is correct. The Panel control is a container control used for grouping other controls, which includes scrollable bars to allow navigation over a
large control area. Answers A, B, and D are incorrect because they are not
container controls. Answer E is incorrect because the GroupBox control has
a caption but is not scrollable to navigate a larger control area.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
Question 5
Which of the following image types are supported by the PictureBox control?
(Choose all correct answers.)
❑ A. ICO
❑ B. BMP
❑ C. WMF
❑ D. JPEG
❑ E. PNG
❑ F. GIF
Answers A, B, C, D, E, and F are all correct. The PictureBox control can be
used to display graphic images of the icon (ICO), bitmap (BMP), metafile
(WMF), JPEG, PNG, and GIF image formats.
Question 6
You want to create a form that will display the objects located within a folder
when a button is clicked to populate the listing control. Which control is best
suited to this type of display? (Select one of the following.)
❍ A. GroupBox
❍ B. ListBox
❍ C. ComboBox
❍ D. TreeView
❍ E. ListView
Answer E is correct. The ListView control is best suited to the display of a
list of objects such as the contents of a folder. Answer A is incorrect because
the GroupBox is better suited as a container object holding other controls.
Answers B and C are more suited to displaying a list of values than displaying a folder’s contents. Answer D is incorrect because the hierarchical capability of the TreeView control is unnecessary here.
67
68
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 7
You are designing a menu that has some mutually exclusive options. You have
set the RadioCheck properties of all the menu items to true and their OwnerDraw
properties to false. Still, you are able to check multiple items from the menu
when you run the program. Which of the following events would you program
to set mutual exclusion among menu items?
❍ A. Click
❍ B. Select
❍ C. Popup
❍ D. DrawItem
Answer C is correct. The Popup event occurs just before a menu’s list of
items is displayed. You can use this event to check or uncheck menu items.
Remember that setting the RadioCheck property to true does not implicitly
set mutual exclusion for menu items; you still can check several of them
together. So, the Popup event is the right place to check the appropriate item
and uncheck all others.
Question 8
You have decided to utilize a Dialog Box to allow a user to view print settings.
Which of the following types of Dialog Box is best suited to this? (Select one of
the following.)
❍ A. ColorDialog
❍ B. PageSetupDialog
❍ C. PrintDialog
❍ D. PrintPreviewDialog
❍ E. PrintSettingsDialog
Answer C is correct. The PrintDialog box is used to select various print
options and send a document to a printer. Answer A is incorrect because the
ColorDialog box is used to select and return a particular color value. Answer
B is incorrect because the PageSetupDialog box is used to select page layout
settings. Answer D is incorrect because the specification is for viewing the
print settings rather than a print preview of the document. Answer E is
incorrect because there is no standard dialog box of the PrintSettingsDialog
type.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controls
. . . . . on
. .Forms
. . .
Question 9
Which of the following overlapping controls would be shown on top of the others? (Select one of the following.)
❍ A. Control1, z-index 25
❍ B. Control2, z-index 5
❍ C. Control3, z-index 15
❍ D. Control4, z-index 50
❍ E. Control5, z-index 99
Answer B is correct. The lowest z-index value specifies the control that will
be on top when multiple controls overlap. Answers A, C, D, and E are incorrect because they all specify z-axis values that are higher and thus will be layered below Control2.
Question 10
Which of the following control types can support a tristate value? (Choose all
correct answers.)
❑ A. Button
❑ B. RadioButton
❑ C. CheckBox
❑ D. ListBox
❑ E. CheckedListBox
❑ F. ComboBox
Answer C is correct. Only the CheckBox control is intended to include a
three-state value (checked, unchecked, or indeterminate). Answer A is incorrect because the Button control is used to enact an action when selected.
Answer B is incorrect because a RadioButton control is used to select only
one of several values, but it is not limited to only three. Answers D and E are
incorrect because the ListBox and CheckedListBox controls are used to
select multiple values from a list. Answer F is incorrect because the
ComboBox control is used to select one value from a list of options or to
input a new value.
69
70
Chapter
. . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Need to Know More?
Amit Kalani. MCAD/MCSD Training Guide: Developing and
Implementing Windows-Based Applications with Microsoft Visual C#
.NET and Microsoft Visual Studio .NET, Exam 70-316. Que
Certification, 2003.
Charles Petzold. Programming Windows with C#. Microsoft Press,
2001.
Windows Forms Community site: www.windowsforms.net.
3
Handling Exceptions
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terms you’ll need to understand:
✓ Exception
✓ try block
✓ catch block
✓ finally block
✓ throw statement
✓ Validation
✓ Validating event
✓ ErrorProvider component
Techniques you’ll need to master:
✓ Know the default application behavior that occurs when an
unhandled exception is encountered.
✓ Understand the use of try, catch, and finally code blocks.
✓ Understand the different techniques of user input validation.
72
Chapter
. . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
This chapter discusses exceptions, which appear as an outcome of unexpected problems during the normal execution of a program. The chapter focuses on how to handle such exceptional situations with the help of try, catch,
and finally blocks. You will also learn how to handle unhandled exceptions at
the level of application domain.
We also discuss the different user input validation techniques and cover how
to use the ErrorProvider component to display error messages.
Understanding Exceptions
When an application encounters an unexpected situation such as a missing
file or input parameter, or a logical error such as performing a division by
zero, the application generates exceptions. By default, when an exception is
generated, the application terminates and generates an error display such as
the one shown in Figure 3.1.
Figure 3.1 This is an example error message, caused when an application commits a logical error,
such as attempting to divide by zero.
Unhandled exceptions in an application can result in unexpected termination
and lost data, and potentially even can create security holes if input values are
not properly restricted. Visual C# .NET helps you fire and handle exceptions
with the help of try, catch, finally, and throw statements. The Framework
Class Library (FCL) includes a large set of exception classes for dealing with
various unforeseen conditions in the normal execution environment.
The .NET Framework provides two exception classes that derive from the
common Exception class:
➤ ApplicationException—Exceptions thrown by the application
➤ SystemException—Exceptions thrown by the CLR
Both of these child exception classes enjoy the same properties and are differentiated only in the source of the exception they represent. Table 3.1
details some of the important properties of the Exception class, inherited by
the exception classes.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Handling
. . . . . Exceptions
. . . . . .
Table 3.1 Important Properties of the Exception Class
Property
Description
HelpLink
The URL for a help file associated with the current exception.
InnerException
An exception associated with the current exception. This is helpful
when a series of exceptions are involved. Each new exception can
preserve the information about the previous exception by storing it
in this property.
Message
A message explaining the error and possibly offering ways to
resolve it.
Source
The name of the application that caused the error.
StackTrace
Retrieves the current stack trace information. You can use this information to locate where an error has occurred. If debugging information is available, the stack trace includes the source file and program
line number.
TargetSite
The method that threw the exception.
Handling Exceptions
One of the most fundamental and often most complex tasks of a developer is
to design exception-handling procedures to allow an application to recover
gracefully from an unexpected or disallowed condition.
The .NET Framework allows exception handling to be performed across
languages, across multiple computers, and even across the Component
Object Model (COM) and other legacy solutions. Within C#, the most common methods of exception handling involve the try, catch, and finally blocks,
in addition to the throw statement.
try, catch, and finally blocks must be consecutive within code. You cannot have any
intervening code separating these blocks when configuring event-handling solutions within your code.
try Block
When processing code that might generate an exception, the code can be
placed within a try block, which, in turn, must be followed by one or more
catch blocks or a finally block. Exceptions raised cause the CLR to search for
the nearest try block (which can be nested within one another) and then pass
control to the following catch block, or on to the finally block if no catch
block is present in the code.
73
74
Chapter
. . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A try block in its most basic form looks like this:
try
{
//code that may cause exception
}
Any normal code can be placed within the try block, including another try
block or calls to methods that include try blocks of their own. When an
exception occurs, the CLR finds the nearest try block and passes control to
the following associated exception-handling blocks.
A try block must be followed by one or more catch blocks or by a finally block.
catch Blocks
After an exception is encountered within a try block, control is passed to the
following catch blocks or to the finally block. catch blocks are evaluated in
order until a match to the exception type is made. The catch blocks should
be arranged in order from specific to more general types of the exception.
For
example,
a
DivideByZeroException
might
match
a
DivideByZeroException, ArithmeticException, SystemException, or
Exception catch block. In the case of multiple catch blocks, only the first
matching catch block is executed. All other catch blocks are ignored. If no
matching catch block can be found, the exception is passed back to the code
that raised the exception and is considered an unhandled exception. This is
discussed in greater detail later in this chapter.
The default behavior for an unhandled exception is to cause the program to terminate
with an error message.
Listing 3.1 shows an example of a try-catch block in use.
Listing 3.1 try-catch Block in Use
private void btnCalculate_Click(object sender, System.EventArgs e)
{
//put all the code that may require graceful error recovery
//in a try block
try
{
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Handling
. . . . . Exceptions
. . . . . .
Listing 3.1 try-catch Block in Use (continued)
decimal decMiles = Convert.ToDecimal(txtMiles.Text);
decimal decGallons = Convert.ToDecimal(txtGallons.Text);
decimal decEfficiency = decMiles/decGallons;
txtEfficiency.Text = String.Format(“{0:n}”, decEfficiency);
}
// try block should at least have one catch or a finally block
// catch block should be in arranged in order of specific to
// the generalized exceptions;
// otherwise, compiler generates an error
catch (FormatException fe)
{
string msg = String.Format(
“Message: {0}\n Stack Trace:\n {1}”,
fe.Message, fe.StackTrace);
MessageBox.Show(msg, fe.GetType().ToString());
}
catch (DivideByZeroException dbze)
{
string msg = String.Format(“Message: {0}\n Stack Trace:\n {1}”,
dbze.Message, dbze.StackTrace);
MessageBox.Show(msg, dbze.GetType().ToString());
}
//catches all CLS-compliant exceptions
catch(Exception ex)
{
string msg = String.Format(“Message: {0}\n Stack Trace:\n {1}”,
ex.Message, ex.StackTrace);
MessageBox.Show(msg, ex.GetType().ToString());
}
//catches all other exception including the
//NON-CLS compliant exceptions
catch
{
//just rethrow the exception to the caller
throw;
}
}
Here, an exception raised within the code is thrown to the catch blocks to see
if a match is made. When this code is compiled and run, an input zero value
will be caught by the second catch block that catches exceptions of type
DivideByZeroException, a non-numeric value will be caught by the first
catch block that catches exceptions of type FormatException, or a very large
numeric value will be caught by the third catch block that catches exceptions
of type Exception from which the OverflowException derives. All languages
that follow the Common Language Specification (CLS) generate an exception type that derives from System.Exception. Therefore, the catch block
that catches exceptions of type Exception will be capable of catching all the
exceptions generated by CLS-compliant languages.
The final catch block in the code example is included to handle exceptions
generated by non–CLS-compliant languages. An unspecified catch block is
the most general form of catch possible and should always be the last catch
75
76
Chapter
. . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
block if multiple catch blocks are present. The inclusion of the most general catch block prevents an unhandled exception. When the exceptions are
caught, they will not cause the program to terminate.
Visual C# .NET provides you with checked and unchecked keywords that can be used
to enclose a block of statements—for example, checked {a = c/d};—or as an operator
when you supply it parameters enclosed in parentheses—for example,
unchecked(c/d). The checked keyword enforces checking of an arithmetic operation
for overflow exceptions. If constant values are involved, they are checked for overflow
at compile time. The unchecked keyword suppresses overflow checking and does not
raise any OverflowException. If any operation results in an overflow while using
unchecked, its value is truncated and the result is returned.
finally Block
The finally block includes code that will run whether or not an exception is
raised. This is a good location for cleanup code that closes open files or disconnects database connections to release held resources.
The following is an example of code that includes a finally block:
private void btnSave_Click(object sender, System.EventArgs e)
{
//a StreamWriter writes characters to a stream
StreamWriter sw = null;
try
{
sw = new StreamWriter(txtFileName.Text);
//Attempt to write the textbox contents in a file
foreach(string line in txtText.Lines)
sw.WriteLine(line);
//This line only executes if there were no exceptions so far
MessageBox.Show(“Contents written, without any exceptions”);
}
//catches all CLS-compliant exceptions
catch(Exception ex)
{
string msg = String.Format(“Message: {0}\n Stack Trace:\n {1}”,
ex.Message, ex.StackTrace);
MessageBox.Show(msg, ex.GetType().ToString());
goto end;
}
// finally block is always executed to make sure that the
// resources get closed whether or not the exception occurs.
// Even if there is any goto statement in a catch or try block the
// finally block is first executed before the control
// goes to the goto label
finally
{
if (sw != null)
sw.Close();
MessageBox.Show(
“finally block always executes whether or not exception occurs”);
}
end:
MessageBox.Show(“Control is at label: end”);
}
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Handling
. . . . . Exceptions
. . . . . .
The finally block can also be used in conjunction with a try block, without
any catch blocks. Exceptions raised are returned as unhandled exceptions in
this case. An example of the simplest form of this follows:
try
{
//Write code to allocate some resources
}
finally
{
//Write code to Dispose all allocated resources
}
This usage ensures that allocated resources are properly disposed whether
the exception occurs. In fact, C# provides a using statement that does the
same job, but with less code. A typical use of the using statement is as follows:
// Write code to allocate some resource.
// List the allocate resources in a comma-separated list
// inside the parentheses, with the following using block
using(...)
{
// use the allocated resource
}
// Here, the Dispose method is called for all the objects referenced
// in the parentheses of the using statement.
// There is no need to write any additional code
It is possible to programmatically throw exceptions within the finally block
using the throw statement, but this is a bad practice because there might
already be unhandled exceptions waiting to be handled.
try, catch, and finally blocks must be consecutive within code. You cannot have any
intervening code separating these blocks when configuring event-handling solutions within your code.
The throw Statement
The throw statement can be used to explicitly throw an exception within
your code. This can be used to rethrow a caught exception after performing
a task such as generating an event log entry or sending an email notification
of the exception. Or, it can be used to raise a custom exception explicitly
defined within your code.
Throwing an exception is a costly operation and, if carelessly used, can potentially
slow down your application. You should throw exceptions with caution and only
when essential. You should avoid throwing exceptions for regular control transfer.
77
78
Chapter
. . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
An example of the throw statement being used to rethrow a caught exception
looks like this in its simplest form:
catch(Exception e)
{
//TODO: Add code to create an entry in event log
throw;
}
You can also use the throw statement to throw explicitly created exceptions
(that contain a custom error message), as shown here:
string strMessage = “EndDate should be greater than the StartDate”;
ArgumentOutOfRangeException newException =
new ArgumentOutOfRangeException(strMessage);
throw newException;
Creating Custom Exceptions
The .NET Framework CLR includes many standard exception types, but
occasionally it is necessary or desirable to create a custom exception to
address a specific need within your code. This should be done only if there
is not already an existing exception class that satisfies your requirements.
While creating a new custom exception class, Microsoft recommends that
you consider the following guidelines:
➤ Derive all programmer-defined custom exception classes from the
System.ApplicationException class.
➤ End the name of your custom exception class with the word Exception
(for example, MyOwnCustomException).
➤ Implement three constructors with the signatures shown in the follow-
ing code:
public class MyOwnCustomException : ApplicationException
{
// Default constructor
public MyOwnCustomException ()
{
}
// Constructor accepting a single string message
public MyOwnCustomException (string message) : base(message)
{
}
// Constructor accepting a string message and an inner exception
// that will be wrapped by this custom exception class
public MyOwnCustomException(string message, Exception inner) :
base(message, inner)
{
}
}
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Handling
. . . . . Exceptions
. . . . . .
Managing Unhandled Exceptions
The AppDomain class represents the application domain, which is an isolated environment where the CLR-managed applications execute. This class
generates an event named UnhandledException whenever an unhandled
exception occurs in an application. Unhandled exception can occur if there
are no try-catch-finally blocks in the code, or if the existing catch blocks in
the code cannot catch the thrown exception.
The UnhandledException event handler receives unhandled exception
details
through
its
argument,
an
object
of
type
UnhandledExceptionEventArgs.
Table 3.2 details the most
UnhandledExceptionEventArgs class.
important
properties
of
the
Table 3.2 Important Properties of the UnhandledExceptionEventArgs Class
Property
Description
ExceptionObject
Receives the unhandled exception object corresponding to the current domain
IsTerminating
Is a Boolean value that indicates whether the CLR is terminating
An event handler can be attached to the UnhandledException event to take
custom actions such as logging the exception-related information. A log
maintained over a period can help you to analyze and identify patterns providing useful debugging information. Several techniques can be used to log
event-related information:
➤ By using the Windows event log
➤ By using the custom log files
➤ By using the databases such as SQL Server 2000
➤ By sending email notifications
The Windows event log provides the most dependable method of logging
because other forms of logging can suffer from loss of network connectivity
or file access. You can use the EventLog class to write data to the Windows
event logs available in Windows 2000 and later versions of the operating system.
79
80
Chapter
. . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The option to use the EventLog class is not available in older versions of the
Windows operating system, such as Windows 98. It should not be used if the application will be deployed on legacy platforms.
Validating User Input
To make your application as robust as possible, the best solution to invalid or
incorrect user input is to prevent the entry of “bad” data as often as possible.
Validating user input before hand provides a better solution than very complex error-handling code that might add a great deal of resource overhead to
your program. Four basic techniques are used to validate user input:
➤ Restricting the available values by using the proper type of control, con-
figured with a specific list of allowed values. Controls such as
RadioButton, ListBox, ComboBox, and CheckBox are often used for this
type of validation. Configuring properties of the controls allows additional restriction of user input, such as controlling the case or length of
TextBox input.
➤ Restricting data entry through controls by enabling or disabling them
based on the state of other controls. As an example of this technique, a
set of controls allowing the entry of address information might remain
disabled until a valid CustomerID has been selected in another control.
➤ Capturing and evaluating user keystrokes and allowing only acceptable
values to be recognized. This might be used to prevent the entry of symbol or alphabetic characters within a control that should hold only
numeric characters.
➤ Evaluating a control’s data as a whole and warning the user of incorrect
or unacceptable values. This is often used to warn a user when attempting to change focus from the control or save the form.
Control-Based Validation
Restriction of allowable values within a control was discussed at greater
length in Chapter 2, “Controls on Forms.” In addition to simply restricting
input to a selection from a list of values, control properties can be configured
to further limit possible input values. Of note are the CharacterCasing and
MaxLength properties used in text input controls such as the TextBox.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Handling
. . . . . Exceptions
. . . . . .
CharacterCasing
The CharacterCasing property of a TextBox control can be used to change
all input alphabetic characters to a particular case. The options for the
CharacterCasing property are Normal (the default, which does not change
the case of input characters), Upper (changes all the characters to uppercase),
and Lower (changes all the characters to lowercase).
MaxLength
The MaxLength property of a TextBox or ComboBox is used to restrict the
maximum number of characters the user can input into the control. A value
of 0 (the default) specifies no specific limit for the number of characters that
can be entered by the user. This property does not restrict the length of values that can be set programmatically.
Control-Access Restriction
Manipulating access properties such as the Enabled or ReadOnly properties
can restrict data entry access within a control. When a control’s Enabled
value is set to false, it cannot receive focus. If the ReadOnly property of a
TextBox control is set to true, it can still receive focus, allowing users to scroll
through its contents while preventing changes.
Keystroke-Level Validation
When a user presses a key, three events are fired in order:
1. KeyDown
2. KeyPress
3. KeyUp
The KeyPress event can be used to intercept input keyboard characters and
perform validation tasks through the use of the KeyPressEventArgs class
before the KeyUp event is handled. Table 3.4 details some important properties of the KeyPressEventArgs class.
Table 3.4 Important Properties of the KeyPressEventArgs Class
Property
Description
Handled
Whether the event has been handled.
KeyChar
The character value corresponding to the pressed key.
81
82
Chapter
. . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The KeyPress event fires only for keys that generate character values,
excluding function, control, and cursor-movement keys. To respond to the
excluded keys, you must use the KeyDown and KeyUp events instead. These
use the properties of the KeyEventArgs class, detailed in Table 3.5.
Table 3.5 Important Properties of the KeyEventArgs Class
Property
Description
Alt
Is true if the Alt key is pressed; otherwise, is false.
Control
Is true if the Ctrl key is pressed; otherwise, is false.
Handled
Indicates whether the event has been handled.
KeyCode
The keyboard code for the event. Its value is one of the values specified in
the Keys enumeration.
KeyData
The key code for the pressed key, along with modifier flags that indicate
the combination of Ctrl, Shift, and Alt keys that were pressed at the same
time.
KeyValue
An integer representation of the KeyData property.
Modifiers
Modifier flags that indicate which combination of modifier keys (Ctrl, Shift,
and Alt) was pressed.
Shift
Is true if the Shift key was pressed; otherwise, is false.
By default, only the control, which currently has the focus, responds to the KeyDown,
KeyPress, and KeyUp events. However, if you set the KeyPreview property of a form
to true, the form can also handle the same three events before the control with the
current focus handles them, allowing two tiers of keystroke-level validation—at the
form level and at the control level.
Field-Level Validation
Validation also can be performed to include the entire value entered within
a control by configuring validation code to run before focus is lost or the
form is closed. When a user enters or leaves a field, the following events
occur in order:
1. Enter—Occurs when a control is entered
2. GotFocus—Occurs when a control receives focus
3. Leave—Occurs when focus leaves a control
4. Validating—Occurs when a control is validating
5. Validated—Occurs when a control is finished validating
6. LostFocus—Occurs when a control loses focus
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Handling
. . . . . Exceptions
. . . . . .
The Validating event is the ideal place to store the validating logic for a field;
we discuss the Validating event in the next section.
The Validating Event
The Validating event is ideal for input value validation. You can write code
to check the values presented and display an error message to the user or
prevent the loss of focus from the current control until the value has been
corrected.
The Focus method of the control can be used to redirect focus to the same
control programmatically. Alternatively, the Cancel property of the
CancelEventArgs object can be set to true, to prevent the transfer of focus
from the current control.
Closing a form fires a Validating event. Therefore, if you want to use the Cancel
property of the CancelEventArgs to prevent loss of focus, this will also prevent the
user from closing the form. To avoid this, you need to code the event handling to
reset the Cancel value only when the mouse is inside the form’s client area. This
allows the mouse to close the form using the Close button in the title bar.
The Validated event occurs after validation has occurred. It can be used to
perform actions based on the validated values, such as enabling or disabling
other controls, as discussed previously in this section.
The CausesValidation Property
When using the Validating event to retain the focus in a control until you
receive a valid input value, you can prevent the user from being able to obtain
help on what constituted a valid input value by clicking another control such
as the Help button in the toolbar. This is a result of the default setting (true)
of the CausesValidation property of the Button control.
If you set the CausesValidation property of the Help button control to false,
the control can act without triggering the Validating event in the control
with current focus.
The ErrorProvider Component
The ErrorProvider component provided within the Visual Studio .NET
toolbox allows the display of error validation messages. A small icon includes
a message that appears as a ToolTip when the user hovers the cursor over the
displayed icon. Table 3.6 details the most important members of the
ErrorProvider class.
83
84
Chapter
. . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 3.6 Important Members of the ErrorProvider Class
Member
Type
Description
BlinkRate
Property
Specifies the rate at which the error icon flashes.
BlinkStyle
Property
Specifies a value indicating when the error icon
flashes.
ContainerControl
Property
Specifies the parent control of the ErrorProvider control.
GetError
Method
Returns the error description string for the specified
control.
Icon
Property
Specifies an icon to display next to the parent control.
The icon is displayed only when an error-description
string (SetError) has been set for the parent control.
SetError
Method
Sets the error-description string for the specified control.
SetIconAlignment
Method
Specifies the location at which to place an error icon
in relation to the control.
SetIconPadding
Method
Specifies the amount of extra space to leave between
the specified control and its error icon.
This component offers many advantages over opening separate message
boxes for each possible error, which can confuse users and complicate the
desktop. The ErrorProvider component provides a simple user-friendly display that rapidly draws a user’s attention to the control failing input validation. Figure 3.2 shows a form that includes an ErrorProvider component.
Figure 3.2
A form displaying an example of the ErrorProvider component.
The following code shows how the ErrorProvider component can be used
together with the Validating event to display errors during validation:
private void txtGallons_Validating(object sender,
System.ComponentModel.CancelEventArgs e)
{
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Handling
. . . . . Exceptions
. . . . . .
try
{
decimal decGallons = Convert.ToDecimal(txtGallons.Text);
if (decGallons > 0)
errorProvider1.SetError(txtGallons, “”);
else
errorProvider1.SetError(
txtGallons, “Please enter value > 0”);
}
catch(Exception ex)
{
errorProvider1.SetError(txtGallons, ex.Message);
}
}
In this section, we discussed various techniques that can be used for user
input validation. You also learned how the ErrorProvider component can be
used to point to errors when the user enters input data on a Windows Form.
85
86
Chapter
. . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Practice Questions
Question 1
You have created the following code segment:
try
{
//Write code to allocate some resources
}
finally
{
//Write code to Dispose all allocated resources
}
Which of the following will result from compiling this code, assuming that all
other code for your form works properly?
❍ A. The code will generate an error because it lacks a catch block.
❍ B. The code will generate an error because it lacks a throw statement.
❍ C. The code will generate an error because the finally block is placed
immediately after the try block.
❍ D. The code will compile without an error.
Answer D is correct. The code will compile properly because a try block
should be followed by either a catch block or a finally block. The code here
includes both a try block followed by a finally block. Answer A is incorrect
because a try block can be followed by either one or more catch blocks or a
finally block (or both). Answer B is incorrect because the throw statement is
used to explicitly raise an error and is not required. Answer C is incorrect
because a finally block can be placed after a try block.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Handling
. . . . . Exceptions
. . . . . .
Question 2
What will be the output of the following code?
try
{
int num = 100;
int den = 0;
try
{
MessageBox.Show(“Message1”);
int res = num/den;
MessageBox.Show(“Message2”);
}
catch(ArithmeticException ae)
{
MessageBox.Show(“Message3”);
}
MessageBox.Show(“Message4”);
}
❍ A.
Message1
Message4
❍ B.
Message1
Message2
Message3
Message4
❍ C.
Message1
Message3
Message4
❍ D.
Message1
Message3
Message2
Message4
Answer C is correct. This code first displays Message1 and executes the next
line to perform the division. Because the denominator is 0, a
DivideByZeroException is raised. Because the code that raises the exception
is enclosed in a try block, the program searches for a matching catch block
associated with that try block. The code finds a matching catch block with
ArithmeticException (that is a base class for the DivideByZeroException
exception), which can handle the exception. Therefore, it executes the catch
block and displays Message3. After executing the catch block, control comes
to the next line after the catch block, and the program displays Message4.
Answer A is not correct because the program is capable of locating a catch
87
88
Chapter
. . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
block that can catch DivideByZeroException. Answer B is not correct
because when an exception is raised, the code first searches for the catch
block that can handle the exception. Answer D is not correct because after
the code in the catch block is executed, control is transferred to the next line
after the catch block.
Question 3
How should you arrange catch blocks?
❍ A. Only one catch block for each try block.
❍ B. Several catch blocks for a try block, arranged in order starting with
Exception and ending with the most specific exception.
❍ C. Several catch blocks within one try block, arranged starting with the
most specific exception and ending with Exception.
❍ D. The catch blocks should be used only when a finally block is not used.
Answer C is correct. One or more catch blocks can be used with a try block,
arranged in order from the most specific exception to the most general; the
first matching catch block catches the exception. Answer A is incorrect
because you can associate more than one catch block with a try block. Answer
B is incorrect because it specifies a reversed order, starting with Exception
class. The compiler generates an error if the catch blocks are not arranged
from specific to generic types. Answer D is incorrect because catch and finally blocks can both be used together, if desired.
Question 4
You have designed a logon form with two TextBox controls named txtUserName
and txtpassword. You want to ensure that the user can enter only lowercase
characters in the controls. Which of the following solutions will fulfill this
requirement using the simplest method?
❍ A. Program the KeyPress event of the TextBox controls to convert uppercase letters to lowercase letters.
❍ B. Create a single event handler that is attached to the KeyPress event of
the form. Program this event handler to convert the uppercase letters
to lowercase ones.
❍ C. Set the CharacterCasing property of the Textbox controls to Lower.
❍ D. Use the CharacterCasing method of the controls to convert the letters
to lowercase letters.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Handling
. . . . . Exceptions
. . . . . .
Answer C is correct. The simplest method to accomplish this requirement is
to set the CharacterCasing property of the two TextBox controls to Lower
so that all input characters will be forced to lowercase. Answers A and B
could be used to accomplish this task, but this would not be the simplest
solution available. Answer D is incorrect because there is no
CharacterCasing method for TextBox controls. CharacterCasing is a property that accepts values of Normal, Lower, or Upper.
Question 5
You are creating an order-tracking application using a Visual C# .NET Windows
application. When you are unable to track a particular order number entered by
the user, you need to raise an exception. Which of the following options will help
you to raise an exception?
❍ A. try block
❍ B. catch block
❍ C. finally block
❍ D. throw statement
Answer D is correct. The throw statement is used to raise an exception.
Answer A is not correct because the try block is used to place code that can
raise exceptions. Answer B is not correct because the catch block is used to
catch and handle exceptions. Answer C is not correct because the finally
block is used to insert code that always needs to be executed, such as
resource-cleanup code.
Question 6
Which of the following events will fire when the Insert key is pressed? (Choose
all correct answers.)
❑ A. KeyDown
❑ B. KeyPress
❑ C. KeyUp
❑ D. Move
Answers A and C are correct. When control and cursor-navigation keys are
pressed, only the KeyDown and KeyUp events are fired. Answer B is incorrect because the KeyPress event occurs only when a keyboard key generates
a character.
89
90
Chapter
. . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 7
You have a TextBox control and a Help button that the user can press to get help
on allowable values. You validate the data entered by the user in the TextBox
control. If the user enters an invalid value, you set the focus back in the control
using the Cancel property of the CancelEventArgs. A user reports that once he
enters invalid data in the text box, he cannot click the Help button. What should
you do to correct the problem?
❍ A. Set the CausesValidation property of the text box to false.
❍ B. Set the CausesValidation property of the text box to true.
❍ C. Set the CausesValidation property of the Help button to false.
❍ D. Set the CausesValidation property of the Help button to true.
Answer C is correct. By setting the CausesValidation property of the Help
button to false, you allow it to act without first firing the Validating event in
the TextBox, which would return the focus to the TextBox. Answers A and B
are incorrect because changing the CausesValidation property of the textbox
will not affect the capability of the Help button to be selected. Answer D is
incorrect because setting the CausesValidation property of the help button
to true (the default value) would result in the same problem experienced by
the user.
Question 8
You are designing a Windows Form that enables you to add a new product to
the product catalog of your company. You need to validate the controls as the
user enters the data. If incorrect data is entered in the field, you should set the
focus back to the control and ask the user to enter the correct data. Which of
the following events will you use to validate user input?
❍ A. LostFocus
❍ B. Validating
❍ C. Leave
❍ D. Validated
Answer B is correct. The Validating event is the ideal place to store the validating logic for a field. Answers A and C are not correct because these events
are not intended for validation. Properties such as CausesValidation and
Cancel, which provide important roles in control validation, affect only the
Validating and Validated events. Answer D is not correct because the
Validated event is fired after the validation is performed.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Handling
. . . . . Exceptions
. . . . . .
Question 9
You have an order entry form. When an exception occurs, you want to get information about the sequence of method calls and the line number in the method
where the exception occurs. Which property of your custom exception class that
derives from the ApplicationException class should be used?
❍ A. HelpLink
❍ B. InnerException
❍ C. Message
❍ D. StackTrace
Answer D is correct. The StackTrace method of the Exception class provides
information about the method call sequence and line number where the
exception occurred. Answer A is incorrect because the HelpLink property
specifies the URL for an associated help file. Answer B is incorrect because
the InnerException property details an exception associated with the raised
exception. Answer C is incorrect because the Message property is used to
explain the error or offer possible corrective actions.
Question 10
You want to log events generated by exception-handling code within your application, which will run on standalone systems running Windows 98 and
Windows 2000. Which of the four methods of logging is the best single solution
able to fulfill this requirement?
❍ A. Windows event log
❍ B. Custom log files
❍ C. Databases such as SQL Server 2000
❍ D. Email notifications
Answer B is correct. The best solution in this scenario is to use a local custom log file. Answer A is incorrect because some of the systems are running
Windows 98, which does not support logging using the event log. Answers
C and D are incorrect because standalone systems will not have network
access to allow connection to databases or transmission of SMTP messages.
91
92
Chapter
. . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Need to Know More?
Dietel, Harvey M., et al. C#: How to Program. Prentice Hall, 2001.
Richter, Jeffrey. Applied Microsoft .NET Framework Programming.
Microsoft Press, 2001.
Windows Forms Community Site: www.windowsforms.net/.
4
Components and .NET
Assemblies
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terms you’ll need to understand:
✓ Component
✓ Control
✓ UserControl
✓ Event handling
✓ Assemblies
✓ Assembly Manifest
✓ Global Assembly Cache
✓ Satellite assembly
Techniques you’ll need to master:
✓ Understand how to create a component by extending the
Component, Control, and UserControl classes.
✓ Know how to extend the functionality of existing controls
through visual inheritance.
✓ Understand the difference between the private and shared
assemblies.
94
Chapter
. . . . .4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
In Chapter 2, “Controls on Forms,” we looked at several common controls
that can be placed within a container object, such as a Windows Form.
However, the .NET Framework also includes the capability to create more
complex and customized components.
In this chapter, we discuss the creation of custom components by inheriting
from the Component, Control, and UserControl classes. We also examine
the use of the .NET Assembly for security, versioning, and deployment of
custom components.
Creating .NET Components
In programming, the term component is generally used for an object that is
reusable and can interact with other objects. The .NET Framework enables
you to create components in several different ways:
➤ By deriving from the Component class, which belongs to the
System.ComponentModel namespace. This technique is used to create
those components that are used to control external resources such as an
event log, or to provide a design-time interface such as the one supplied
by the System.Windows.Forms.Timer component. These objects generally don’t have any runtime user interface.
➤ By deriving from the Control class of the System.Windows.Forms
namespace. This technique is used to create the control that provides
user interface capabilities. These objects are generally placed on a container control such as a Windows form to create the client-side user
interface.
➤ By deriving from the UserControl class or any of its derived classes. The
UserControl class derives from the ContainerControl class, making its
derived components capable of serving as containers for other controls.
This allows the rapid creation and deployment of custom modular components based on existing controls that work together.
When you create your own controls by deriving from the Control class, you must
override the Paint method with your own rendering logic. On the other hand, when
you create a control by deriving from the UserControl class, you need not override
the Paint method because the control renders the user interface of its child controls.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Components
. . . . . . .and
. . .NET
. . . Assemblies
. . . . . .
The templates mentioned in the following sections are not available in Visual Studio
.NET Standard edition. You must have Visual Studio .NET Professional or higher to
utilize these templates.
Creating Components Derived from the
Component Class
Some components provide functionality without requiring a visual representation. One example of this is the Timer component, which provides useful
properties and events to its container without a displayed user interface.
You can create a component derived from the Component class by performing the following tasks:
1. Open an instance of Visual Studio .NET and create a new project
based on the Class Library template. Name the project
RandomNumberGenerator.
2. Remove the automatically created Class1.cs by right-clicking it and
selecting Delete.
3. Right-click the project name (RandomNumberGenerator) in the
Solution Explorer and select Add, Add New Item to open the Add
New Item dialog box. Select Component Class as the template of
the item, and name the component RandomNumberGenerator.cs (see
Figure 4.1).
Figure 4.1
The Add New Item dialog box showing the Component Class option selected.
95
96
Chapter
. . . . .4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4. In Code view, add the following code just after the Component
Designer–generated code:
//stores minValue and maxValue
private int minValue=1, maxValue=100;
5. Add the following code to create two properties,
MinValue
and MaxValue,
of type int:
public int MinValue
{
get
{
return minValue;
}
set
{
minValue = value;
}
}
public int MaxValue
{
get
{
return maxValue;
}
set
{
maxValue = value;
}
}
6. Add a method named
GetRandomNumber(),
as shown in the following
code:
public int GetRandomNumber()
{
Random r = new Random();
return r.Next(minValue, maxValue);
}
7. In the Solution Explorer, navigate to the project
RandomNumberGenerator
and right-click its Reference node. Select Add Reference from the context menu. In the Add Reference dialog box, select the .NET tab and
double-click the component named System.Drawing.dll. Then click OK.
A reference to System.Drawing.dll is added to this project.
8. Insert the following line at the top of the code, along with other
directives:
// Required for ToolboxBitmap attribute
using System.Drawing;
using
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Components
. . . . . . .and
. . .NET
. . . Assemblies
. . . . . .
9. Select any 16 × 16–pixel
.bmp file (if you have a 16 × 16 ICO file, just
rename it with a .bmp extension). Change its name to
RandomNumberGenerator.bmp and add it to the project. After the .bmp file
appears in the Solution Explorer, right-click it and select Properties
from the context menu. In the Properties window, set Build Action to
Embedded Resources.
10. Add the following attribute just before the class declaration:
// Set the Toolbox icon
[ToolboxBitmap(typeof(RandomNumberGenerator))]
11. Select the project
RandomNumberGenerator in the Solution Explorer and
select Build, Build RandomNumberGenerator. This generates a
RandomNumberGenerator.dll file that contains the code for the
RandomNumberGenerator component.
You can also place the RandomNumberGenerator component on the Visual
Studio .NET toolbar; this enables you to use drag-and-drop to include the
component on Windows forms applications. To add the component to the
toolbox, right-click an empty area on the toolbox and select Customize
Toolbox from the shortcut menu.
You can use the new component in your form by including a reference to the
project’s .dll file in the toolbox. To do this, right-click the .NET Framework
Components tab and select Browse to navigate to the new .dll. These steps
automatically add the control to the Toolbox window (see Figure 4.2).
Figure 4.2 The toolbox showing several custom controls.
Adding this component to your form as RandomNumberGenerator1 and
configuring its MinValue and MaxValue properties enables you to use its
results in other visual controls using code similar to the following:
97
98
Chapter
. . . . .4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
private void btnGenerate_Click(object sender, System.EventArgs e)
{
lblResult.Text = String.Format(“The next random number is: {0}”,
randomNumberGenerator1.GetRandomNumber());
}
Creating Components Derived from the
Control Class
When you need a control that cannot easily be created using existing user
interface controls, you can create a custom control derived directly from the
Control class. No template is provided for this purpose, so you first must create a new control derived from the UserControl class and then modify it to
extend from the Control class.
You create a component derived from the Control class by performing the
following steps:
1. Open an instance of Visual Studio .NET and create Control Library
project based on the User Control template.
2. Switch to Code view for the new control and change the class declara-
tion so that its base class is Control rather than
Systems.Windows.Forms.UserContol, like this:
public class DigitalClock : Control
When you change back to Design view after changing the class declaration to Control,
you will notice that the gray borderless box used for creating controls is gone.
3. Add any required event handlers to the control, including code needed
to support rendering the control on a Paint event and a call to the
Paint event during a Resize event:
private void timer1_Tick(object sender, System.EventArgs e)
{
Invalidate();
}
private void DigitalClock_SizeChanged(object sender, System.EventArgs e)
{
Invalidate();
}
private void DigitalClock_Paint(object sender,
System.Windows.Forms.PaintEventArgs e)
{
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Components
. . . . . . .and
. . .NET
. . . Assemblies
. . . . . .
Graphics g = e.Graphics;
string strTime = DateTime.Now.ToString(“T”);
//Get the current string size
SizeF sizef = g.MeasureString(strTime, Font);
//get the scaling factor
float scale = Math.Min(ClientSize.Width/ sizef.Width,
➥ClientSize.Height/ sizef.Height) ;
//scale the font as per new control size
Font font = new Font(Font.FontFamily, scale*Font.SizeInPoints);
//get the string size for scaled font size
sizef = g.MeasureString(strTime, font);
//Find the position to draw the string
PointF pos = new PointF((ClientSize.Width - sizef.Width)/2,
➥(ClientSize.Height - sizef.Height)/2);
//Draw the time string
g.DrawString(strTime, font, new SolidBrush(ForeColor), pos);
}
After you build this project, the project’s .dll will include code for the new
control to be added to your toolbox, as detailed in the previous section.
Including this visual control on your form will redraw itself as you resize the
control, as seen in Figure 4.3.
Figure 4.3 A form displaying the custom DigitalClock control.
Components Derived from the UserControl
Class
Existing user interface controls can be combined to create a custom control
derived from the UserControl class. When creating a control such as this,
you also might want to create custom event delegates that allow your form
to trigger events that occur within your new control. The following sections
explain how to create a control derived from the UserControl class and how
to add event responses to the newly created control.
99
100 Chapter 4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Control Derived from the UserControl Class
You can create a component derived from the UserControl class by performing the following tasks:
1. Open an instance of Visual Studio .NET and create a Windows
Control Library project based on the Windows Control Library template. Rename UserControl1.cs to ColorMixer.cs, and change the class
name to ColorMixer within Code view.
2. Within Design view, add three TrackBar controls, naming them tbRed,
tbGreen, and tbBlue. Change their Maximum property to 255, their
Orientation to Vertical, their TickFrequency to 15, and their TickStyle
to both. Figure 4.4 shows the layout of this control.
Figure 4.4 Three TrackBar controls arranged for the ColorMixer control.
3. Select View, Class View from the header and navigate to the
ColorMixer class. Then right-click the class and select Add, Add
Property from the options provided. In the C# Property Wizard, add
three properties—Red, Green, and Blue (see Figure 4.5).
Figure 4.5 Creating the Red property using the C# Property Wizard.
101
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Components
. . . . . . .and
. . .NET
. . . Assemblies
. . . . . .
4. Add code to create properties for the custom control:
[Category(“Color”), Description(“Value of Red Color”)]
public int Red
{
get
{
return tbRed.Value;
}
set
{
tbRed.Value = value;
}
}
[Category(“Color”), Description(“Value of Green Color”)]
public int Green
{
get
{
return tbGreen.Value;
}
set
{
tbGreen.Value = value;
}
}
[Category(“Color”), Description(“Value of Blue Color”)]
public int Blue
{
get
{
return tbBlue.Value;
}
set
{
tbBlue.Value = value;
}
}
After you build this project, the project’s .dll will include code for the new
control that can be added to your toolbox as detailed previously. After you
add a reference to the project’s .dll including the new control and after you
include this control on your form as ColorMixer1, you can access its value,
as shown here:
private void btnSetColor_Click(object sender, System.EventArgs e)
{
lblColorSample.BackColor = Color.FromArgb(colorMixer1.Red,
colorMixer1.Green, colorMixer1.Blue);
}
Adding Event Responses to Custom Controls
You might want to allow the manipulation of your custom control to trigger
events external to the control itself. In the previous example, the resulting
102 Chapter 4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ColorMixer control class could be used to generate a color value based on
the current settings of the contained TrackBar controls. However, a change
to these settings could not automatically be reflected without the calling
form requerying the value of the ColorMixer control.
Events in Visual C# .NET use the publisher-subscriber model, in which the
class that implements an event is called the publisher and other classes registering appropriate event handlers are called the subscribers. The publisher announces that other classes can subscribe to this event by attaching
appropriate event handlers to the event. The publishing class registers all
event handlers with itself and takes responsibility for invoking them all when
the event occurs.
An event handler is a method with a specific signature that the publisher class is
capable of registering. By convention, most event handlers take two arguments.
The first specifies the object on which the event occurred, and the second contains
information related to the event; the second argument is an object of type
EventArgs or of a class derived from EventArgs.
You can modify the ColorMixer control that you created to accommodate
event delegation by performing the following steps:
1. Create a new blank project and copy the ColorMixer.cs from your pre-
vious project (hold down the Ctrl key while dragging and dropping the
control to copy it easily). Rename this copy and change all instances of
ColorMixer within Code view to ColorMixerEventArgs.
2. Within Code view, add the code to create a delegate and handle the
event:
public class ColorMixerEventArgs : EventArgs
{
public readonly int red, green, blue;
public ColorMixerEventArgs(int red, int green, int blue)
{
this.red = red;
this.green = green;
this.blue = blue;
}
}
//define the prototype of the callback method
public delegate void ChangedEventHandler(object sender,
ColorMixerEventArgs args);
//define the event
public event ChangedEventHandler Changed;
//notify the registered objects of event
protected virtual void OnChanged(ColorMixerEventArgs e)
{
103
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Components
. . . . . . .and
. . .NET
. . . Assemblies
. . . . . .
//if any object registered with the event
if (Changed != null)
{
//notify that object
Changed(this, e);
}
}
3. Add an event handler to each of the TrackBar controls:
//Fire Change event when there is any change to the trackbar controls
private void TrackBar_ValueChanged(object sender, System.EventArgs e)
{
ColorMixerEventArgs args = new ColorMixerEventArgs(tbRed.Value,
tbGreen.Value, tbBlue.Value);
OnChanged(args);
}
4. Build the code, add its reference to a form, and then add an instance of
the new control and accept the default name of
ColorMixerEventArgs1.
5. Add a GroupBox control to your form and place a Label control within
it, named lblColorSample.
6. Add code to handle the Changed event of the ColorMixerWithEvents1
control:
private void colorMixerWithEvents1_Changed(object sender,
StepByStep4_3.ColorMixerWithEvents.ColorMixerEventArgs
args)
{
lblColorSample.BackColor = Color.FromArgb(args.red, args.green,
args.blue);
}
7. Set this form as the startup object for your project, and run the project
to see the results. Manipulating the TrackBars of the custom control
causes the Label control’s background color to change automatically.
Extending a Control Through Visual Inheritance
A new component can be created that inherits all the qualities from an existing component, adding additional functionality as required. With regard to
a form or other type of user interface component, this process is referred to
as visual inheritance.
You can create a new control that extends the ColorMixerEventArgs control
created previously in this section to include a color sampler displaying the
color and its Red, Green, and Blue values by performing the following:
104 Chapter 4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1. Create a new project based on the Windows Control Library template,
and name the project ColorMixerX. Delete the automatically created
file, UserControl1.cs.
2. Right-click the project and select Add, Add Inherited Control from
the options. Name the new control ColorMixerX.cs and click the
Open button to open the Inheritance Picker dialog box, as shown in
Figure 4.6.
Figure 4.6 The Inheritance Picker dialog box showing the ColorMixerWithEvents component
selected.
3. Select the desired parent component and click OK to return to Design
view of the derived control, which displays all the features of the parent component.
4. Add a GroupBox control that contains four Label controls: lblSampler,
lblRed, lblGreen, and lblBlue. Change the Text property of the
GroupBox control to Sampler, and change the Text property of the
Label controls to an empty string.
5. In Code view, add code to the control’s constructor after the call to the
InitializeComponent method:
//set the initial display of control
lblSampler.BackColor = Color.FromArgb(this.Red, this.Green, this.Blue);
lblRed.Text = String.Format(“R: {0}”, this.Red);
lblGreen.Text = String.Format(“G: {0}”, this.Green);
lblBlue.Text = String.Format(“B: {0}”, this.Blue);
6. Add code to handle the Changed event of the control:
private void ColorMixerX_Changed(object sender,
StepByStep4_3.ColorMixerWithEvents.ColorMixerEventArgs args)
{
lblSampler.BackColor = Color.FromArgb(args.red, args.green,
args.blue);
lblRed.Text = String.Format(“R: {0}”, args.red);
lblGreen.Text = String.Format(“G: {0}”, args.green);
lblBlue.Text = String.Format(“B: {0}”, args.blue);
}
105
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Components
. . . . . . .and
. . .NET
. . . Assemblies
. . . . . .
After building this project, the project’s .dll will include code for the new
control that can be added to your toolbox as detailed previously. The new
control includes all the functionality of its parent as well as the new features.
Creating .NET Assemblies
Beyond practice sessions, Windows applications generally consist of more
than a single file. These can include application code files with DLL and
EXE extensions; graphics files with extensions such as GIF and BMP; or
other data files used by the application that store utility information or
strings for multilingual support. The .NET Framework groups all the files
from an application into a single logical group called an assembly. The files
are not physically altered to designate them as part of an assembly, but
instead they are detailed within the Assembly Manifest, which includes the
metadata for an assembly.
Each assembly has a version number. All types and resources within an assembly
share the same version number, to make it possible for applications to refer to the
correct version of files.
When the Common Language Runtime (CLR) prepares to load an assembly, it reads the Manifest to get the following information:
➤ The name and version of the assembly
➤ The files that make up the assembly, including their name and hash
values
➤ The compile-time dependency of this assembly on other assemblies
➤ The culture or language that an assembly supports
➤ The set of permissions required for the assembly to run properly
You can view the Assembly Manifest using the Microsoft Intermediate
Language (MSIL) Disassembler, which is a separate utility program that can
be used from within the Visual Studio interface by the following process:
1. Within the Solution Explorer window of Visual Studio .NET, click the
Show All Files button in its toolbar. Then navigate to the folder that
holds your project’s assembly.
2. Right-click the DLL or EXE file generated by your project. Select
Open With from the options listed in order to access the Open With
dialog box.
106 Chapter 4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3. Select ildasm.exe from the options to open the MSIL Disassembler, as
shown in Figure 4.7. If you do not see ildasm in the options, you can
add it by clicking the Add button. The ildasm can be located in the bin
subdirectory of .NET Framework SDK installation directory, which is
typically \Program Files\Microsoft Visual Studio
.NET\FrameworkSDK\Bin.
Expand the nodes to see the methods and constructors of the assembly.
4. Double-clicking the MANIFEST node displays the metadata for the
assembly, as shown in Figure 4.8.
Figure 4.7 The MSIL Dissassembler displaying metadata from an assembly.
Figure 4.8 Metadata displayed from within the MANIFEST node.
One method used to identify assemblies is based on the manner of their use.
We examine the following categories based on this method of identification:
107
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Components
. . . . . . .and
. . .NET
. . . Assemblies
. . . . . .
➤ Single-file and multifile assemblies
➤ Static and dynamic assemblies
➤ Private and shared assemblies
➤ Satellite and resource-only assemblies
Single-File and Multifile Assemblies
Most examples that you will encounter generate a single-file assembly, which
is a single EXE or DLL file encapsulating all code, embedded resources, and
the Assembly Manifest within the same file. Visual Studio .NET does not
support the creation of multifile assemblies, but you can create them using
the .NET Framework SDK’s command-line Assembly Generation tool
(al.exe). In a multifile assembly that includes several DLL and EXE files, the
Assembly Manifest can be attached to any of these or can exist within its own
separate file. Although Visual Studio .NET does not allow the creation of
multifile assemblies, it can make use of multifile assemblies in other projects.
Static and Dynamic Assemblies
Static assemblies are created when you explicitly compile a program using
either Visual Studio .NET or the command-line compilers. Static assemblies
are physically stored on a disk. Dynamic assemblies are implicitly created on
the fly by programs such as ASP.NET. You can use the classes in the
System.Reflection.Emit namespace to create dynamic assemblies in your
own programs. Dynamic assemblies are not persisted on the disk.
Private and Shared Assemblies
Assemblies can be deployed using two different approaches:
➤ When an assembly is deployed for use within a single application, it is
called a private assembly. Private assemblies are located within the same
folder where the application is installed and do not require detailed
name and versioning information. They can be copied to the Global
Assembly Cache (GAC) if this is necessary for later usage or for several
applications; this is covered in greater detail in Chapter 13, “Deploying
a Windows Application.”
➤ When an assembly is deployed for use by many applications, it is stored
within the Global Assembly Cache and is called a shared assembly. Shared
assemblies have several common characteristics, including the following:
108 Chapter 4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ Assemblies stored in the GAC cannot be deployed simply by copy-
ing the appropriate files to the destination system—they must
instead be deployed to the GAC of the target system using tools
such as gacutil.exe or through Windows Installer 2.0. You’ll learn
more about installing files to the GAC in Chapter 13.
➤ Assemblies installed within the GAC must have a strong name, to
ensure the assembly’s identity. A strong name consists of an assembly’s name, version number, and culture, along with a public key and
a digital signature. The CLR checks an assembly’s identity before
installing it to the GAC and then ensures that it has not been tampered with later by checking its strong name.
➤ Unlike a folder containing a static assembly, the GAC can contain
multiple copies of an assembly with the same name but different
versions. The runtime of an application can determine which version of an assembly to load based on its configuration file. This is
covered in greater detail in Chapter 15, “Configuring a Windows
Application.”
You can view the contents of the GAC using the following process:
1. Within the Windows Explorer, navigate to the system folder of your
computer (such as c:\Windows or c:\WINNT) and open the subfolder
named Assembly, as shown in Figure 4.9.
Figure 4.9 Windows Explorer showing the contents of a system’s GAC.
Native Assembly Versus JIT-Compiled Assembly
Assemblies store code in the Microsoft Intermediate Language (MSIL) format. When a method
is invoked for the first time, the CLR will Just-In-Time (JIT) compile that method into native
machine code. The native code is stored in memory and is directly used for any subsequent
109
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Components
. . . . . . .and
. . .NET
. . . Assemblies
. . . . . .
calls to this method. In this mode, a method is slower when called for the first time because
compilation is involved, but any subsequent calls to that method will run as fast as native code
itself.
When you view the GAC, you will note that some assemblies have their type marked as native
images. These assemblies have been compiled in native code before being installed in the GAC.
The advantage of using a native image is that even the first call of a method will be as fast as
its subsequent calls. You, too, can create a native image for your assembly by using the Native
Image Generator Tool (NGEN.EXE), which is installed as part of the .NET Framework SDK.
2. Right-click an assembly and select Properties to display the assembly’s
information details, including its version (see Figure 4.10).
Figure 4.10 Displayed properties of the System.Security assembly.
Satellite and Resource-Only Assemblies
Many applications require additional resources, such as files containing
graphics, culture, and language settings, to function properly. In the
RandomNumberGenerator.cs example shown earlier in this chapter, you
included a bitmap (BMP) file with your assembly. Resource files can be
included in an assembly in two ways:
➤ Select the option Build Type of a Project’s Properties as Content. This
generates an assembly containing only code, metadata, and links to
external resource files. The resources files must be distributed with the
application to remain available at runtime.
➤ Select the option Build Type to Embedded Resources, as in the
RandomNumberGenerator example. This causes the compiler to
include the resources embedded within the application’s assembly itself.
Visual Studio .NET performs this process in the following steps:
110 Chapter 4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1. An XML resource file is created with an extension of resx. This
file stores the resources as key-value pairs—for example, the name
of a resource file and its location.
2. During compilation, all resources listed in the resx file are embed-
ded into a binary file with the extension of resources.
3. The resultant binary resource file is embedded into the code
assembly.
You can use the Assembly Generation tool (al.exe) to create an assembly by linking
various compiled modules. This feature is especially useful if you are using multiple
.NET languages in your programming environment. You can first compile the various
programs, by using their corresponding language compilers, into module files and
then use al.exe to link the module files into an assembly.
Another option is to create an assembly that contains only resources.
Although Visual Studio .NET does not directly support this method, it is
possible using command-line utilities from the SDK. You can use the
Resource File Generator tool (resgen.exe) to convert .txt files and .resx
(XML-based resource format) files to CLR binary .resources files. When you
have the .resources file, you can compile it into a resource-only assembly
using the Assembly Generation tool (al.exe).
Table 4.1 details a few important classes from the System.Resources namespace that you might find useful in your programs.
Table 4.1 Some Important Classes That Deal with Resources
Class
Explanation
ResourceManager
Provides access to resources at runtime. This class can be
used to read information from resource-only assemblies.
ResourceReader
Enables you to read resources from a binary resource file.
ResourceWriter
Enables you to write resources to a binary resource file.
ResXResourceReader
Enables you to read resource information from an XML-based
.resx file.
ResXResourceWriter
Enables you to write resource information to an XML-based
.resx file.
Visual Studio .NET includes support for the creation of one type of
resource-only assembly—the satellite assembly. A satellite assembly is used
to store culture-specific information to support globalization. Globalization
is a process of creating world-ready applications; it involves changing the
applications interface based on the user’s currently selected language and culture (we cover globalization in greater detail in Chapter 8, “Globalization”).
111
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Components
. . . . . . .and
. . .NET
. . . Assemblies
. . . . . .
Practice Questions
Question 1
You need to create several forms capable of accepting and validating addresses, accepting information such as the name, street name, state, country, and ZIP
code using TextBox and ComboBox controls. You want to package your input
and validation code in a standard component so that you can reuse the control.
Which of the following classes should be the base class of your component?
❍ A. System.Windows.Forms.Control
❍ B. System.Windows.Forms.UserControl
❍ C. System.Windows.Forms.Form
❍ D. System.ComponentModel.Component
Answer B is correct. The System.Windows.Forms.UserControl class provides the capability to quickly create a reusable component by combining
existing Windows controls. Answer A is incorrect because extending the base
Control class provides a means of creating your own controls from scratch
rather than simply reusing existing Windows controls. Answer C is incorrect
because you would not use a form within another form as a control. Answer
D is incorrect because the base Component class is extended to create nonvisual components.
Question 2
You have defined a custom user-authentication component that raises an
Authenticated event whenever a user is successfully authenticated. When this
event fires, you want to make the username and SID (security identifier) available to the control container. How should you accomplish this requirement?
❍ A. Place the username and SID in properties of the component for the
container to retrieve.
❍ B. Pass the username and SID as parameters of the Authenticated event.
❍ C. Define global variables in a separate module and place the values in
those variables.
❍ D. Define a custom AuthenticatedEventArgs class that inherits from the
EventArgs class, and pass it as a parameter of the Authenticated event.
Answer D is correct. Using a class derived from EventArgs to pass event
parameters is preferable to using individual arguments because it is easier to
extend to include more parameters later. Answers A, B, and C are incorrect
112 Chapter 4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
because they all involve placing the variables in other locations, making them
harder to manipulate and update. Answer C also involves the use of a separate module, where the code from your control might be incapable of effecting changes.
Question 3
A friend attempts to host a control in Internet Explorer. He creates the control
and tests it successfully on a Windows Form, but he can’t get it to display in IE.
The name of the control is SolidControls.ColorMixer, within a DLL named
SolidControlsLib.dll. He has placed both the HTML page and the DLL in the
same virtual directory on the Web server.
He shows you the HTML file that hosts this control. Part of his HTML code is
listed here (line numbers are for reference purpose only):
01: <html>
02:
<body>
03:
<object id=”colorMixerX1”
04:
classid=”http://localhost/WebDir/
➥SolidControlsLib.dll”
05:
height=”300” width=”300”>
06:
</object>
07:
</body>
08: </html>
What change is needed to display this control in IE?
❍ A. Change the code in line 4 to:
classid=”http://localhost/WebDir/SolidControlsLib.
➥dll#SolidControls.ColorMixer”
❍ B. Change the code in line 4 to:
classid=”http://localhost/WebDir/SolidControlsLib.
➥dll?SolidControls.ColorMixer”
❍ C. Change the code in line 4 to:
classid=”SolidControls.ColorMixer”
❍ D. Change the code in line 4 to:
classid=”http://localhost/WebDir/SolidControlsLib.
➥dll?classid=SolidControls.ColorMixer”
Answer A is correct. The correct usage is to give the classid a string with the
virtual path to the control and the namespace-qualified name of the control
class, separated by the # sign. Answer B is incorrect because the separating
character is specified as the ? symbol. Answer C is incorrect because it is
missing the virtual path assignment. Answer D is incorrect because it
includes a second classid assignment as a divider.
113
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Components
. . . . . . .and
. . .NET
. . . Assemblies
. . . . . .
Question 4
You develop a Windows application that allows the users to view the global
product sales in a graphical format. Your application uses a shared assembly for
creating the graphs. Where should you copy the shared assembly so that other
applications can access it?
❍ A. In the bin directory of the application
❍ B. In the Global Assembly Cache
❍ C. In the Windows installation directory
❍ D. In the application’s root directory
Answer B is correct. Shared assemblies must be deployed in the Global
Assembly Cache. Answers A and D are not correct because only private
assemblies should be copied to the application’s root directory or a subdirectory. Answer C is not correct because it is not recommended to deploy private and shared assemblies to the Windows installation directory.
Question 5
You are creating an application that will be used company-wide. Several forms
show a clock to the user. You have decided to code the custom analog clock as
a reusable component. Which of the following classes should be the base class
for creating this control?
❍ A. System.Windows.Forms.Control
❍ B. System.Windows.Forms.UserControl
❍ C. System.Windows.Forms.Form
❍ D. System.ComponentModel.Component
Answer A is correct. You should inherit from the Control class if you want to
provide a custom graphical representation of your control or functionality
that is not available through standard controls. Answer B is incorrect because
the UserControl class provides the capability to quickly create a reusable
component by combining existing Windows controls. Answer C is incorrect
because you would not use a form within another form as a control. Answer
D is incorrect because the base Component class is extended to create nonvisual components.
114 Chapter 4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 6
You have designed a custom UserControl combining five TextBox controls and
two Button controls. You want only derived controls to be able to access the
contained objects within your control. You want your project classes to have
access to this control. Which modifiers should you use to achieve this requirement? (Select all correct answers.)
❑ A. private
❑ B. internal
❑ C. protected
❑ D. public
Answers B and C are correct. When you configure the contained objects
within a control as internal or protected, they are not accessible only within
the current project and derived classes. Answer B is incorrect because the
protected setting only limits access to the same project. Answer D is incorrect because the public modifier allows access from any application.
Question 7
You are designing a component that interacts with the computers in a network.
The component has no visual representation but should provide you with a
design time interface that will help client application designers to set its properties and behavior. Which of the following should you chose as the base class for
this control?
❍ A. System.Windows.Forms.Control
❍ B. System.Windows.Forms.UserControl
❍ C. System.Windows.Forms.Form
❍ D. System.ComponentModel.Component
Answer D is correct. Components that provide no visual interface should
derive directly from the System.ComponentModel.Component class.
Answers A and B are incorrect because the Control and UserControl classes
are used for components that need a visual representation. Answer C is
incorrect because a Form class is used as a container for other controls and
includes a visual representation.
115
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Components
. . . . . . .and
. . .NET
. . . Assemblies
. . . . . .
Question 8
Your Windows application utilizes several graphics files. You don’t want to have
to distribute additional files with your application. What should you do?
❍ A. Create a satellite assembly for storing graphics.
❍ B. Set the BuildAction property of the graphics files to Content.
❍ C. Set the BuildAction property of the graphics files to Compile.
❍ D. Set the BuildAction property of the graphics files to Embedded
Resources.
Answer D is correct. When you set the Build Action property of a graphics
file to Embedded Resources, the file is embedded with the main assembly file
(DLL or EXE). Answer A is incorrect because a satellite assembly is used to
include culture-specific information. Answer B is incorrect because the
Content setting causes the compilation to result in a main file that includes
only code, metadata, and references to external resource files that must be
distributed with the main file. Answer C is incorrect because compilation is
the process by which the assembly EXE or DLL is created.
Question 9
You have developed, tested, and deployed a Windows form application in your
company. The users use this application to create labels and bar code for various products that your company distributes. Users of the application complain
that it is slow when it is loaded for the first time, but it works fast after that.
Which of the following actions should you take to resolve this problem?
❍ A. Use gacutil.exe to install the assemblies in the Global Assembly Cache.
❍ B. Use ngen.exe to create native images from the managed assemblies
and store them in the native image cache.
❍ C. Use tlbexp.exe to generate type libraries from the application’s assemblies.
❍ D. Use regasm.exe to read the metadata within an assembly and add the
necessary entries to the Registry.
Answer B is correct. If the application is performing slowly when it is loaded
but performs well later, the most likely reason is that managed code needs to
be compiled into the native code. If you use the ngen.exe tool to precompile
all the assemblies to native assemblies, it will significantly improve the application’s startup performance.
116 Chapter 4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 10
Which of the following statements is true for a multifile assembly?
❍ A. Each file must contain an Assembly Manifest.
❍ B. Only one of the files can contain the Assembly Manifest.
❍ C. You can find the assembly to which a file belongs by opening that file
with the MSIL Disassembler (ildasm.exe).
❍ D. You can have files with the same name but different versions in a multifile assembly without conflicts.
Answer B is correct. Only one of the files in a multifile assembly can contain
the Assembly Manifest. Answer A is incorrect because only one Assembly
Manifest exists for each assembly. Answer C is incorrect because you cannot
find the name of the assembly to which a file belongs to by viewing it in
ILDASM. Only the Assembly Manifest contains this information. Answer D
is incorrect because it is not possible to have two files with same name in an
assembly; the most elementary unit of versioning is the assembly itself, so the
files contained in it cannot have different versions.
117
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Components
. . . . . . .and
. . .NET
. . . Assemblies
. . . . . .
Need to Know More?
Jeffrey Richter. Applied Microsoft .NET Framework Programming.
Microsoft Press, 2002.
Amit Kalani. MCAD/MCSD Training Guide (70-316): Developing
and Implementing Windows-Based Applications with Visual C# and
Visual Studio .NET. Que Certification, 2002.
Visual C# Support Center:
http://support.microsoft.com
?scid=fh;en-us;vcsnet.
Visual Studio .NET Support Center: http://support.
microsoft.com?scid=fh;en-us;vsnet.
5
Data Binding
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terms you’ll need to understand:
✓ Data binding
✓ Simple data binding
✓ Complex data binding
✓ One-way data binding
✓ Two-way data binding
✓ Relational database
✓ Data Form Wizard
✓ Filtering
✓ Transforming
✓ View
✓ Lookup
Techniques you’ll need to master:
✓ Understand the difference between simple and complex data
binding.
✓ Know the more common members of the CurrencyManager
class.
✓ Understand how to filter data within the client application and
at the server.
120 Chapter 5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Few applications will be completely monolithic or will operate without communicating with other files. Most applications will interact with some type of
data, whether in the form of a database, an array of values, or some other
form of data storage. In this chapter, we review the process of linking data to
the user interface and accessing only the data that the user needs. Chapter 6,
“Consuming and Manipulating Data,” covers consuming and manipulating
this data.
One of the most important programming tasks that you might face will be to
connect data to the user interface, a process referred to as data binding. An
application’s data model includes many data sources, such as databases, arrays
of values, XML files, or data values stored using objects within the
System.Collections namespace. It is often not desirable to provide all possible records to the user at one time, requiring data filtering to extract only the
target data. At other times, data might not be stored in a user-friendly form,
requiring transformation to a more useful format before it is presented within the user interface.
Binding Data to the User Interface
The process of data binding involves creating a link between the data model
and the user interface. Depending on your application’s requirement, you
may use different techniques for databinding:
➤ Simple data binding
➤ Complex data binding
➤ One-way and Two-way data binding
➤ The Data Form Wizard
Simple Data Binding
Simple data binding involves connecting a single value from the data model
to a single property of a control. By default, a new control is unbound. To
bind a control, you can add a new Binding object to its ControlDataBindings
collection, which is accessed through its DataBinding property. Using the
Add method for the Binding class requires the following information:
➤ The name of the bound property
➤ The data source to bind
➤ The navigation path to the data (empty if there is only a single property
of an object to bind)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data
. . . Binding
. . . .
Now that you’ve seen the basics of simple databinding, I’ll start by looking
at which entities can be bound to the user interface and which properties you
can bind to those entities. I’ll also explain the architecture that the .NET
Framework uses to manage simple data binding. You’ll see that you can work
directly with the objects that handle the databinding connections if you need
to interact with the databinding process from your code.
Bindable Entities and Properties
The Binding class can accept many data sources, including these:
➤ An instance of a class that implements the IBindingList or ITypedList
interface, including DataSet, DataTable, DataView, and
DataViewManager
➤ A class that implements the IList interface on an indexed collection of
objects, such as classes that inherit from System.Array
➤ An IList of strongly typed objects, such as an array of objects
A strongly typed object is explicitly declared to represent only one type. Unlike a weakly typed object, it cannot be used to represent a different type during the course of
execution.
You perform a simple data-binding operation by completing the following
steps:
1. Launch Visual Studio .NET and add a new Visual C# .NET Windows
Application project.
2. Add a TextBox control named txtVendorName to your form.
3. Add a new class named Vendor.cs, and provide this code for the class:
public class Vendor
{
private string vendorName;
public string VendorName
{
get
{
return vendorName;
}
set
{
vendorName = value;
}
}
public Vendor(string strVendorName)
{
this.VendorName = strVendorName;
121
122 Chapter 5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
}
}
4. Add the following code to the form’s code module:
private void Form1_Load(object sender, System.EventArgs e)
{
// Create an array of vendor objects
Vendor[] aVendors = new Vendor[3];
aVendors[0] = new Vendor(“Microsoft”);
aVendors[1] = new Vendor(“Rational”);
aVendors[2] = new Vendor(“Premia”);
// Bind the array to the textbox
txtVendorName.DataBindings.Add(“Text”, aVendors, “VendorName”);
}
5. Add a Main method to launch the form. Set the form as the startup
object for the project and run the project. The TextBox control is now
bound to the array, displaying its first value.
It is possible to bind data to any control that has a DataBindings property.
This includes all controls derived from the System.Windows.Forms.Control
class.
Data Binding Architecture
When a control is bound to a data source, the .NET Framework creates a
pair of objects to manage this link:
➤ CurrencyManager object—An instance of the CurrencyManager class, the
CurrencyManager object, keeps track of which element from a data
source is currently bound to a control. All controls on a form that are
bound to the same data source can share the same CurrencyManager
object.
➤ BindingContext object—An instance of the BindingContext class, the
BindingContext object, keeps track of the CurrencyManager objects on
a form, allowing navigation through the elements within the data source.
Container controls (such as GroupBox, Panel, or TabControl) can have
their own BindingContext object, allowing separate views of the same
data on a form.
The BindingManagerBase class is the abstract base class of both the
CurrencyManager and the BindingContext class and is used to manipulate
the current value of an individual property rather than the property of the
current object in a list. Table 5.1 details some of the most important members of this class.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data
. . . Binding
. . . .
Table 5.1 Important Members of the BindingManagerBase Class
Member
Type
Description
AddNew
Method
Adds a new object to the underlying list
Bindings
Property
Gives the collection of bindings being managed by
this class
CancelCurrentEdit
Method
Cancels any edit in progress
Count
Property
Gives the number of rows managed by the class
Current
Property
Gets the current object
CurrentChanged
Event
Fires when the bound value changes
EndCurrentEdit
Method
Commits any edit in process
GetItemProperties
Method
Lists item properties for the current object in the list
Position
Property
Gets or sets the position in the underlying list that is
bound with this class
PositionChanged
Event
Fires when the Position property changes
RemoveAt
Method
Removes the object at the specified position from
the underlying list
ResumeBinding
Method
Resumes data binding
SuspendBinding
Method
Suspends data binding
The CurrencyManager class extends the BindingManagerBase class to
include some additional members, detailed in Table 5.2.
Table 5.2 Additional Members of the CurrencyManager Class
Member
Type
Description
ItemChanged
Event
Occurs when the current item has been altered
List
Property
Gets the IList interface from the data source
Refresh
Method
Repopulates the bound controls
Remember that the ItemChanged event fires when the data itself is changed by some
external action, the CurrentChanged event fires when the data is changed within the
user interface, and the PositionChanged event fires when the Position property is
changed (which also fires the CurrentChanged event).
The BindingContext class provides a means of retrieving the
CurrencyManager objects on a form. Table 5.3 details some of the most
important members of this class.
123
124 Chapter 5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 5.3 Important Members of the BindingContext Class
Member
Type
Description
Contains
Method
Indicates whether the BindingContext contains a specific
BindingManagerBase object.
Items
Property
Retrives a BindingManagerBase object. This property is an
indexer for the BindingContext class.
Complex Data Binding
Complex data binding involves binding a control to an entire collection of
data rather than to a single data item. Figure 5.1 shows an example of complex binding between a DataGrid control and the Suppliers table within the
Northwind database.
Figure 5.1 A DataGrid control displaying the Suppliers table of the Northwind database.
Binding to a Control
The ComboBox and ListBox controls are used to allow selection of a value
from a listing of values, which might be bound to the control through a complex binding. You perform a complex data binding operation using a ListBox
control by completing the following steps:
1. Launch Visual Studio .NET and add a new Visual C# .NET Windows
Application project.
2. Add a ListBox control named lbExams to your form.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data
. . . Binding
. . . .
3. Add a new class named Exam.cs, and provide this code for the class:
public class Exam
{
private String examNumber;
private String examName;
public String ExamNumber
{
get
{
return examNumber;
}
}
public String ExamName
{
get
{
return examName;
}
}
public Exam(String strExamNumber, String strExamName)
{
examNumber = strExamNumber;
examName = strExamName;
}
}
4. Add the following code to the form’s code module:
private void Form1_Load(object sender, System.EventArgs e)
{
Exam[] aExams = {new Exam(“305”, “Web Applications With VB.NET”),
new Exam(“306”, “Windows Applications With VB.NET”),
new Exam(“310”, “XML With VB.NET”),
new Exam(“315”, “Web Applications With Visual C# .NET”),
new Exam(“316”, “Windows Applications With Visual C# .NET”),
new Exam(“320”, “XML With Visual C# .NET”)};
lbExams.DataSource = aExams;
lbExams.DisplayMember = “ExamName”;
}
5. Set the form as the startup object for the project, add a Main method
that launches the form, and run the project. The ListBox control displays the ExamName property of all objects in the array.
It is also possible to bind multiple data sources to the same control, using the
properties of the control to provide a link between the data bindings. You can
modify the ListBox example to do this by following these steps:
1. Open your project, add a second class named Candidate.cs, and pro-
vide this code for the new class:
public class Candidate
{
private string examNumber;
125
126 Chapter 5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
private string candidateName;
public string ExamNumber
{
get
{
return examNumber;
}
set
{
examNumber = value;
}
}
public string CandidateName
{
get
{
return candidateName;
}
set
{
candidateName = value;
}
}
public Candidate(String strCandidateName, String strExamNumber)
{
this.CandidateName = strCandidateName;
this.ExamNumber = strExamNumber;
}
}
2. Add two Label controls, two Button controls (btnPrevious and btnNext),
and two TextBox controls (txtCandidateName and txtExamNumber) to
your form.
3. Modify the form’s code module to this:
private Candidate[] aCandidates = {
new Candidate(“Bill Gates”, “305”),
new Candidate(“Steve Ballmer”, “320”)};
private void Form1_Load(object sender, System.EventArgs e)
{
Exam[] aExams ={
new Exam(“305”, “Web Applications With VB.NET”),
new Exam(“306”, “Windows Applications With VB.NET”),
new Exam(“310”, “XML With VB.NET”),
new Exam(“315”, “Web Applications With Visual C# .NET”),
new Exam(“316”, “Windows Applications With Visual C# .NET”),
new Exam(“320”, “XML With Visual C# .NET”)};
lbExams.DataSource = aExams;
lbExams.DisplayMember = “ExamName”;
lbExams.ValueMember = “ExamNumber”;
txtCandidateName.DataBindings.Add(
“Text”, aCandidates, “CandidateName”);
txtExamNumber.DataBindings.Add(
“Text”, aCandidates, “ExamNumber”);
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data
. . . Binding
. . . .
lbExams.DataBindings.Add(
“SelectedValue”, aCandidates, “ExamNumber”);
}
private void btnPrevious_Click(object sender, System.EventArgs e)
{
this.BindingContext[aCandidates].Position -= 1;
}
private void btnNext_Click(object sender, System.EventArgs e)
{
this.BindingContext[aCandidates].Position += 1;
}
4. Set the form as the startup object for the project, include the Main
method to launch the form, and run the project. The ListBox control
displays the ExamName property of all objects in the array, as before.
However, if you change the selected value within the ListBox or
txtExamNumber controls, the change is reflected in the other as soon
as the change is committed by tabbing to another control.
When using the Position method of the BindingContext property, incrementing one
element forward is accomplished by += 1, while decrementing is accomplished by
-= 1.
Using the DataGrid Control
The DataGrid control is also a popular control used to present complex
bound data. Its AutoFormat capability allows for the selection of many different formats, as shown in Figure 5.2.
Figure 5.2 Three DataGrid controls formatted using different AutoFormat selections.
If you want to set the formatting options of a DataGrid control more directly, many useful settings are available. Table 5.4 details some of the most useful display properties of the DataGrid control.
127
128 Chapter 5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 5.4 DataGrid Control Display Properties
Property
Explanation
AlternatingBackColor
Background color to use for even-numbered rows in the grid
BackColor
Background color to use for odd-numbered rows in the grid
BackgroundColor
Color to use for any portion of the control that is not filled
with data
BorderStyle
Select from None, FixedSingle, or Fixed3D for the border style
CaptionBackColor
Background color for the caption portion of the control
CaptionFont
Font for the caption portion of the control
CaptionText
Display text for the caption portion of the control
CaptionVisible
Boolean property that controls whether a caption will be displayed
ColumnHeadersVisible
Boolean property that controls whether each column will have
a header
FlatMode
Boolean property that controls whether the grid will have a 3D
or a flat appearance
Font
Font for text in the control
ForeColor
Foreground color for text in the control
GridlineColor
Color for the lines of the grid
GridlineStyle
Either None or Solid
HeaderBackColor
Background color for column and row headers
HeaderFont
Font for column and row headers
HeaderForeColor
Foreground color for column and row headers
LinkColor
Color to use for hyperlinks between sections of the control
ParentRowsBackColor
Background color to use for the parent row’s area
ParentRowsForeColor
Text color to use for the parent row’s area
ParentRowsLabelStyle
Either None, TableName, ColumnName, or Both
ParentRowsVisible
Boolean property that controls whether the parent row’s area
is visible
PreferredColumnWidth
Default width for columns (pixels)
PreferredRowHeight
Default height for rows (pixels)
RowHeadersVisible
Boolean property that controls whether each row will have a
header
RowHeaderWidth
Default width of row headers (pixels)
SelectionBackColor
Background color for selected cells
SelectionForeColor
Text color for selected cells
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data
. . . Binding
. . . .
One-Way and Two-Way Data Binding
Data binding can be either one-way or two-way. In one-way data binding,
changes to the underlying data model are reflected in the bound property of
the control, but changes to the bound property are not propagated back to
the data model. In two-way data binding, changes to the bound property value
of the control also are reflected in the underlying data model, and vice versa.
This is typically accomplished through the Update method of the
DataAdapter object, which is covered in Chapter 6.
In some cases, such as with the DataSet class, the data model and the actual original source of the data are not the same. This requires additional code to change
values in the original data source to reflect changed values within the data model.
The Data Form Wizard
Visual Studio .NET includes a utility named the Data Form Wizard that
automates much of the configuration necessary when creating data-bound
forms. This utility can be used to create single-table forms as well as multitable forms. Multitable forms rely on key field relationships between tables
to associate records in one table with those in another.
A database is a collection of tables. Tables contain rows of data called records, and
records are made up of elements (also called fields) that are arranged in columnar layout. Relational databases use a key column to link related data between tables. A foreign key value in one table relates records in that table to a record in another table that
has a matching primary key value.
Transforming and Filtering Data
You usually want to present less than the total number of records available to
your users, to make your application more user-friendly. If you have a table
named Invoices that has a few hundred thousand entries and you need a listing of open invoices only for a particular customer, it would not be good
design planning to require users to find the few necessary records.
Restricting data returned to the user interface is a process known as filtering.
Your database might also record the clientID field for each invoice, and you
want to provide the data to your users with a more useful name value.
Manipulating output data is a process referred to as transformation.
129
130 Chapter 5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Server Explorer
Before we address filtering and data transformation, you should be familiar
with the Server Explorer, which is available in the Visual Studio .NET IDE.
The Server Explorer provides ready access to available data connections and
other services, some of which are listed in Table 5.5.
Table 5.5 Manageable Resources Available Through the Server Explorer
Resource Type
Represents
Data connection
A connection to a particular database
Crystal Services
Options for Crystal Reports
Event Logs
Windows event logs
Message Queues
Windows message queues
Performance Counters
Windows performance counters
Services
Windows services
SQL Servers
Microsoft SQL Servers
When creating data-bound applications, you add a data connection by completing the following steps:
1. Open a Visual C# .NET Windows Application project.
2. Expand the Server Explorer, right-click the Data Connections node,
and select Add Connection from the options provided.
3. Provide the connection information necessary for your data source.
The default is the Microsoft OLE DB Provider for SQL Server, but
others are available, including Oracle and Jet (Access) database support.
4. Click OK to create the new data connection. This new connection
remains across all of your projects unless you right-click the connection and select Delete.
5. Left-click on an element within the Data Connections node and drag it
to a form within your project. This automatically creates the necessary
code for the relevant data source used within your application.
When working with Microsoft SQL Server 7 and above, dragging and dropping a
database onto a form creates a new SqlConnection object. Tables, views, or columns
create a new SqlDataAdapter object. Stored procedures and table-valued functions
create a new SqlCommand object. All of these are members of the
System.Data.SqlClient namespace and are covered in more detail in Chapter 6.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data
. . . Binding
. . . .
Filtering and Transforming Data
Filtering data involves selecting a subset of available data. Filtering can be
performed in the application client using a DataView object or on the server using an SQL view. The DataView object or the SQL view can also be
used to transform data into a more user-friendly format, such as translating
a CustomerID field for a series of invoices into a human-readable
CustomerName value before presenting the information to the user interface for display.
A DataView object represents a bindable, filterable view of a DataTable. A
DataSet contains a collection of DataTable objects, such as the Tables collection and the Relations collection, that is made up of DataRelation
objects.
The following example assumes that you have the default Northwind database available on an SQL Server. It is also possible to create a Data Connection to the Jet
(Access) version of the Northwind database to perform this example.
You can create a DataSet and filter the resulting data using a DataGrid
control by following these steps:
1. Open a Visual C# .NET Windows Form project, and expand the
Server Explorer.
2. Expand the Data Connections node to show the SQL Server connec-
tion for the Northwind database.
3. Expand the Tables node of this datbase. Drag the Customers table and
drop it on your form, creating two new data objects (SqlConnection1
and SqlDataAdapter1).
4. Select the SqlDataAdapter1 object and click the Generate Dataset link
in the Properties window. Name the DataSet as dsCustomers1 and
click OK.
5. Add a DataGrid control (dgCustomers) on your form and set its
CaptionText property to Customers.
6. Open the form’s code module and add the following:
private void Form1_Load(object sender, System.EventArgs e)
{
sqlDataAdapter1.Fill(dsCustomers1, “Customers”);
System.Data.DataView dvCustomers = new
System.Data.DataView(dsCustomers1.Tables[“Customers”]);
dvCustomers.Sort = “ContactName”;
131
132 Chapter 5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
dvCustomers.RowFilter = “Country = ‘France’”;
dgCustomers.DataSource = dvCustomers;
}
7. Set the form as the startup object for the project, add a Main to launch
the form, and run the project. The DataGrid displays the filtered data,
showing only Customers from France, sorted by the ContactName
field.
Client-side filtering using the DataView is useful but can be very inefficient
when dealing with large sets of data. Instead of sending everything over the
network and then selecting the needed data, it is more efficient to create a
SQL view on the server, which is a derived set of data that acts much like a
table. The SQL view can be configured to present only the desired subset of
data, minimizing the amount of data that must be transferred over the network to your client application.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data
. . . Binding
. . . .
Practice Questions
Question 1
Your application includes a form that displays employee names in a simplebound TextBox control. You’d like to add a tooltip to the TextBox control, with
the tooltip displaying the title of the employee. The employee names and
employee titles are both supplied by the same IList. How can you do this?
❍ A. Bind the employee title to the Tag property of the TextBox control. In
the event handler for the PositionChanged event of the
CurrencyManager object, call the ToolTip’s SetToolTip method to copy
the value from the Tag property to the Tooltip.
❍ B. Bind the employee title to the Name property of the ToolTip control.
❍ C. Bind the employee title to the Tag property of the TextBox control. In
the event handler for the CurrentChanged event of the
CurrencyManager object, call the ToolTip’s SetToolTip method to copy
the value from the Tag property to the Tooltip.
❍ D. Bind the employee title to the Tag property of the TextBox control. In
the event handler for the ItemChanged event of the CurrencyManager
object, call the ToolTip’s SetToolTip method to copy the value from the
Tag property to the Tooltip.
Answer A is correct. You should bind the employee title to the Tag property
of the TextBox control and then in the event handler for the
PositionChanged event of the CurrencyManager object, call the ToolTip’s
SetToolTip method to copy the value from the Tag property to the Tooltip.
Answer B is not correct because the value displayed by the Tooltip can only
be set with the SetToolTip method. Answers C and D are not correct
because the appropriate event for renewing the Tooltip is the
PositionChanged event, which fires whenever a record becomes current.
Question 2
Which form of data binding must be used when populating a DataGrid component? (Select the best answer.)
❍ A. Simple data binding
❍ B. One-way data binding
❍ C. Two-way data binding
❍ D. Complex data binding
133
134 Chapter 5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Answer D is correct. Complex data binding involves binding an entire group
of data to a control, such as when populating a DataGrid control. Answer A
is incorrect because simple data binding involves the association of a single
element or value to the bound control. Answers B and C are incorrect
because they involve whether changes are made to data within the component, and the proposed scenario could be of either type.
Question 3
You have an XML file containing information on customers. You plan to make
this information available to your users by using simple databinding to controls
on the user interface. What must you do?
❑ A. Transfer the data from the XML file to a data structure that implements
the IList, IBindingList, or ITypedList interfaces.
❑ B. Create an XML Web Service to retrieve information from the file.
❑ C. Store the XML file in a SQL Server database.
❑ D. Set the Tag property of each control that you will use for databinding
to “XML”.
Answer A is correct. Only this answer will produce data that can be bound.
Answers B, C and D are not correct because the data in these solutions cannot be bound to the controls.
Question 4
Your application includes a SqlDataAdapter object named sqlDataAdapter1 that
was created by dragging and dropping the Physicians table from a database to
your form. Your application also includes a Dataset named dsPhysicians1,
based on this SqlDataAdapter. What line of code should you use to load the data
from the database into the Dataset?
❍ A.
dsPhysicians = sqlDataAdapter1.Fill(“Physicians”);
❍ B.
sqlDataAdapter1.Fill(“dsPhysicians1”, “Physicians”);
❍ C.
sqlDataAdapter1.Fill(dsPhysicians1);
❍ D.
sqlDataAdapter1.Fill(dsPhysicians1, “Physicians”);
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data
. . . Binding
. . . .
Answer D is correct. In a call to the Fill method of a SqlDataAdapter object,
you must specify the Dataset to fill as an object and the table to fill as a string.
Answer A is not correct because the return type of the Fill method is an int
value instead of DataSet. Answer B is not correct because the first argument
to the Fill method should be type DataSet instead of String. Answer C is not
correct because if you do not specify the name of the data table in the second
parameter, the Fill method adds or refreshes data into a table named “Table”.
Question 5
Which data binding class forms the parent for the others? (Select the best
answer.)
❍ A. CurrencyManager
❍ B. BindingContext
❍ C. BindingManagerBase
❍ D. BaseCollection
❍ E. BindingsCollection
Answer C is correct. The BindingManagerBase class is an abstract class that
is implemented in both the CurrencyManger and the BindingContext classes, making answers A and B incorrect. Answer D is not correct because the
BaseCollection class provides the base functionality for creating data-related
collections. Answer E is not correct because the BindingsCollection class
represents a collection of Binding objects for a control.
Question 6
Which of the following events would be triggered by incrementing the Position
property of a CurrencyManager object by one? (Select all that apply.)
❑ A. CurrentChanged
❑ B. ItemChanged
❑ C. ValueChanged
❑ D. PositionChanged
Answers A and D are correct. When the Position value is changed, the
PositionChanged and CurrentChanged events fire. Answer B is incorrect
because the ItemChanged value fires when the underlying data is changed by
an external action. Answer C is incorrect because no ValueChanged event is
defined within the CurrencyManager class.
135
136 Chapter 5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 7
Your application is connected to a SQL Server database that contains customer
and order information. You have a form in your application that fills a Dataset
with information from the Orders table that includes the CustomerID. The
Dataset is displayed on the form by using complex data binding to a DataGrid.
Now you’ve been asked to display the CustomerName column from the
Customers table in the DataGrid, instead of the CustomerID column. How
should you proceed?
❍ A. Create a view in the SQL Server database that combines the
Customers and Orders tables. Replace the Dataset on the form with a
new Dataset based on this new view. Bind the new Dataset to the
DataGrid.
❍ B. Add a second Dataset to the form. Base the second Dataset on the
Customers table from the database. Use each Dataset to fill the appropriate columns of the DataGrid.
❍ C. Create a DataView in code from the existing Dataset. Filter the
DataView to remove the CustomerID column.
❍ D. Add an array of Customer objects to your application and initialize it in
code with customer names and IDs. Use a view to join this array to the
existing Dataset.
Answer A is correct. Only answer A lets you set up the DataGrid so that it’s
automatically kept up to date. Answers B and C are unworkable. Answer D
requires you to maintain the code to synchronize the array with the actual
data in the database.
Question 8
Which of the following DataGrid control properties specifies the color to use on
odd-numbered rows in the grid?
❍ A. BackColor
❍ B. BackgroundColor
❍ C. AlternatingBackColor
❍ D. ParentRowsBackColor
❍ E. SelectionBackColor
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data
. . . Binding
. . . .
Answer A is correct. The BackColor property specifies the color to be used
for odd-numbered rows on the grid; the AlernatingBackColor property specifies the color to be used for even-numbered rows, making answer C incorrect. Answer B is incorrect because the BackgroundColor property specifies
the color to be used to fill any area without data. Answer D is incorrect
because the ParentRowBackColor property specifies the color to be used for
the background of the parent row’s area. The SelectionBackColor property
specifies the color to be used to highlight currently selected cells, making
answer E incorrect as well.
Question 9
You have a large database made up of customer and order records, linked by a
CustomerID field. You want to provide access to all open orders from customers
located in Texas, sorted by customer. What is the best solution to fulfill this
requirement in the most efficient manner? (Select the best answer.)
❍ A. Create a lookup view on the server to translate each Order.CustomerID
value into its State value and sort by state for Texas.
❍ B. Create a view on the server that limits the result set to records with a
related address State value of Texas.
❍ C. Bind the table to a DataView component and restrict the records to
those with a State value of Texas.
❍ D. Create a view on the server to translate each Order.CustomerID value
into its State value, and filter the records to include only those from
Texas.
Answer B is correct. The best solution is to create a server-side multitable
view that filters for open records in the Orders table that are related to customers with a Customers.State value of Texas. Answers A and D are incorrect because both involve the translation of an order’s CustomerID into its
related State value, which would prevent sorting by customer without adding
another field. The requirement mandates the most efficient method, making
answer C incorrect because a client-side filtering solution requires all data to
be first sent to the client and then filtered.
137
138 Chapter 5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 10
You are working with a complex form that uses Panel controls to organize a
large amount of data. The form displays information from six different data
sources. Some of the panels contain data from more than one data source.
You have added navigation buttons to scroll through the data in one particular
data source. The navigation buttons increment and decrement the Position
property of a CurrencyManager object. You test the form, and the buttons do not
appear to scroll the data in that data source. What could be the problem?
(Choose two.)
❑ A. There are too many controls on the form, so your code is not being
executed.
❑ B. You retrieved the CurrencyManager through the Form’s BindingContext
object, but the Panel control has its own BindingContext object.
❑ C. This particular CurrencyManager object does not support a Position
property.
❑ D. The BindingContext object that you’re using has more than one
CurrencyManager object, and you’re working with the wrong one.
Answer B and D are correct. You are working with the wrong
CurrencyManager object because you retrieved the CurrencyManager
through the Form’s BindingContext object, but the Panel control has its own
BindingContext object. Answer A is not correct because it would take a truly
astronomical number of controls to cause problems with .NET’s code execution. Answer C is not correct because all CurrencyManager objects support a Position property.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data
. . . Binding
. . . .
Need to Know More?
Kalani, Amit. MCAD/MCSD Training Guide (Exam 70-316):
Developing and Implementing Windows-based Applications with Visual
C# .NET and Visual Studio .NET, Que Certification, 2003.
Moore, Thomas. MCSE/MCSD Training Guide: SQL Server 2000
Database Design and Implementation (Exam 70-229), Que
Certification, 2002.
Microsoft ADO.NET Support Center: http://support.
microsoft.com? id=fh;en-us;adonet.
Microsoft SQL Server Site: www.microsoft.com/sql.
139
6
Consuming and
Manipulating Data
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terms you’ll need to understand:
✓ System.IO and System.Xml namespaces
✓ ADO.NET
✓ Transact-Structured Query Language (T-SQL)
✓ FileStream and DataAdapter objects
✓ DataView object
✓ Extensible Markup Language (XML)
✓ XmlDocument and XmlDataDocument objects
Techniques you’ll need to master:
✓ Understand ad-hoc queries and stored procedures.
✓ Know how to construct basic T-SQL statements, including
SELECT, INSERT, UPDATE, and DELETE, as well as SQL
Server stored procedures.
✓ Know which objects are part of the System.Data namespace
shared by all data providers and which are part of specific data
provider namespaces, such as System.Data.SqlClient and
System.Data.OleDb.
✓ Understand how to use the DataSet object to make data available within your application.
✓ Know how to read and write XML data and synchronize an
XML document.
142 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Now that you know how to bind controls to the data model, you should
develop an understanding of the basics involved in manipulating and consuming (using) data from a variety of sources.
The .NET Framework includes support for data in various forms, including
the following:
➤ System.IO namespace to access file-based data storage
➤ System.Data, System.Data.SqlClient, and System.Data.OleDb,
System.Data.Common and System.Data.SqlTypes namespaces (which
are collectively known as ADO.NET) used to access relational databases
➤ System.Xml and its other child namespaces to manipulate XML data
files
This chapter focuses on accessing data located in external disk files, relational databases, and XML files, along with a brief review of SQL Server
operation and the handling of data errors.
Transact-SQL
Microsoft’s implementation of the Structured Query Language (SQL) standard is named Transact-SQL (T-SQL). T-SQL queries provide a flexible
way of retrieving data from a SQL Server database or making changes to that
database. The four main T-SQL statements that help you manipulate SQL
Server data are as follows:
➤ SELECT statement—Used to retrieve stored data
➤ INSERT statement—Used to add new data
➤ UPDATE statement—Used to modify existing data
➤ DELETE statement—Used to remove existing data
T-SQL is derived from the American National Standards Institute (ANSI) SQL-92
standard.
The SELECT Statement
The SELECT statement is used to retrieve data from one or more tables in
a database. A SELECT statement looks like this:
143
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Consuming
. . . . . . and
. . Manipulating
. . . . . . . .Data
. .
SELECT field_list
FROM table_list
WHERE where_clause
GROUP BY group_by_clause
HAVING having_clause
ORDER BY sort_clause
The order of these clauses is fixed, although only the SELECT and FROM
clauses are required. The rest are optional, as in this example:
SELECT CustomerID as CustID, CustomerName as CustName
FROM Customers
This would return the CustomerID and CustomerName fields for all records
in the Customers table, naming the resulting fields CustID and CustName,
respectively. It is also possible to select all fields in a table using the asterisk
(*) character, as shown here:
SELECT *
FROM Customers
In addition, it is possible to select data from multiple tables at once, as in this
example:
SELECT Customers.CustomerID as CustID, O.OrderID as OrdID
FROM Customers INNER JOIN Orders as O
ON Customers.CustomerID = O.CustomerID
Note the use of the <table1> INNER JOIN <table2>...ON <relationship>
syntax. This causes the result to include only those records in each table that
have a matching value in the other table. Without this, the query could result
in a cross-product result set, in which the result set includes one row in the
output for each row in each combination of input table rows. This can rapidly bloom into a huge result set. A cross-product of two tables, each with
only 100 records, results in 100 × 100 = 10,000 records returned.
You can filter the result set generated by a SELECT query by including a
WHERE clause, as in this example:
SELECT TOP 50 *
FROM Customers
WHERE State = ‘Washington’
AND CustomerName LIKE ‘B%’
AND CurrentCredit < 5000
ORDER BY CurrentCredit DESC, CustomerName
This example selects the first 50 matching records from the Customers database where the State field holds the value of Washington, the
CustomerName begins with the letter B, and the customer’s CurrentCredit
value is less than 5,000. When selecting the first 50, the order is determined
by sorting in descending order on the CurrentCredit value first, and then in
144 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ascending order on the CustomerName field when the CurrentCredit values
match.
Wildcard values can be used in SQL language queries by using the LIKE keyword
instead of the equals sign (=) and by placing the wildcard symbol (%) (for zero or
more characters and _ for one character) in the desired location within the test
string. It is also possible to search for a single-replacement character within a set of
values using square brackets ([]). In this way, ...WHERE ProductID LIKE ‘PANT[ABC]’... would return all records whose ProductID matches PANT-A, PANT-B, or
PANT-C.
You can use the GROUP BY clause in a query to retrieve a result set with summarized information. You can make use of aggregate functions within an
SQL query statement along with the GROUP BY clause to retrieve summarized information, as shown here:
SELECT Count(CustomerID) as CustCount, State
FROM [Customer Data]
GROUP BY State
ORDER BY CustCount DESC
This generates a result set that counts the number of customers for each
State from the Customer Data table; it is ordered by the customer count per
state in descending order. Note the use of square brackets ([ ]) to enclose the
Customer Data table name. This is required because the table name includes
a space.
Some of the more common aggregate functions used with the GROUP BY
clause include these:
➤ Count function—Counts the number of returned records
➤ Sum function—Adds the values of all returned records
➤ Avg function—Returns the average value for all returned records
➤ Min function—Returns the smallest value within all returned records
➤ Max function—Returns the largest value within all returned records
When working with aggregate functions, it is important to identify whether
a restricting filter is applied in the proper manner. The WHERE clause
allows filtering of values that will be handed to the aggregating function. The
HAVING clause can be used to filter based on the final aggregated value, as
here:
SELECT ProductID, Sum(Quantity) AS TotalSales
FROM [Order Details]
WHERE Quantity > 10
GROUP BY ProductID
HAVING Sum(Quantity) > 1000
ORDER BY Sum(Quantity) DESC
145
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Consuming
. . . . . . and
. . Manipulating
. . . . . . . .Data
. .
In this example, the WHERE clause causes the query to exclude records with
a Quantity value greater than 10 for aggregation. The HAVING clause causes the record set to return only TotalSales values for Products whose
Quantity (ignoring the already excluded records) exceeds 1000.
SELECT INTO is a special case of the SELECT statement that can be used
to create a new table from the result set, as shown here:
SELECT * INTO BadCustomers
FROM Customers
WHERE CurrentCredit < 5000
The INSERT Statement
The INSERT statement is used to add new records to a table, and it can be
used to insert a single record or multiple records in one statement. An example of a single record insertion is as follows:
INSERT INTO [Order Details]
(OrderID, ProductID, UnitPrice, Quantity, Discount)
VALUES (10248, 2, 12.00, 5, 0)
Here, the values of the new record are inserted in the order of the defined
field list. If the list of values exactly matches the order of the fields in the
table, you can omit the field list, as shown here:
INSERT INTO [Order Details]
VALUES (10248, 1, 12.00, 5, 0)
This method has several drawbacks, including the need to rewrite your
queries if the underlying table organization should be changed or when a
field has values that are automatically generated by the SQL server.
It is also possible to insert multiple records using a single INSERT statement, as shown in this example:
INSERT INTO Products (SupplierID, ProductName, CategoryID )
SELECT SupplierID, ‘Trout’, 8
FROM Suppliers
Note that a SELECT statement is used to provide the record set that will be
inserted into the table.
The UPDATE Statement
The UPDATE statement allows modification of existing values stored within the database. It is possible to update a single record or multiple records in
a single statement, even allowing multiple fields to be updated using a single
UPDATE statement, as shown here:
146 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
UPDATE Customers
SET ContactName = ‘Maria Anders’, Discount = Discount * 2
WHERE CustomerID LIKE ‘AL%’
In this example, all records within the Customers table with a CustomerID
starting with AL are updated with a ContactName of Maria Anders and a
Discount that is twice the current Discount value.
Updating values in one table based on those in another related table is also
possible, as shown here:
UPDATE Products INNER JOIN
ON Suppliers.SupplierID =
SET Products.Discontinued
WHERE Suppliers.Country =
Suppliers
Products.SupplierID
= 1
‘Italy’
The DELETE Statement
The DELETE statement uses an identical format as the SELECT statement
to specify records that will be deleted. However, the DELETE statement
does not specify any column list like the SELECT statement does because it
removes the specified row(s) from the table:
DELETE FROM Customers WHERE CustomerID = ‘GODOS’
Querying SQL Server
T-SQL statements are used to manipulate the data present within an SQL
Server database. These commands can be passed in an ad-hoc manner to the
server or can be compiled as stored procedures on the server itself. The
advantage of using stored procedures is that they are faster than ad-hoc
queries. The disadvantage of stored procedures is that they are not as flexible as ad-hoc queries, which can be created within your application at runtime.
Ad-Hoc Queries
Microsoft provides several methods to allow you to execute ad-hoc queries:
➤ Visual Studio .NET IDE—Using the Server Explorer, you can create a
new view within the Views folder of a Data Connection object. When
you run this query, the results are displayed.
➤ OSQL—This command-line utility ships with SQL Server and can be
used to execute ad-hoc queries.
147
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Consuming
. . . . . . and
. . Manipulating
. . . . . . . .Data
. .
➤ SQL Query Analyzer—This full-featured GUI utility provided with SQL
Server includes templates for common queries, integrated performance
analysis, and an object browser that enables you to see the structure of
SQL Server objects.
➤ .NET application—You can use a .NET application to submit an ad-hoc
query and then display the returned result set.
You can create an application that will submit an ad-hoc SQL query and display its returned result set as follows:
1. Open a Visual C# .NET Windows application and expand the Server
Explorer.
2. Expand the Data Connections node to show the SQL Server connec-
tion for the Northwind database, created in Chapter 5, “Data
Binding.”
3. Drag the data connection and drop it on your form, creating a new
sqlConnection1 object.
4. Add a TextBox control (txtQuery), a Button control (btnExecute), and
a DataGrid control (dgResults) on your form. Set the Multiline property of the TextBox to true, and set the CaptionVisible property of the
DataGrid to false. Refer to Figure 6.1 for the design of this form.
5. Switch to Code view and add the following using directives:
using System.Data;
using System.Data.SqlClient;
6. Double-click the Button control and add the following code to the
Click event handler for the btnExecute control:
private void btnExecute_Click(object sender, System.EventArgs e)
{
SqlCommand cmd = sqlConnection1.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = txtQuery.Text;
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
da.Fill(ds, “Results”);
dgResults.DataSource = ds;
dgResults.DataMember = “Results”;
}
7. Set the form as the startup object for the project, add a Main method,
and run the project.
8. Enter a query in the TextBox, such as:
SELECT * from Employees
148 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9. Click the botton to execute your ad-hoc statement and display the
result set using the DataGrid, as shown in Figure 6.1.
Figure 6.1 An ad-hoc query run within the example form.
Stored Procedures
Stored procedures are precompiled SQL queries that are stored on the server,
allowing them to run much more quickly than ad-hoc queries that must
first be translated into machine code before execution. Stored procedures
can make use of input and output parameters, designated using the @
symbol (example: @TotalSales), as well as special variables such as the
@@IDENTITY variable that returns the most recently assigned identity
column value. You also can make use of parameters within your application
code to prompt the user for an input value.
A column with the IDENTITY constraint is given a unique initial value by SQL Server;
however, unless other constraints are placed on the column, this value can later be
changed. To ensure that a primary key value remains unique, you should use the
PRIMARY KEY constraint.
Stored procedures can be created using any of the same methods used to execute ad-hoc queries, through the use of the CREATE PROCEDURE
(CREATE PROC) statement, as shown here:
CREATE PROCEDURE procGermanCustomers
AS
SELECT * FROM Customers
WHERE Country = ‘Germany’
149
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Consuming
. . . . . . and
. . Manipulating
. . . . . . . .Data
. .
After creating the stored procedure, you must save it and then run it to cause
the database server to compile the SQL statement and store a copy of the
compiled stored procedure.
The ExecuteNonQuery method of the SqlCommand object can be used to execute
an ad-hoc query or stored procedure that does not return any results to the user.
You also can specify variable parameters that provide input and output values
for use with your stored procedure, as in the following example, which
accepts the input parameter @CustomerID and returns an output parameter
value through @TotalSales:
CREATE PROC procCustomerSales
@CustomerID char(5),
@TotalSales money OUTPUT
AS
SELECT @TotalSales = SUM(Quantity * UnitPrice)
FROM ((Customers INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID)
INNER JOIN [Order Details]
ON Orders.OrderID = [Order Details].OrderID)
WHERE Customers.CustomerID = @CustomerID
After creating this stored procedure using whichever means you prefer, you
can create a sample form that uses the procedure through the following:
1. Open a Visual C# .NET Windows application and expand the Server
Explorer.
2. Expand the Data Connections node to show the SQL Server connec-
tion for the Northwind database.
3. Drag the data connection and drop it on your form, creating a new
sqlConnection1 object.
4. Add two Label controls, two TextBox controls (txtCustomerID and
txtTotalSales), and a Button control (btnGetTotalSales) on your form.
5. Switch to Code view and add the following using directives:
using System.Data.SqlClient;
using System.Data.SqlTypes;
6. Double-click the Button control and add the following code for the
Click event handler of the btnGetTotalSales control:
private void btnGetTotalSales_Click(object sender, System.EventArgs e)
{
SqlCommand cmd = sqlConnection1.CreateCommand();
150 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = “procCustomerSales”;
cmd.Parameters.Add(new SqlParameter(“@CustomerID”,SqlDbType.Text,5));
cmd.Parameters[“@CustomerID”].Value = txtCustomerID.Text;
cmd.Parameters.Add(new SqlParameter(“@TotalSales”, SqlDbType.Money));
cmd.Parameters[“@TotalSales”].Direction = ParameterDirection.Output;
sqlConnection1.Open();
cmd.ExecuteNonQuery();
txtTotalSales.Text = String.Format(“{0:c}”,
cmd.Parameters[“@TotalSales”].Value);
sqlConnection1.Close();
}
7. Set the form as the startup object for the project, add a Main method,
and run the project. Enter a CustomerID from the Customers table in
the first TextBox. The form executes your stored procedure and
returns the TotalSales value in the second TextBox.
Data Access
Within the .NET Framework, data access primarily falls within three general categories:
➤ File-based data storage, handled by the System.IO namespace
➤ Relational database storage, handled by the System.Data,
System.Data.SqlClient, System.Data.OleDb, System.Data.Common,
and System.Data.SqlTypes namespaces that make up ADO.NET
➤ XML data files, handled by the System.Xml namespace
Disk Files
One of the oldest forms of storage still in common use involves the storage
of data within simple disk files, often referred to as flat files to distinguish
them from the more structured relational database and hierarchical XML
storage models.
Browsing
When your application needs to include external file data, it is often useful
to allow users to browse to the desired file’s location. This is accomplished
by invoking an instance of the System.Windows.Forms.OpenFileDialog
class, as shown here:
1. Open a Visual C# .NET Windows application.
151
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Consuming
. . . . . . and
. . Manipulating
. . . . . . . .Data
. .
2. Place a Button control (btnBrowse) and a TextBox control
(txtFilename) on the form.
3. Attach a Click event handler to the Button control and add the follow-
ing code:
private void btnBrowse_Click(object sender, System.EventArgs e)
{
OpenFileDialog dlgOpen = new OpenFileDialog();
dlgOpen.Title = “Select a File”;
dlgOpen.Filter = “Text files (*.txt)|*.txt|All Files(*.*)|*.*”;
if(dlgOpen.ShowDialog() == DialogResult.OK)
{
txtFilename.Text = dlgOpen.FileName;
}
}
4. Set the form as the startup object for the project, add a Main method,
and run the project. When you click the button, the File Open dialog
box opens. After you select a file and click Open, the name of the file is
displayed in the TextBox.
Streams and Backing Classes
File-based data access involves two primary concepts:
➤ Stream—A flow of raw data
➤ Backing store—A place to put data, such as a file, a network connection,
an Internet address, or even a section of memory
The System.IO namespace includes several classes suitable for accessing and
manipulating streams and backing stores:
➤ FileStream class—Treats a file simply as a stream of bytes
➤ StreamReader class—Reads data as characters from a stream
➤ StreamWriter class—Writes characters to a stream
➤ BinaryReader class—Reads primitive data types as binary values from a
stream
➤ BinaryWriter class—Writes primitive data types as binary values to a
stream
The FileStream class treats a file as a stream of bytes. The FileStream class
is your best option when you don’t know (or don’t care) about the internal
structure of the files with which you’re working. For files with known internal structures, you can use specific objects such as BinaryReader,
152 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
BinaryWriter, StreamReader and StreamWriter; in this case, the FileStream
object handles opening a particular disk file and serves as a parameter to the
constructor of these objects. You can think of these other objects as forming
an additional layer of functionality on top of the FileStream class.
Table 6.1 includes some of the important members of the FileStream object.
Table 6.1 Important Members of the FileStream Object
Member
Type
Description
CanRead
Property
Returns true if you can read from the FileStream
CanSeek
Property
Returns true if you can seek to a particular location in this
FileStream
CanWrite
Property
Returns true if you can write to the FileStream
Close
Method
Closes the FileStream and releases associated resources
Flush
Method
Writes any buffered data to the backing store
Length
Property
Gives the length of the FileStream in bytes
Position
Property
Returns the position within the FileStream
Read
Method
Reads a sequence of bytes
ReadByte
Method
Reads a single byte
Seek
Method
Sets the FileStream to a specified position
Write
Method
Writes a sequence of bytes
WriteByte
Method
Writes a single byte
The following example shows how to write and read data as binary values
using the BinaryWriter and BinaryReader classes. The BinaryReader and
BinaryWriter classes offer streaming functionality oriented toward particular
data types.
1. Open a Visual C# .NET Windows application.
2. Place a Button control (btnCreateFile) and a ListBox control (lbData)
on the form.
3. Switch to Code view and add the following
using
directive:
using System.IO;
4. Double-click the Button control and enter this code to handle the
Click event of the Button control:
private void btnCreateFile_Click(object sender,
System.EventArgs e)
{
// Create a new file to work with
FileStream fsOut = File.Create(@”c:\temp\test.dat”);
153
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Consuming
. . . . . . and
. . Manipulating
. . . . . . . .Data
. .
// Create a BinaryWriter to handle writing
BinaryWriter bw = new BinaryWriter(fsOut);
// And write some data
Int32 intData1 = 7;
Decimal dblData2 = 3.14159M;
String strData3 = “Pi in the Sky”;
bw.Write(intData1);
bw.Write(dblData2);
bw.Write(strData3);
bw.Flush();
bw.Close();
fsOut.Close();
// Now open the file for reading
FileStream fsIn = File.OpenRead(@”c:\temp\test.dat”);
// Create a BinaryReader to handle reading
BinaryReader br = new BinaryReader(fsIn);
// And read the data
lbData.Items.Add(“Int32: “ + br.ReadInt32());
lbData.Items.Add(“Decimal: “ + br.ReadDecimal());
lbData.Items.Add(“String: “ + br.ReadString());
br.Close();
fsIn.Close();
}
5. Set the form as the startup object for the project, and add a Main
method.
6. Run the project and click the button. The
file is created on your hard drive, and the list box shows the contents of the file.
c:\temp\test.dat
The ADO.NET Object Model
ADO.NET refers to the collection of classes that the .NET Framework provides for working with data in relational databases. The ADO.NET object
model is separated into two primary types of objects:
➤ Data provider objects—Used to access and manage the data stored within
the DataSet objects
➤ DataSet objects—Used to store data within the data model
Data Provider Objects
Visual Studio .NET ships with several data providers, including the SQL
Server data provider (System.Data.SqlClient) and the OLEDB data provider
(System.Data.OleDb). Each of these namespaces provides access to variations of the standard data provider objects: Connection, Command,
Parameter, DataReader, and DataAdapter.
154 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Although this section examines the objects provided by the SQL Server data provider
(SqlConnection, SqlCommand, SqlParameter, SqlDataReader, and SqlDataAdapter),
there are implementations of the same objects within the OLE DB data provider as well
(OleDbConnection, OleDbCommand, OleDbParameter, OleDbDataReader, and
OleDbDataAdapter).
The Connection Object
The Connection object represents a single persistent connection to a data
source. The SQL Server implementation of this object is the SqlConnection
object. Table 6.2 details some of the most important members of this object.
Table 6.2 Important Members of the SqlConnection Object
Member
Type
Description
BeginTransaction
Method
Starts a new transaction
Close
Method
Returns the connection to the pool
ConnectionString
Property
The server used by this connection
CreateCommand
Method
A new SqlCommand object executing through this
connection
Open
Method
Opens the connection
When a connection is closed, it is simply returned to a pool of available connections
to later be reused.
The Command and Parameter Objects
A Command object represents an executable action, while a Parameter
object represents a single value passed to a stored procedure. These objects
are implemented within the SQL Server data provider as the SqlCommand
and SqlParameter objects.
Table 6.3 details some of the most important members of the SqlCommand
object.
Table 6.3 Important Members of the SqlCommand Object
Member
Type
Description
CommandText
Property
Represents the statement to be executed by the command
CommandType
Property
Specifies the type of the command, such as Text,
StoredProcedure, or TableDirect
(continued)
155
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Consuming
. . . . . . and
. . Manipulating
. . . . . . . .Data
. .
Table 6.3 Important Members of the SqlCommand Object (continued)
Member
Type
Description
Connection
Property
Represents the connection through which the command executes
CreateParameter
Method
Creates a new parameter
ExecuteNonQuery
Method
Executes a command that does not return a result set
ExecuteReader
Method
Executes a command and returns the results in a
DataReader object
ExecuteScalar
Method
Executes a command and returns the first column of
the first row of the result set
ExecuteXmlReader
Method
Executes a command and returns the results in an
XmlReader object
Parameters
Property
Collection of parameter objects for this command
The DataReader Object
When the ExecuteReader method of the Command object is called, the
result set is returned in a DataReader object. This read-only object can be
accessed only sequentially from first to last, but it results in high-speed data
retrieval. The DataReader object is implemented within the SQL Server
data provider as the SqlDataReader object. The methods of the DataReader
class return values from a single record at a time or a single element at a time
from a specified column.
It is very important to call the DataReader.Close method when you are done, to release
the Connection object for other uses.
The DataAdapter Object
The DataAdapter object provides a two-way data-transfer conduit between
data provider and DataSet objects. Within the SQL Server data provider,
this object is implemented as the SqlDataAdapter object. Some of the most
important members of this object are detailed in Table 6.4.
Table 6.4 Important Members of the SqlDataAdapter Object
Member
Type
Description
DeleteCommand
Property
Specifies the Command object used to delete rows from
the data source
Fill
Method
Copies data from the data source to a DataSet object
(continued)
156 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 6.4 Important Members of the SqlDataAdapter Object (continued)
Member
Type
Description
InsertCommand
Property
Specifies the Command object used to insert new rows
in the data source
SelectCommand
Property
Specifies the Command object used to select rows from
the data source
Update
Method
Copies data from a DataSet back to the data source
UpdateCommand
Property
Specifies the Command object used to update rows in
the data source
DataSet Objects
When manipulating data derived from a relational database, it is often useful to create a memory-resident copy of the target relational data, with
changes posted back to the data source through an update operation.
The DataSet object provides access to a disconnect relational database that
includes its own tables, views, and relationships, without requiring a persistent connection to the original data source. Table 6.5 details some of the most
important members of the DataSet object.
Table 6.5 Important Members of the DataSet Object
Member
Type
Description
AcceptChanges
Method
Accepts all changes in the DataSet
Clear
Method
Removes all data from the DataSet
GetChanges
Method
Returns a DataSet containing only the changed data
in the DataSet
GetXml
Method
Returns the DataSet in XML format
GetXmlSchema
Method
Returns an XML Schema Definition (XSD) representation of the DataSet
Merge
Method
Combines two DataSets
ReadXml
Method
Inputs data from an XML file to the DataSet
ReadXmlSchema
Method
Inputs the schema from an XSD file
Relations
Property
Represents a collection of DataRelation objects
Tables
Property
Represents a collection of DataTable objects
WriteXml
Method
Outputs the DataSet to an XML file
WriteXmlSchema
Method
Outputs the DataSet’s schema to an XSD file
157
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Consuming
. . . . . . and
. . Manipulating
. . . . . . . .Data
. .
The DataTable Object
Each table within a DataSet is represented by a DataTable object, which can
be manipulated by row or by column as desired. Table 6.6 details some of the
most important members of the DataTable object. You might recognize
many of the members as being very similar to structures within a relational
database.
Table 6.6 Important Members of the DataTable Object
Member
Type
Description
ChildRelations
Property
Represents a collection of child DataRelation objects
Clear
Method
Removes all data from the DataTable
ColumnChanged
Event
Fires after a change to data in any row of the specified column
ColumnChanging
Event
Fires just before a change to data in any row of the
specified column
Columns
Property
Represents a collection of DataColumn objects
Constraints
Property
Represents a collection of Constraint objects
NewRow
Method
Adds a new blank row
ParentRelations
Property
Represents a collection of parent DataRelation
objects
PrimaryKey
Property
Represents an array of DataColumn objects that form
the DataTable’s primary key
RowChanged
Event
Fires just after a change to data in the specified
DataRow
RowChanging
Event
Fires just before a change to data in the specified
DataRow
RowDeleted
Event
Fires just after a row deletion
RowDeleting
Event
Fires just before a row deletion
Rows
Property
Represents a collection of DataRow objects
Select
Method
Returns an array of DataRow objects filtered by the
specified criteria
TableName
Property
Specifies the DataTable’s name
When using the Select method of a DataTable, the filter expression is an
SQL WHERE clause that follows these rules:
➤ Column names containing special characters or whitespace are enclosed
in square brackets ([ ]).
➤ String constants are enclosed in single quotes (‘).
158 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ Date constants are enclosed in pound signs (#).
➤ Expressions can be created using the AND, OR, NOT, IN, and LIKE
keywords; using parenthetical ordering; and using comparison and arithmetic operators.
➤ String values are concatenated (combined) using the plus sign (+).
➤ Wildcard values (* and %) can be used only at the beginning or end of
test string values.
➤ Child table columns can be referenced using Child.Column, or you can
use Child(RelationName).Column to choose a particular child table, if
there are several.
➤ You can use the Sum, Avg, Min, Max, Count, StDev, and Var aggregate
functions with child tables.
➤ You can use the CONVERT, LEN, ISNULL, IIF, and SUBSTRING
functions.
It is also possible to order the resulting result set by providing a sort order
expression, and to restrict the returned rows in the result set by specifying
one of the DataViewRowState enumerated values, as detailed in Table 6.7.
Table 6.7 DataViewRowState Enumerated Values
Value
Meaning
Added
Returns only new rows not yet committed
CurrentRows
Returns all current rows
Deleted
Returns only deleted rows
ModifiedCurrent
Returns only modified rows
ModifiedOriginal
Returns the original data from the modified rows
None
Returns an empty result set
OriginalRows
Returns all original data, including modified values and deleted rows
Unchanged
Returns only unmodified rows
The DataRelation Object
A DataRelation object represents each relationship between tables within a
DataSet. Table 6.8 details some of the most important members of the
DataRelation object.
159
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Consuming
. . . . . . and
. . Manipulating
. . . . . . . .Data
. .
Table 6.8 Important Members of the DataRelation Object
Member
Type
Description
ChildColumns
Property
Collection of DataColumn objects defining the
foreign key
ChildKeyConstraint
Property
A ForeignKeyConstraint object for the relation
ChildTable
Property
DataTable linked by the foreign key (child
DataTable)
ParentColumns
Property
Collection of DataColumn objects defining the
primary key
ParentKeyConstraint
Property
A PrimaryKeyConstraint object for the relation
ParentTable
Property
DataTable linked by the primary key (parent
DataTable)
RelationName
Property
The DataRelation name
The DataView Object
The DataView object represents a view of the data contained in a DataTable
object. A DataView object might contain every DataRow object from the
DataTable object, or it might be filtered to contain only specific rows. That
filtering can be done by SQL expressions (returning, for example, only rows
for customers in France) or by row state (returning, for example, only rows
that have been modified). Table 6.9 details some of the most important members of this object.
Table 6.9 Important Members of the DataView Object
Member
Type
Description
AddNew
Method
Adds a new row
AllowDelete
Property
Returns true if the DataView allows deletions
AllowEdit
Property
Returns true if the DataView allows updates
AllowNew
Property
Returns true if the DataView allows insertion of new rows
Count
Property
Gives the number of rows in the DataView
Delete
Method
Deletes an existing row
Find
Method
Searches for a particular row
FindRows
Method
Returns an array of rows filtered by the provided
expression
Item
Property
Returns a particular row as a DataRowView object
Sort
Property
Sorts the rows in a DataView
160 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The DataRow Object
DataTable objects represent a collection of DataRow objects, which serve the
same role as records within a relational database. Each row can have one or
more elements arranged within a columnar format in the table. Table 6.10
details some of the most important members of the DataRow object.
Table 6.10 Important Members of the DataRow Object
Member
Type
Description
BeginEdit
Method
Initiates editing of the DataRow
CancelEdit
Method
Discards a pending edit
Delete
Method
Deletes a row
EndEdit
Method
Saves a pending edit’s changes
IsNull
Method
Returns true if the specified column contains a null value
RowState
Property
Returns the current state of a DataRow, which can be tested
against the DataViewRowState enumerated values
The DataColumn Object
DataTable objects also include a collection of DataColumn objects, which
serve the same role as individual elements within a relational database. Each
column can be independently configured with a length, a specific data type,
and constraints on allowable values. Table 6.11 details some of the most
important members of the DataColumn object.
Table 6.11 Important Members of the DataColumn Object
Member
Type
Description
AllowDbNull*
Property
Returns true if the column allows null values
AutoIncrement
Property
Returns true if the column has the identity constraint
ColumnName
Property
Specifies the DataColumn’s name
DataType
Property
Specifies the data type stored in the column
DefaultValue
Property
Specifies the default value assigned to this column when
a new row is inserted
MaxLength
Property
Specifies the maximum length of the value stored in the
column
Unique
Property
Returns true if values in the column must be unique
across all rows
* A Null value is not the same thing as a numeric zero or zero-length string value. Null is a special
condition that reflects a completely unknown value, and it cannot be used in some types of comparative evaluation without additional testing.
161
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Consuming
. . . . . . and
. . Manipulating
. . . . . . . .Data
. .
Using a DataSet
You create a form capable of displaying a multitable DataSet by performing
these steps:
1. Open a Visual C# .NET Windows application.
2. Place a Button control (btnLoadData) and a DataGrid control
(dgMain) on the form.
3. Switch to Code view and add the following using directives:
using System.Data;
using System.Data.SqlClient;
4. Attach a Click event handler to the Button control and add the follow-
ing code:
private void btnLoadData_Click(object sender, System.EventArgs e)
{
SqlConnection cnn = new SqlConnection(“Data Source=(local);” +
“Initial Catalog=Northwind;Integrated Security=SSPI”);
DataSet ds = new DataSet();
SqlCommand cmdCustomers= cnn.CreateCommand();
cmdCustomers.CommandType = CommandType.Text;
cmdCustomers.CommandText = “SELECT * FROM Customers”;
SqlDataAdapter daCustomers = new SqlDataAdapter();
daCustomers.SelectCommand = cmdCustomers;
daCustomers.Fill(ds, “Customers”);
SqlCommand cmdOrders = cnn.CreateCommand();
cmdOrders.CommandType = CommandType.Text;
cmdOrders.CommandText = “SELECT * FROM Orders”;
SqlDataAdapter daOrders = new SqlDataAdapter();
daOrders.SelectCommand = cmdOrders;
daOrders.Fill(ds, “Orders”);
SqlCommand cmdOrderDetails = cnn.CreateCommand();
cmdOrderDetails.CommandType = CommandType.Text;
cmdOrderDetails.CommandText = “SELECT * FROM [Order Details]”;
SqlDataAdapter daOrderDetails = new SqlDataAdapter();
daOrderDetails.SelectCommand = cmdOrderDetails;
daOrderDetails.Fill(ds, “OrderDetails”);
DataRelation relCustOrder = ds.Relations.Add(“CustOrder”,
ds.Tables[“Customers”].Columns[“CustomerID”],
ds.Tables[“Orders”].Columns[“CustomerID”]);
DataRelation relOrderOrderDetails=
ds.Relations.Add(“OrderOrderDetails”,
ds.Tables[“Orders”].Columns[“OrderID”],
ds.Tables[“OrderDetails”].Columns[“OrderID”]);
dgMain.DataSource = ds;
dgMain.DataMember = “Customers”;
}
5. Set the form as the startup object for the project, add a Main method,
and run the project. When you click the button, the application accesses the Northwind database on an SQL Server running on the local system using integrated Windows authentication, and it displays customer
data within the DataGrid, as shown in Figure 6.2.
162 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Figure 6.2 Customer data from a multitable DataSet.
In the previous example, the data fetched from the data source is stored in a
separate DataTable object in a DataSet object. The code then adds
DataRelation objects to specify the relationships between these DataTable
objects. The Add method of the DataSet.Relations collection takes three
parameters:
➤ A name for the DataRelation object to be created
➤ A DataColumn object that represents the primary key side of the rela-
tionship
➤ A DataColumn object that represents the foreign key side of the rela-
tionship
The DataGrid control contains built-in logic to help navigate between related DataTable objects in a DataSet object.
XML Data
XML data files make up the third common source of data that your applications can use. XML stands for the Extensible Markup Language, which uses
human-readable, highly structured files that include both data and a description of the data (referred to as metadata).
XML Example
The following is an example XML document:
<?xml version=”1.0” encoding=”UTF-8”?>
<!-- Customer list for Speedy Auto -->
<Customers>
<Customer CustNumber=”1”>
<CustName>Performance Wheels</CustName>
<CustCity>Dallas</CustCity>
163
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Consuming
. . . . . . and
. . Manipulating
. . . . . . . .Data
. .
<CustState>TX</CustState>
</Customer>
<Customer CustNumber=”2”>
<CustName><![CDATA[Larry’s Grille]]></CustName>
<CustCity>Austin</CustCity>
<CustState>TX</CustState>
</Customer>
</Customers>
The first line of the example file is the XML declaration, which details the
version of the XML specification and encoding used. The second line is a
formatted comment, which is ignored during data manipulation. The third
line defines the opening tag of the root element of the XML document.
Data within the file is organized by nested elements; each level is bracketed
by a pair of tags, as shown here:
<Tag>element data</Tag>
Tag names can be anything you like, provided that the name starts with a letter character or an underscore and contains only alphanumeric characters, underscores,
hyphens, or periods. Tag names cannot include whitespace and are case sensitive.
Elements can contain other elements and also can have attributes containing
values. The example code includes an attribute named CustNumber for each
of the Customer elements.
The CustName element in the second Customer record includes a
[CDATA()] section, which allows the customer name to include the
apostrophe (‘) special character. XML files also can use entity references
denoted by the ampersand (&) in the place of the special characters:
➤ &lt; (<)
➤ &gt; (>)
➤ &amp; (&)
➤ &apos; (‘)
➤ &quot; (“)
The XmlDocument Class
The .NET Framework includes support for XML files through the
System.Xml namespace. An XmlNode object represents each node in
an XML document, such as an attribute, a comment, an element, and so
on. An XmlDocument provides an in-memory representation of an XML
164 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
document. The XmlDocument class implements the W3C Document
Object Model (DOM) Level 1 Core and the Core DOM Level 2 standards.
The DOM provides a standard programming model for working with XML.
Table 6.12 details some of the most important classes of the XmlDocument
object.
Table 6.12 XmlDocument Object Members
Member
Type
Description
CreateAttribute
Method
Creates an attribute node
CreateElement
Method
Creates an element node
CreateNode
Method
Creates an XmlNode object
DocumentElement
Property
Returns an XmlNode object for the root node
GetElementsByTagName
Method
Lists all elements with the specified tag name
Load
Method
Inputs an XML document
LoadXml
Method
Inputs an XML string
Save
Method
Outputs the XmlDocument to a file or stream
WriteTo
Method
Outputs the XmlDocument to an XmlWriter
object
The XmlDataDocument Class
The XmlDataDocument class extends the XmlDocument class to support
DataSet synchronization. You can practice using an XML file as a relational
data source by completing the following steps:
1. Open a Visual C# .NET project Windows application.
2. Place two Button controls (btnBrowse and btnSave) and a DataGrid
control (dgXml) on the form.
3. Switch to Code view and add the following using directives:
using System.Xml;
using System.Data;
4. Add the following code in the class definition:
XmlDataDocument xdd;
String strFileName;
5. Attach a Click event handler for the Button controls and add the fol-
lowing code:
private void btnBrowse_Click(object sender, System.EventArgs e)
{
OpenFileDialog dlgOpen = new OpenFileDialog();
dlgOpen.Title = “Select a File”;
dlgOpen.Filter = “XML files (*.xml)|*.xml|All Files(*.*)|*.*”;
165
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Consuming
. . . . . . and
. . Manipulating
. . . . . . . .Data
. .
if (dlgOpen.ShowDialog() == DialogResult.OK)
{
strFileName = dlgOpen.FileName;
// Create a DataSet object
// Read the XML document’s schema
DataSet ds = new DataSet();
ds.ReadXmlSchema(dlgOpen.FileName);
// Create an XmlDataDocument object with the DataSet
// Load the file into the XmlDataDocument
xdd = new XmlDataDocument(ds);
xdd.Load(strFileName);
// And display it on the DataGrid
dgXml.DataSource = ds;
}
}
private void button1_Click(object sender, System.EventArgs e)
{
xdd.Save(strFileName);
}
6. Set the form as the startup object for the project, add a Main method,
and run the project. When you click the button, the File Open dialog
box opens. After you select an XML file and click OK, the contents of
the file are displayed in the DataGrid. Modify the contents in the
DataGrid, and click Save to write the changes back to the XML document.
Handling Database Errors
The .NET Framework includes two classes within the
System.Data.SqlClient namespace that are useful in handling SQL Server
errors. The SqlException class can be used to catch SQL Server–related
errors and warnings. The SqlException object exposes an Errors property,
which is a collection of SqlError objects. The SqlError object contains information related to errors and warnings generated by the SQL server. In addition to encountering operational errors, when multiple users make changes
to data within separate DataSets and then attempt to update the values in the
data source, the question arises over which one of the conflicting changes
will “win.” You can control the resolution of this situation through the
UpdateCommand property of an SqlDataAdapter object, which can be configured in one of two ways:
➤ Last one wins concurrency control—All updates are applied regardless of
whether changes have occurred because the rows were loaded into the
DataSet. When you use a regular UPDATE statement to update the
database, you use the last one wins concurrency control—for example:
166 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
UPDATE Customers
SET ContactName = @ContactName
WHERE CustomerID = @CustomerID
➤ Optimistic concurrency control—The change is applied only if the source
row has not changed since the DataSet was loaded. To use the optimistic
concurrency control, you need to ensure that the original value of a field
in the database is not changed after you have loaded the data. You can
use the WHERE clause in the UPDATE statement to ensure this
requirement—for example:
UPDATE Customers
SET ContactName = @ContactName
WHERE CustomerID = @CustomerID AND
ContactName = @ContactNameOrig
Here, the new WHERE clause finds a row to update only if both the
CustomerID and ContactName fields are unchanged from when the
row was originally loaded.
167
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Consuming
. . . . . . and
. . Manipulating
. . . . . . . .Data
. .
Practice Questions
Question 1
You need to modify the data present in the Customers table to increase the
Discount rate by 5%. Which type of SQL statement should you use for this purpose?
❍ A. DELETE
❍ B. INSERT
❍ C. SELECT
❍ D. UPDATE
Answer D is correct. SQL UPDATE statements are used to modify existing
data. Answer A is incorrect because DELETE statements are used to remove
existing data rather than change it. Answer B is incorrect because the
INSERT statement is used to add new records. The SELECT statement is
used to return existing data records, not to change them, making answer C
incorrect as well.
Question 2
Given the following code, what order will the final record set be in?
SELECT Count(CustomerID) as CustCount, State
FROM [Customer Data]
GROUP BY State
ORDER BY 2+3 DESC
❍ A. The results will be in ascending order, based on the values stored in
the State column.
❍ B. The results will be in descending order, based on the values stored in
the State column.
❍ C. The results will be in ascending order, based on the values stored in
the Count value.
❍ D. The results will be in descending order, based on the values stored in
the Count value.
❍ E. The results will be ordered, based on what the database engine
decides.
Answer E is correct. Although the records in the result set will be grouped
by the value in the State field, the use of a constant (in this case, the addition
168 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
of two constant values) in the ORDER BY clause causes the result set to be
ordered, based on what the database engine decides. Answers A and B are
incorrect because the State field is being used to determine the aggregate
grouping rather than ordering the result set. Answers C and D are incorrect
because the Count value is only one of the data elements returned and is not
used in the ordering of the result set.
Question 3
Which of the following objects would be used with an Access database? (Select
all that apply.)
❑ A. SqlConnection
❑ B. SqlDataAdapter
❑ C. OleDbCommand
❑ D. OleDbDataReader
❑ E. SqlCommand
Answers C and D are correct. When accessing Jet databases such as
Microsoft Access files, the OLE DB data provider is used, making both the
OleDbCommand and OleDbDataReader objects available. Answers A, B,
and E are incorrect because the SqlConnection, SqlDataAdapter, and
SqlCommand objects are included with the SQL Server data provider rather
than the OLE DB data provider.
Question 4
What happens when you invoke the Close method of an SqlConnection object?
❍ A. The connection is maintained until the application invokes the Open
method again.
❍ B. The connection is returned to the pool.
❍ C. The connection is terminated and its resources are cleared.
❍ D. Nothing—it is no longer necessary in .NET to explicitly invoke the
Close method.
Answer B is correct. The connection is returned to an available pool for later
connections. Answer A is incorrect because the Close method is invoked to
end an existing connection, not to keep it open. Answer C is incorrect
because the server’s connection resources are not immediately cleared.
Answer D is incorrect because the Close method is still required to terminate
an existing connection.
169
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Consuming
. . . . . . and
. . Manipulating
. . . . . . . .Data
. .
Question 5
Which method of the SqlDataAdapter class would be used to copy data from a
SQL Server View to a DataSet named dsText?
❍ A. Fill
❍ B. InsertCommand
❍ C. SelectCommand
❍ D. Update
❍ E. UpdateCommand
Answer A is correct. The Fill method copies information from a database to
a DataSet. Answers B, C, and E are incorrect because InsertCommand,
SelectCommand, and UpdateCommand are properties used to specify
Command objects rather than methods used to copy information. Answer D
is incorrect because the Update method copies information from a DataSet
back to the data source, not the other way around.
Question 6
You want to load an XML file data into a DataSet object. The DataGrid object is
then bound to the DataSet object. The DataGrid control provides the capability
to modify the data in the DataSet object. You want the changes to be synchronized with the XML file. Which of the following objects should you use to load
the XML document?
❍ A. XmlDataDocument
❍ B. XmlDocument
❍ C. XmlReader
❍ D. XmlValidatingReader
Answer A is correct. The key feature of the XmlDataDocument class is that
it can be synchronized with a DataSet object. Therefore, the
XmlDataDocument object should be used to load the XML document.
Answers B, C, and D are not correct because they cannot be synchronized
with the DataSet object.
170 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 7
Your application needs to retrieve a list of student marks from a SQL Server
database. The application should move through the list sequentially once, processing each student’s marks in turn. Which object should you use to hold the
list to achieve maximum performance?
❍ A. DataSet
❍ B. DataTable
❍ C. DataView
❍ D. SqlDataReader
Answer D is correct. The SqlDataReader object provides a fast, forwardonly, read-only view of the data. It loads one row of data at a time in the
memory without any extra overhead. Answers A, B, and C are incorrect
because they load a complete result set in memory, causing extra overhead
because the data is read sequentially only once.
Question 8
Which of the following members of the XmlDocument class create or return an
XmlNode object? (Select all that apply.)
❑ A. CreateAttribute
❑ B. CreateElement
❑ C. CreateNode
❑ D. DocumentElement
❑ E. Load
Answers C and D are correct. The CreateNode method creates a new
XmlNode, while the DocumentElement property returns an XmlNode
object representing the root node of the XML file. Answers A and B are
incorrect because the CreateAttribute and CreateElement methods are used
to create attribute and element nodes, respectively. Answer E is incorrect
because the Load method is used to import an XML document.
171
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Consuming
. . . . . . and
. . Manipulating
. . . . . . . .Data
. .
Question 9
You have created an application that uses optimistic concurrency control to
manage data access by multiple users. Users Bob, Mary, and Sal synchronized
their local DataSets with the data source at 10:30, and all three post updates to
the same record within a local DataSet. Mary submits her update at 11:00, Sal
submits his at 10:55, and Bob submits his at 11:05. Which value will be present at 11:10, assuming that no one else attempts to change the data?
❍ A. Mary’s will remain.
❍ B. Sal’s will remain.
❍ C. Bob’s will remain.
❍ D. The database does not reflect any changes.
Answer B is correct. Because your solution uses optimistic concurrency control, only the first changed value (Sal’s) will be updated. Mary and Bob will
encounter an error when they attempt to post changes to the same record
because the underlying data will have changed since the DataSet was last
updated, making answers A and C incorrect.
Question 10
Which class within the System.IO namespace would be used to extract records
from a flat file that have a 10-digit integer key, followed by a 20-character customer name string, followed by two timedate fields? (Select the best answer.)
❍ A. FileStream
❍ B. StreamReader
❍ C. BinaryReader
❍ D. DataReader
Answer C is correct. The BinaryReader class reads binary data from primitive data types. Answer A is incorrect because the FileStream class treats any
file simply as a stream of bytes and would not be the best choice here.
Similarly, answer B is incorrect because the StreamReader class is used to
read data as characters, which would be less efficient than directly reading
each data type available in a known format. Answer D is incorrect because
the DataReader object is created by the ExecuteReader method of an
ADO.NET Command object rather than as a class within the System.IO
namespace.
172 Chapter 6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Need to Know More?
Carlos Eduardo Rojas and Fernando G. Guerrero. SQL Server 2000
Programming by Example. Que Publishing, 2001.
Microsoft ADO.NET Support Center: http://support.
microsoft.com?scid=fh;en-us;adonet.
Data and ADO HOWTO articles:
com/quickstart/howto.
http://samples.gotdotnet.
7
Web Services
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terms you’ll need to understand:
✓ Simple Object Access Protocol (SOAP)
✓ Universal Description, Discovery, and Integration (UDDI)
✓ Web Services Description Language (WSDL)
✓ Web Services Discovery tool (disco.exe)
✓ Web Services Description Language tool (wsdl.exe)
✓ WebService attribute ([WebService()])
✓ WebMethod attribute ([WebMethod()])
Techniques you’ll need to master:
✓ Understand the purpose of SOAP when connecting to a Web
Service.
✓ Understand how to make use of Web references and the
command-line utilities disco.exe and wsdl.exe.
✓ Understand how to instantiate and invoke a Web Service.
174 Chapter 7
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The .NET Framework has been described by Microsoft as “an XML Web
Services platform that will enable developers to create programs that transcend device boundaries and fully harness the connectivity of the Internet.”
In essence, a Web Service allows interaction between objects across the
Internet.
Object-oriented languages allow two objects within the same application to
interact, while protocols such as the Component Object Model (COM)
extend this to allow two objects on the same system but in different applications to interact. Distributed Component Object Model (DCOM) components extend this even more, to allow two objects located on different
systems within the same local network to interact. Web Services extend this
progression to allow objects to interact even when located on systems in
widely separated networks, sharing only Internet connectivity.
In this chapter, we discuss the creation and use of Web Services and the primary protocols involved in their use.
Understanding Web Services
Web Services provide interactivity through a number of protocols, including
the following:
➤ Simple Object Access Protocol (SOAP)
➤ Disco and Universal Description, Discovery, and Integration (UDDI)
➤ Web Services Description Language (WSDL)
By default, communications between Web Services and their clients is accomplished
using XML messages over HTTP connectivity. This allows access to Web Services
through most firewall configurations, although it is possible to configure a firewall to
prevent HTTP access.
Simple Object Access Protocol (SOAP)
The Simple Object Access Protocol (SOAP) provides a method of translating objects, along with their methods and properties, into XML that can be
sent via HTTP connectivity. Because SOAP is XML-based, Web Services
can be used by many different vendors and clients.
175
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Web
. . Services
. . . . .
You are expected to know that you can transmit SOAP messages over protocols
other than the Hypertext Transfer Protocol (HTTP)). SOAP messages also can be sent
via asynchronous methods such as the File Transfer Protocol (FTP) or email using
the Simple Mail Transfer Protocol (SMTP).
A SOAP message is an XML message that has an envelope and a body; a
SOAP message optionally can contain a header. The SOAP envelope is the
topmost element of the XML document that contains the body and the
header of the message. The body of the SOAP message contains information
meaningful to the recipient of the message. For example, when you make a
call to a Web Service method, the body of a SOAP message includes the
name of the method and the arguments needed to invoke that method.
Disco and Universal Description, Discovery,
and Integration (UDDI)
Disco is a Microsoft standard for the creation of Web Service discovery documents. Disco documents are kept on a Web Services server and contain
paths and other information, including the path to the Web Services
Description Language (WSDL) file that describes the service.
Universal Description, Discovery, and Integration (UDDI) describes a
method for finding Web Services, URLs for information, or other details of
Web Services such as documentation of the Web Service available on a particular server. UDDI relies on a central directory that can be searched for
details of available services. Public UDDI registries provide information to
any client requesting the data; private UDDI registries provide information
only to authorized clients or within a restricted intranet.
The UDDI standard is being developed by a joint group of industry partners, including Microsoft and IBM. For more information, visit www.uddi.org and
uddi.microsoft.com.
Web Services Description Language
(WSDL)
The Web Services Description Language (WSDL) file is an XML file maintained on the Web Services server that details the data types, methods, and
URLs that can be used to interact with each Web Service.
176 Chapter 7
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
It is not necessary for a Web Service to have a UDDI registration or WSDL file.
These are necessary only to allow clients to automatically discover the message
formats and locations used with the Web Service. Clients can be configured to use
the proper format without exposing the Web Service to discovery.
Using Web Services
The first step is Web Service discovery, in which you discover and locate the
documents that provide documentation and a WSDL description of the Web
Service. After you retrieve the information about its interface through the
description document (WSDL), you generate a proxy class that locally represents the Web Service. The client application then needs to simply create
an object of the proxy class and call its methods to invoke the Web methods
of the Web Service remotely.
In this section, we discuss how to discover and generate a proxy class for a
Web Service:
➤ By adding a Web reference using Visual Studio .NET
➤ By using command-line tools: the Web Services Discovery tool
(disco.exe) to discover Web Service–related information and the Web
Services Description Language tool (wsdl.exe) to generate proxy classes
for the Web Service
Adding a Web Reference
Visual Studio .NET enables you to discover Web Service details and generate a proxy class for a Web Service from its IDE with the help of Web
References. Within a project, you can add a Web reference by right-clicking
the References folder within the Solution Explorer and selecting Add Web
Reference from the options provided. The Add Web Reference dialog box
appears, as shown in Figure 7.1. In the Address text box, specify the proper
URL of the Web Service and press Enter (see Figure 7.1). Click the Add
Reference button to add a Web reference to the Web Service in your project.
Visual Studio .NET discovers the methods of the Web Service and generates
a proxy class, as shown in Figure 7.2 (you need to click the Show All Files
icon in the Solution Explorer to view the proxy classes).
177
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Web
. . Services
. . . . .
Figure 7.1 The Add Web Reference dialog box shows exposed methods of the Web Service
http://terraservice.net/TerraService.asmx.
Figure 7.2
When you add a Web Reference, the proxy class is automatically generated.
Web references are preferred over the command-line creation of proxy classes
because it is possible to rapidly update a Web reference to reflect Web Service
changes. This is done by right-clicking the Web reference and selecting Update Web
Reference.
After generating the proxy class, you can instantiate and invoke Web methods on the Web Service through the generated proxy class:
net.terraservice.TerraService ts = new net.terraservice.TerraService();
net.terraservice.PlaceFacts[] pf =
ts.GetPlaceList(“Grand Canyon”, 1, false);
178 Chapter 7
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
In the preceding code, the autogenerated proxy file uses a namespace that is
based on the name of the Web reference. The TerraService and PlaceFacts
objects are proxy objects that pass calls to the Web Service and return results
from the Web Service.
The Web Services Discovery Tool
(disco.exe)
When you create a Web reference, Visual Studio .NET performs all the
steps necessary to discover and make available the target Web Service. It is
also possible to do this explicitly by using the command-line tool disco.exe.
The disco.exe utility can be used within the Visual Studio .NET command
prompt; the command prompt is accessible through Start, Programs,
Microsoft Visual Studio, .NET, Visual Studio .NET Tools, Visual Studio
.NET Command Prompt. To retrieve discovery information of the
TerraService Web Service using this utility, you can input the following:
disco http://terraservice.net/TerraService.asmx
The tool contacts the Web Service and creates the following files:
➤ The WSDL description file is an XML file that contains the contract of
the Web methods exposed by the Web Service. You can use the WSDL
file to generate a proxy class for a Web Service.
➤ If the Web Service includes a static discovery document (.disco file), the
tool will also retrieve this document. This XML file contains URL
information such as the URL for the WSDL file, the URL for the Web
Service documentation, and so on.
➤ The results.discomap file, an XML file, contains the name of the other
files created by the disco.exe tool and the URL from which their contents were retrieved.
The Web Services Description Language
Tool (wsdl.exe)
The .NET Framework Software Development Kit (SDK) includes a command-line utility, wsdl.exe that can use a WSDL file and create a proxy class
that can be used to invoke the Web Service. Using the Visual Studio .NET
command prompt, simply navigate to the folder containing the WSDL file
179
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Web
. . Services
. . . . .
generated by the disco.exe tool, and execute the wsdl.exe with the desired
options:
wsdl /language:CS /out:TS.cs TerraService.wsdl
You can then add the resultant proxy file, TS.cs, to your application project
by selecting File, Add Existing Item and then navigating to the proper file.
After generating the proxy class, you can instantiate and invoke Web methods on the Web Service just as you did when you used the Add Web
Reference feature of Visual Studio .NET IDE. However, the proxy file generated by using the Web Services Description Language tool uses a namespace specified by the /namespace option. Because you did not specify a
/namespace option in the wsdl command mentioned previously, you can
refer to the proxy objects directly as shown here:
TerraService ts = new TerraService();
PlaceFacts[] pf =
ts.GetPlaceList(“Grand Canyon”, 1, false);
Table 7.1 details some of the more common options used with the wsdl.exe
utility.
Table 7.1 Command-line Options for the wsdl.exe Utility
Option
Meaning
/domain:DomainName
Gives the domain name for connecting to a server that
requires authentication.
/language:LanguageCode
Specifies the language of the generated class. The
LanguageCode parameter can be CS (for C#), VB (for
Visual Basic .NET), or JS (for JScript).
/namespace:Namespace
Specifies a namespace for the new class.
/out:Filename
Gives the filename for the output. By default, the filename is derived from the Web Service name.
/password:Password
Gives the password for connecting to a server that
requires authentication.
/server
Generates a class to create a server object. By default,
the tool generates a client proxy object.
/username:Username
Gives the username for connecting to a server that
requires authentication.
/?
Displays the utility’s help file.
180 Chapter 7
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating Web Services
You can create an ASP.NET Web Service using the Visual Studio .NET
interface by selecting the option to create a Web Service and specifying the
name of the Web server, as show in Figure 7.3 (here, the server being used is
the localhost).
Figure 7.3
Specification of a new Web Service within Visual Studio .NET.
To create a Web Service, you create a file with an .asmx extension. You then
need to perform the following steps:
1. Mark the class that should be available via the Web Service by using
the WebService attribute. For example:
[WebService(Namespace=”http://NetExam.org/StringProc”)]
public class Strings : System.Web.Services.WebService {}
2. Mark the public methods in the Web Service class that should be
exposed via the Web Service by using the WebMethod attribute. For
example:
[WebMethod()]
public String ToUpper(String inputString)
{
return inputString.ToUpper();
}
[WebMethod()]
public String ToLower(String inputString)
{
return inputString.ToLower();
}
The methods marked with the WebMethod attribute are known as Web
methods. They expose the functionality of the ASP.NET Web Service
to the outside world.
181
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Web
. . Services
. . . . .
Now you just need to build the Web Service project to create the Web
Service on the server.
Testing the New Web Service
Visual Studio .NET includes built-in tools for testing a Web Service project
from your browser without building any client applications for the Web
Service. You can test the project by selecting Run, which opens a browser
window showing the test page for any exposed methods of the Web Service,
as shown in Figure 7.4.
Figure 7.4
Exposed methods of the Strings Web Service.
You can test any of the methods by clicking the method link. This opens the
Web method test page, shown in Figure 7.5.
Figure 7.5
Test page for the ToUpper method.
182 Chapter 7
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Here, you can test the method by entering appropriate values for each
parameter and clicking the Invoke button. This opens another browser window displaying the XML response (see Figure 7.6).
Figure 7.6
XML response from testing the ToUpper method.
183
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Web
. . Services
. . . . .
Practice Questions
Question 1
Which of the following is the best description of the general purpose of SOAP?
❍ A. SOAP is used to automatically discover the properties and methods of
a Web Service.
❍ B. SOAP is used to create a proxy class for a Web Service.
❍ C. SOAP is used to encapsulate objects as XML messages.
❍ D. SOAP is used to clean data before it is consumed by a Web Service.
Answer C is correct. SOAP is used to encapsulate objects as XML messages
so that their properties and methods can be transferred over a network using
protocols such as HTTP, FTP, or SMTP. Answer A is incorrect because
SOAP is used to translate the properties and methods of an object into XML,
and it cannot directly perform discovery of Web Services and their properties. Answer B is incorrect because SOAP is a method of data interchange
and does not create a Web Service or a proxy class for one. Answer D is
incorrect because SOAP does not provide error checking of user data; it
serves only to provide basic XML transfer of data.
Question 2
You have created the file NewService.asmx, containing code for a new Web
Service named MyService. The code contains exposed methods FirstService
and SecondService. To expose the FirstService method, which of the following
must be done to the method?
❍ A. Configure NewService.asmx for anonymous access.
❍ B. Configure MyService using the [WebClass()] attribute.
❍ C. Configure FirstService using the [WebMethod()] attribute.
❍ D. Configure FirstService using the [WebService()] attribute.
Answer C is correct. The FirstService Web method must be marked using
the [WebMethod()] attribute to expose it from the Web Service. Answer A is
incorrect because the exposure of Web methods is not performed at the file
or class levels. Answers B and D are incorrect because there is no
[WebClass()] attribute, and the [WebService()] attribute is used to mark a
Web Service, not a Web method.
184 Chapter 7
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 3
You are developing a Web Service that provides stock-related data to the users.
The Web Service exposes various methods. One of the methods, StockPrice(),
provides the current price for a stock symbol. You have defined the method as
follows:
[WebMethod]
decimal StockPrice(string symbol)
{
decimal price;
// Fetch the current price
return price;
}
Your clients complain that they cannot access the StockPrice() Web method,
although they can call other Web methods in the Web Service. What could be
the problem?
❍ A. You need to apply a WebService attribute to the method.
❍ B. Web methods cannot return a decimal value; you must change the
return type to int.
❍ C. Web methods cannot contain any arguments.
❍ D. Web methods should be defined as public methods.
Answer D is correct. For Web methods to be accessible via the Web Service,
they should be defined as public methods with the WebMethod attribute.
Answer A is not correct because the WebService attribute is applied to the
Web Service class rather than the Web method. Answers B and C are not
correct because Web methods can return decimal values and can contain any
number of arguments.
Question 4
Which of the following are valid transport protocols for translating XML messages? (Select all that apply.)
❑ A. FTP
❑ B. HTTP
❑ C. SOAP
❑ D. SMTP
Answers A, B, and D are correct. SOAP-translated XML messages can be
transported using the SMTP, FTP, or HTTP protocols. Answer C is incorrect because SOAP is used to encapsulate objects into XML format, but it
does not provide a transport mechanism.
185
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Web
. . Services
. . . . .
Question 5
You have created an application used by the accounting office that includes a
Web reference to the QuarterlyBalance Web Service. Changes to this service
have been made, and you need to reflect those changes in the proper proxy
classes. What must you do?
❍ A. Create a new application and add a new Web reference to the Web
Service.
❍ B. Delete the existing Web reference and re-create it.
❍ C. Update the Web reference in the existing application.
❍ D. Explicitly re-create the reference using the wsdl.exe utility.
Answer C is correct. All you need to do is update the Web reference within
the existing application. Answers A and B are incorrect because it is not
necessary to delete or create anything new simply to update an existing Web
reference. Answer D is incorrect because the original Web reference was created in Visual Studio .NET and, therefore, should be updated in that environment rather than at the command line.
Question 6
What must a developer do to make a Web Service available asynchronously?
❍ A. Nothing.
❍ B. Use a separate Thread object for each invocation of the Web Service.
❍ C. Provide callback methods to invoke the Web Service.
❍ D. Host the Web Service on an Internet Information Server 6.0 server.
Answer A is correct. There is no need to modify the Web Service. Answers
B, C, and D are not correct because the client can always call a Web Service
asynchronously.
186 Chapter 7
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 7
You want to create a Visual C# .NET proxy class named MyService.cs from the
WSDL file named NewService.wsdl. After navigating to the proper folder using
the Visual Studio .NET command-line utility, what should you do?
❍ A. Enter the following code:
disco /language:CS /out:MyService.cs NewService.wsdl
❍ B. Enter the following code:
disco /language:VB /out:MyService.vb NewService.wsdl
❍ C. Enter the following code:
wsdl /language:VB /out:MyService.vb NewService.wsdl
❍ D. Enter the following code:
wsdl /language:CS /out:MyService.cs NewService.wsdl
❍ E. Enter the following code:
wsdl /language:CS /out:NewService.wsdl MyService.cs
Answer D is correct. You should execute the wsdl.exe utility using both the
/language specification of CS for a Visual C# .NET result and the /out specification of the MyService.cs target file. Answers A and B are incorrect
because they both specify the use of the disco.exe utility, which is not used to
create proxy classes directly. Answers B and C are incorrect because they
both specify the /language option of VB, which would generate a Visual
Basic .NET code file. Answer E is incorrect because the target file is the
proxy class and should be used with the /out switch.
Question 8
You are modifying an application to include references to the Employees class
of a Web Service available within the organization’s intranet. The application
already includes an Employees class. Using the wsdl.exe utility, which switch
should you use to allow these two classes to coexist?
❍ A. /domain
❍ B. /namespace
❍ C. /out
❍ D. /server
187
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Web
. . Services
. . . . .
Answer B is correct. The /namespace switch allows the specification of the
namespace for the Employees proxy class, which can be used to set a different namespace from the existing Employees class, so that they can be specified uniquely. Answer A is incorrect because the /domain switch is used to
specify the domain used for authentication on the Web server. Answer C is
incorrect because the /out switch specifies the name of the output file.
Answer D is incorrect because the /server switch specifies that the resultant
class should be a server object rather than a client object.
Question 9
You are invoking a Web Service within your client application. This Web Service
returns the DataSet object, which is included in the System.Data namespace.
Where should you place a reference to the namespace?
❍ A. In the client application project only.
❍ B. In the Web Service project only.
❍ C. In both the client application and Web Service projects.
❍ D. You do not need to specify the namespace reference in either project.
Answer C is correct. You must place a reference to the proper namespace in
both projects to generate and access a DataSet object between the server and
client applications. Answers A and B are both incorrect because they specify
only one of the two requirements, while answer C fails to include either.
Question 10
You are creating an application that will require credit card verification when the
customers register. You decide to use a Web Service that will provide credit card
authentication facilities. You do not want to write this service yourself; instead,
you want to use one that is already available. What should you use to find such
a Web Service?
❍ A. Use the Web Services Discovery tool.
❍ B. Use the Web Services Description Language tool.
❍ C. Use the Soapsuds tool.
❍ D. Use the UDDI Registry.
Answer D is correct. With the UDDI Registry, you can find Web Services
by browsing or searching for your particular interest. Answer A is not correct because the Web Services Discovery tool requires the base address of the
188 Chapter 7
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Web Service to discover the details about the Web Service. Answer B is not
correct because the Web Services Description Language tool generates
proxy classes to interface with the Web Service and does not discover Web
Services. Answer C is not correct because the Soapsuds tool is used not for
discovering Web Services, but for compiling client applications by downloading schema information and generating reference assemblies.
189
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Web
. . Services
. . . . .
Need to Know More?
Newcomer, Eric. Understanding Web Services: XML, WSDL, SOAP,
and UDDI. Addison-Wesley, 2002.
Short, Scott. Building XML Web Services for the Microsoft .NET
Platform. Microsoft Press, 2002.
The UDDI Project: www.uddi.org/.
The Microsoft UDDI Business Registry: uddi.microsoft.com.
8
Globalization
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terms you’ll need to understand:
✓ Globalization
✓ Localizability
✓ Localization
✓ Culture
✓ Resource files
✓ CultureInfo class
✓ CurrentUICulture property
✓ CurrentCulture property
✓ Invariant Culture
✓ Character encodings
✓ Mirroring
✓ String indexing
Techniques you’ll need to master:
✓ Understand the purpose of cultures within the .NET
Framework.
✓ Understand how to obtain a listing of available cultures from
an application.
✓ Understand how to perform application localization at runtime.
192 Chapter 8
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Modern global network applications might require the ability to support different languages and information-presentation formats based on the local
settings appropriate to the current user. Microsoft’s .NET Framework
includes support for culture and globalization changes, including form layouts, currency and numerical display, and locally appropriate maps and other
forms of image data.
Introduction to Localization
Applications created to support multiple localized configurations can be
managed by creating a separate version for each locale, or a single application can be created with integrated support for multiple local settings.
Planning for a globally deployed application includes many focus topics:
➤ Translating user interface (UI) text
➤ Translating between character encodings
➤ Controlling the direction of text display through the mirroring of char-
acter data
➤ Formatting currency and date values
➤ Managing data sorts to include different alphabets
Although it is possible to build multiple versions of an application, each designed to
support a particular locale, it is considered a better method to create a single application that supports localized automatic configuration. The former approach is not a
good solution because it is expensive. By building multiple versions of source code,
you will have to employ lots of resources. Furthermore, you will need to implement
bug fixes in all the versions of an application. Therefore, creating a single localizationaware application is easier to manage and is cost-efficient.
The following section discusses how to implement localization in an application.
The Localization Process
Microsoft divides the process of localization into three primary phases:
➤ Globalization—During globalization, you identify all localizable resources
and separate these resources from the fixed-code portions of the application. You perform this step during the design phase of an application.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Globalization
. . . . . . .
➤ Localizability—This process involves ensuring that translating an applica-
tion from one localization to another does not require design changes.
➤ Localization—This process customizes an application to include new
locales and localizable resources, as identified during the globalization
phase.
The terms globalization, localization, and localizability are often used interchangeably. Watch for questions involving these, and be sure to identify their function rather
than the term specified.
Localization Considerations
An application’s user interface (UI) provides many areas that require localization consideration:
➤ Menu item text.
➤ Form layouts. Different languages might represent the same data in dif-
ferent length of characters; for example, German text requires nearly
twice as much as space required by English text. Therefore, you need to
arrange form layouts accordingly.
➤ Time and date display format.
➤ Currency display format.
➤ Number display format, such as whether commas are used as the thou-
sands separator.
➤ Data input fields, such as the use of postal codes in countries that do not
use the U.S. ZIP code standard.
➤ Maps, road signs, photos, and other graphics displaying local content.
➤ Shortcut keys, including non–English-based keyboard support.
➤ Calendars, such as support for countries that do not use a Gregorian-
based calendar.
➤ Alphabetical order.
User Interface Localization
The System.Globalization namespace provides most of the .NET support
for localization in your applications. The two key features in development
are listed here:
193
194 Chapter 8
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ Cultures—An identifier for a specific locale
➤ Resource files—A storage location for culture-dependent resources such as
strings and bitmaps
A culture does not simply define the language to be used; many locales might share
the same language and yet have very different localization requirements. As an example, the United Kingdom and the United States both use English as the primary language, but they also use very different formats for currency and dates.
Cultures
Cultures are identified by abbreviations called culture codes. A full culture
code is made up of a neutral culture code, with one or more possible subculture codes. A neutral culture code specifies only a language and cannot be
used for localization. A subculture code specifies the location and other
information for localization. The following list shows a few examples of culture codes:
➤ de—The German culture. This is a neutral culture code, without a speci-
fied subculture code. Neutral cultures generally do not provide sufficient
information to localize an application.
➤ en-GB—The English (U.K.) culture. This is a specific culture that
includes enough information to localize an application—in this case, for
English speakers in Great Britain.
➤ az-AZ-Cyrl—A specific culture with two subculture codes. Here, the
culture refers to Azeri language in Azerbaijan, written using the Cyrillic
alphabet.
The CultureInfo Class
The System.Globalization.CultureInfo class provides various items of information about a particular culture. You can retrieve culture information using
CultureInfo class by performing the following steps:
1. Open Visual Studio .NET and create a new Visual C# .NET Windows
application.
2. Place a Button control named btnGetInfo, a TextBox control named
txtCulture, and a ListBox control named lbInfo on the form.
3. Add a reference to the System.Globalization namespace at the top of
the form’s code:
using System.Globalization;
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Globalization
. . . . . . .
4. Enter code to handle the button’s Click event:
private void btnGetInfo_Click(object sender, System.EventArgs e)
{
// Create a CultureInfo object for the specified culture
CultureInfo ci = new CultureInfo(txtCulture.Text);
// Dump information about the culture
lbInfo.Items.Clear();
lbInfo.Items.Add(“Display Name: “ + ci.DisplayName);
lbInfo.Items.Add(“English Name: “ + ci.EnglishName);
lbInfo.Items.Add(“Native Name: “ + ci.NativeName);
// Get day names
lbInfo.Items.Add(“Day Names:”);
String[] strDayNames = ci.DateTimeFormat.DayNames;
foreach(String strDay in strDayNames)
{
lbInfo.Items.Add(“ “ + strDay);
}
// Get the current year
lbInfo.Items.Add(“Current year: “ +
➥ci.Calendar.GetYear(DateTime.Today));
// And the currency symbol
lbInfo.Items.Add(“Currency symbol: “ +
➥ci.NumberFormat.CurrencySymbol);
}
5. Insert the Main method and set the form as the startup object for the
project. Then run the project. Enter the name of a culture in the text
box, and click the button to display some of the information of that
culture (see Figure 8.1).
Figure 8.1 The sample form displaying information on the fi-Fi (Finnish) culture.
You can use the CultureInfo.GetCultures method to retrieve an array of all supported CultureInfo objects. This method helps you enumerate all supported cultures.
195
196 Chapter 8
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The CurrentCulture and CurrentUICulture Properties
The .NET framework allows localization on a thread-by-thread basis. In a
normal Windows application, only a single thread of execution is used, represented by the Thread.CurrentThread object within the System.Threading
namespace.
Each thread has two properties that are used for determining the culture
to use:
➤ CurrentUICulture—Tells the Common Language Runtime (CLR) which
culture to use when selecting resources for the user interface. (Resource
files are covered in the next section of this chapter.)
➤ CurrentCulture—Dictates the format used for dates, times, currency,
numbers, and string comparison and casing rules.
Although localization settings can change currency display settings, the code does
not perform any type of currency conversion process. This affects only the manner
in which the data is displayed in the user interface.
The Invariant Culture
A special culture can be used to interact directly with system services or components that will not display data directly to the user interface. This cultureindependent setting is managed by using the Invariant culture, which can be
instantiated in two ways:
➤ Instantiate a new CultureInfo object with a empty input string:
CultureInfo ciInv = new CultureInfo(“”);
➤ Instantiate a new object using CultureInfo.InvariantCulture:
CultureInfo ciInv = CultureInfo.InvariantCulture;
Displaying Localized Information
You can display localized information by performing the following steps:
1. Open Visual Studio .NET and create a new Visual C# .NET Windows
application.
2. Place a Label control, a ComboBox control named cboSelectCulture,
and four TextBox controls named txtCulture, txtDate, txtCurrency, and
txtNumber on the form. Refer to Figure 8.2 for the design of this
form.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Globalization
. . . . . . .
3. Add the following using directives in Code view:
using System.Globalization;
using System.Threading;
4. Enter code to handle events within the form’s class definition:
private void SampleForm_Load(object sender, System.EventArgs e)
{
// Stock the combo box
foreach (CultureInfo ci in CultureInfo.GetCultures(
CultureTypes.SpecificCultures))
{
cboSelectCulture.Items.Add(ci.Name);
}
// Display the name of the default culture
txtCulture.Text = Thread.CurrentThread.CurrentCulture.EnglishName;
// Display some data
DisplayData();
}
private void cboSelectCulture_SelectedIndexChanged(
object sender, System.EventArgs e)
{
// Create an appropriate CultureInfo object for the thread
Thread.CurrentThread.CurrentCulture =
new CultureInfo(cboSelectCulture.Text);
// Display the name of the culture
txtCulture.Text = Thread.CurrentThread.CurrentCulture.EnglishName;
// Refresh the display of the data
DisplayData();
}
private void DisplayData()
{
DateTime dtNow = DateTime.Now;
Double dblcurrency = 13472.85;
Double dblnumber = 1409872.3502;
txtDate.Text = dtNow.ToLongDateString();
txtCurrency.Text = dblcurrency.ToString(“c”);
txtNumber.Text = dblnumber.ToString(“n”);
}
5. Insert the Main method and set the form as the startup object for the
project. Run the project. Select the name of a culture in the combo box
to display localized information using that culture (see Figure 8.2).
Note that no special code is required to format the data provided by
the ToLongDateString and ToString methods.
This example shows how to programmatically select a culture other than the
current culture of the operating system, which is the default culture.
197
198 Chapter 8
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Figure 8.2
The sample form displaying localized information using the Uzbekistan (Latin) culture.
Resource Files
Localizing the text displayed on the user interface is an important aspect of
multicultural application development. As discussed in Chapter 4,
“Components and .NET Assemblies,” localized data for user interfaces can
be configured as external resource files, satellite assemblies, or assembly
resource files. Assembly resource files are often the easiest to work with
because they are simply XML files that contain formatted text.
The following sections discuss how to localize the user interface using the
Visual Studio .NET IDE and using assembly resource files.
Localizing the User Interface in the Visual Studio .NET IDE
You can create a form that provides a localized user interface by first creating the user interface form. Follow these steps:
1. Open Visual Studio .NET and create a new Visual C# .NET Windows
application. Name the form SampleForm1.cs.
2. Place a label control, three radio button controls, and a button control
on the form, as shown in Figure 8.3.
Figure 8.3
A sample form displaying the placed controls.
3. Set the Localizable property of the form to true and set the Language
property to French (France).
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Globalization
. . . . . . .
4. Change the text of each of the controls to the French translations, and
expand the button to accommodate the French translation, as shown in
Figure 8.4.
Figure 8.4
The sample form now displaying French (France) localized settings.
After you have created the user interface form, you can add the localization
control form to your project:
1. Add a new form to your project and name it SampleForm2.cs.
2. Place a combo box control named cboCulture and a button control
named btnOpenForm on the form.
3. Add the references at the top of the form’s class definition:
using System.Globalization;
using System.Threading;
4. Add code to handle events within the form’s class definition:
private void SampleForm2_Load(object sender, System.EventArgs e)
{
// Put language choices in the combo box
cboCulture.Items.Add(“English”);
cboCulture.Items.Add(“French”);
}
private void btnOpenForm_Click(object sender, System.EventArgs e)
{
SampleForm1 f = new SampleForm1();
f.Show();
}
private void cboCulture_SelectedIndexChanged(
object sender, System.EventArgs e)
{
// When the user selects a language, change the UI culture
switch (cboCulture.Text)
{
case “English”:
Thread.CurrentThread.CurrentUICulture =
new CultureInfo(“en-US”);
break;
case “French”:
199
200 Chapter 8
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Thread.CurrentThread.CurrentUICulture =
new CultureInfo(“fr-FR”);
break;
}
}
5. Insert the Main method and set the SampleForm2.cs form as the start-
up object for the project. Then run the project. Select a culture from
the combo box and open the form using the button to display that culture’s settings, as shown in Figure 8.5. Note that all settings, including
the button-width change, are maintained.
Figure 8.5 Two examples of the same form created by selecting English or French culture localization for the form to be opened.
In the previous example, the localized settings for each culture are stored in
a resource file (.resx) and a satellite assembly (.dll), created automatically by
the Visual Studio .NET interface.
Localizing Resources at Runtime
Runtime user interface resources are loaded by an instance of the
System.Resources.ResourceManager class. After you have initialized a
ResourceManager object by calling one of the class’s constructors, you can
use two methods to retrieve localized settings:
➤ Use the GetObject method to return an object from the resource file.
➤ Use the GetString method to return a string from the resource file.
If you plan to move or resize controls, the satellite assembly approach like
that in the previous example is more convenient. In the satellite assembly
approach, you can move and resize controls directly within the Windows
Forms Designer. If you attempted this using assembly resource files, you
would also have to store position and size data, and then apply this information to your controls at runtime.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Globalization
. . . . . . .
Assembly resource files might be preferable when performing localization of
information that is not directly displayed on the user interface, such as text
that the application uses to display information in a message box. It is also
possible to create hybrid solutions using both satellite assemblies and assembly resource files within the same project. In such cases, you can use satellite
assemblies to localize controls, and you can use resource files to localize
other information presented by the application.
Character Encodings
Because many different character sets can be used in an application, the
.NET Framework provides support for encodings through the
System.Text.Encoding class. Encoding is a set of characters and their associated numerical values, such as the ASCII character set, which associates
common Latin characters with numerical values between 0 and 127.
Unicode
The .NET Framework utilizes the Unicode 2-byte (16-bit) character set by
default. The Unicode character set includes roughly 65,000 common characters from most of the world’s languages, with additional support possible
for approximately 1 million special characters. Older versions of Windows
and Microsoft development platforms made use of separate code pages, each
of which specified a 256-character encoding specific to a particular language
or locale.
Converting Encodings
Although the native mode of the .NET Framework uses the Unicode character set, the Framework includes support for the older encodings, to provide backward compatibility with legacy applications. The System.Text
namespace contains classes that can be used to convert characters from the
Unicode (UTF-16) encoding to other encodings, and vice versa.
Table 8.1 lists some of the more common subclasses of the
System.Text.Encoding class that can be used to convert between character
encodings.
201
202 Chapter 8
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 8.1 Encoding Subclasses Within the System.Text Namespace
Class
Use
ASCIIEncoding
Converts between Unicode and ASCII
Encoding
A general-purpose class using the Encoding.GetEncoding static
method to return encodings that can be used for legacy code page
compatibility
UnicodeEncoding
Converts to or from Unicode encoded as consecutive bytes
UTF7Encoding
Converts to and from 7-bit Unicode
UTF8Encoding
Converts to and from 8-bit Unicode
User Interface Mirroring
Because some cultures present information in different orientations, it is
sometimes necessary to include planning for a reversal of the left-to-right
order that is common in English- and German-speaking countries. In
Hebrew and Arabic, the language is written right to left on a page; user controls must be similarly reversed so that their functionality remains constant
based on the cultural access patterns of the user (see Figure 8.6).
Figure 8.6 An Arabic Windows user interface displaying the mirroring of controls, tab location, and
text.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Globalization
. . . . . . .
Mirroring in .NET
To reverse text input to be right to left, to change the location of text on the
title bar, to relocate menus to the right side of the menu bar, and to reverse
the appearance of combo box, radio box, and check box controls, you simply
need to set a form’s RightToLeft property to Yes.
Figure 8.7 shows an example of a form with its RightToLeft property set
to Yes.
Figure 8.7 An example of mirrored controls.
This can also be done at the control level instead of the form level, to limit
the area being mirrored by setting the control’s RightToLeft property to
RightToLeft.Yes. True mirroring of the entire form, like that shown in
Figure 8.6, requires a call to the SetProcessDefaultLayout Windows API.
Managing User Input
Global applications require several special considerations when planning for
manipulation and validation of user input. When attempting to validate nonLatin character user input, it might be necessary to extract single characters
in sequence through string indexing. The comparison and sort order of a
simple alphabetic sort routine might produce different results, depending on
the culture used.
String Indexing
The Unicode standard supports 32-bit extended characters (surrogate characters) and 32-bit characters that are formed by combining two 16-bit
Unicode characters (combined characters), such as an accent mark and the
base character to which it applies. To evaluate these characters amid other
normal input characters, it is sometimes necessary to parse an input string
203
204 Chapter 8
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
character by character for validation, taking into account the fact that some
characters might be 16-bit and others might be 32-bit.
The .NET Framework provides support for this type of string manipulation
through the System.Globalization.StringInfo class. This class can be used to
iterate through the elements in a string by calling the static
GetTextElementEnumerator() method of the StringInfo class. Given any
Unicode string, this method returns an iterator that you can use to move
through the string one character at a time, properly handling surrogate pairs
and combining characters. The iterator has a MoveNext() method that
returns false when it has exhausted the characters in the string. The Current
property of the iterator returns a single character from the current position
of the iterator. The following example shows how to iterate characters using
the StringInfo class:
1. Open Visual Studio .NET and create a new Visual C# Windows .NET
application.
2. Place a text box control named txtTest, a button control named
btnIterate, and a list box control named lbIterate on the form.
3. Add the references at the top of the form’s class definition:
using System.Globalization;
4. Add code to the Click events of the form’s button:
private void btnIterate_Click(object sender, System.EventArgs e)
{
lbIterate.Items.Clear();
// Get an iterator for the entered text
TextElementEnumerator iter =
StringInfo.GetTextElementEnumerator(txtTest.Text);
// The iterator starts before the string, have to move
// it forward once to reach the first element
iter.MoveNext();
do
lbIterate.Items.Add(“Element “ + iter.ElementIndex +
“: “ + iter.Current);
while(iter.MoveNext());
}
5. Insert the Main method and set the form as the startup object for the
project. Then run the project. Paste or enter text in the text box, and
click the button control to display the string one character at a time, as
shown in Figure 8.8.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Globalization
. . . . . . .
Figure 8.8
An example of indexed string output.
Comparing and Sorting Data
Some cultures sort alphabetical lists in different ways. For example, some
cultures place numeric characters before or after alphabetic characters. To
support culture-aware sorting, the .NET Framework includes several features:
➤ String.Compare method—Compares strings according to the rules of
CultureInfo, referenced by the CurrentCulture property
➤ CultureInfo.CompareInfo object—Supports substring searching according
to the rules referenced by the CurrentCulture property
➤ Array.Sort method—Orders the members of an array by the alphabetiza-
tion rules referenced by the CurrentCulture property
➤ SortKey.Compare method—Compares strings according to the rules refer-
enced by the CurrentCulture property
205
206 Chapter 8
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Practice Questions
Question 1
Which of the following should be used if you want to store culture-specific error
messages for an application?
❍ A. Embedded resource file
❍ B. External resource file
❍ C. Satellite assembly
❍ D. Assembly resource file
Answer D is correct. An assembly resource file is often the best solution
when you need to store localized data that is not directly displayed within the
user interface. Answer A is incorrect because an embedded resource is integrated into the application and is difficult to update without redeploying a
new version of the application. Answer B is incorrect because an external
resource file is typically used to allow integration of resources provided by
third-party vendors, rather than the XML-based assembly resource file that
is preferred. Answer C is incorrect because satellite assemblies are preferred
for data that is displayed within the user interface itself.
Question 2
Which phase of the localization process involves ensuring that culture-specific
translations do not require design changes?
❍ A. Globalization
❍ B. Globalizability
❍ C. Localizability
❍ D. Localization
Answer C is correct. The localizability phase involves planning to ensure that
changes in localization do not require application design changes between
versions. Answer A is incorrect because the globalization phase is used to
identify and separate localizable resources from application code. Answer B
is incorrect because there is no globalizability phase. Answer D is incorrect
because the localization phase involves implementing culture-based customized details identified in the globalization phase.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Globalization
. . . . . . .
Question 3
You are designing a Visual C# .NET Windows application that will be deployed
to your customers in Japan, France, and Germany. You provide a combo box
that allows the user to select the desired culture to display the application’s
interface. After the user selects the culture, you want all the forms in the application to use the selected culture. Which of the following actions should you
take?
❍ A. Set the Thread.CurrentCulture property to the CultureInfo object that
represents the selected culture.
❍ B. Set the Thread.CurrentUICulture property to the CultureInfo object that
represents the selected culture.
❍ C. Set the Thread.CurrentThread.CurrentCulture property to the
CultureInfo object that represents the selected culture.
❍ D. Set the Thread.CurrentThread.CurrentUICulture property to the
CultureInfo object that represents the selected culture.
Answer D is correct. The CurrentUICulture property specifies which culture to use when choosing resources for the user interface. Therefore, to set
the UI culture for the current thread, you should set the
Thread.CurrentThread.CurrentUICulture property. Answers A and C are
not correct because they set the CurrentCulture property, which is not used
for displaying the user interface. Answer B is not correct because it does not
set the culture for the currently executing thread.
Question 4
Which one of the following statements about cultures is the most correct?
❍ A. Cultures identify local settings such as date and numerical formatting.
❍ B. Cultures identify the user’s locale and associated values.
❍ C. Cultures identify local settings such as alphabetic order.
❍ D. Cultures identify the user’s language and text-based formatting details.
Answer B is correct. A culture is used to identify a user’s locale and any associated settings. Answers A, C, and D are all incorrect because they specify
only a portion of the possible settings managed by culture-aware applications.
207
208 Chapter 8
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 5
You are responsible for the planning of a new globally deployed application.
Which of the following are requirements that can be handled through culturespecific localization alone? (Select all that apply.)
❑ A. Translating user interface text labels to reflect the user’s culture setting
❑ B. Translating currency into local equivalent values based on the user’s
culture setting
❑ C. Translating date values into a format suitable to the user’s culture setting
❑ D. Controlling the direction of the entire user interface through the mirroring process
❑ E. Controlling the order of data sorting based on the user’s culture setting
Answers A, C, and E are correct. Culture-aware applications can configure
the user interface text labels, date value formats, and alphabetic sort order
based on the user’s CurrentCulture setting. Answer B is incorrect because
the localization process does not directly perform translation between equivalent currency values. Answer D is incorrect because mirroring of the entire
user interface requires a call to the SetProcessDefaultLayout Windows API.
Question 6
Users of your application need to display dates and currencies in German, but
you want the user interface in English. How can you accomplish this?
❍ A. Set the Thread.CurrentThread.CurrentCulture property to a CultureInfo
object that represents the de-DE culture, and set the
Thread.CurrentThread.CurrentUICulture property to a CultureInfo
object that represents the en-US culture.
❍ B. Set the Thread.CurrentThread.CurrentCulture property to a CultureInfo
object that represents the en-US culture, and set the
Thread.CurrentThread.CurrentUICulture property to a CultureInfo
object that represents the de-DE culture.
❍ C. Set the Thread.CurrentThread.CurrentCulture property to a CultureInfo
object that represents the de-DE culture, and set the
Thread.CurrentThread.CurrentUICulture property to a CultureInfo
object that represents the de-DE culture.
❍ D. Set the Thread.CurrentThread.CurrentCulture property to a CultureInfo
object that represents the en-US culture, and set the
Thread.CurrentThread.CurrentUICulture property to a CultureInfo
object that represents the en-US culture.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Globalization
. . . . . . .
Answer A is correct. The CurrentCulture property specifies which culture to
use for formatting dates, times, currencies, numbers, and so on. The
CurrentUICulture property control specifies which culture to use when
choosing resources for the user interface. Therefore, the CurrentCulture
property should be set to de-DE to display dates and currencies in German,
and the CurrentUICulture property should be set to en-US to display the
user interface in English.
Question 7
Which culture designation would be best for an English (U.K.)–based application responsible for communicating with two additional system processes running on the same server?
❍ A. en
❍ B. en-GB
❍ C. en-Invariant
❍ D. en-GB-Invariant
❍ E. Invariant
Answer E is correct. The Invariant culture is a culture-independent culture
setting used to allow communication with components that are not part of
the user interface, such as system processes. Answers A and B are incorrect
because en defines the English class itself, while en-GB defines the British
version of English, both of which would be proper for a user interface, but
not for culture-independent communications with other processes. Answers
C and D are incorrect because the Invariant culture is specified without additional culture details.
Question 8
Which of the following is most often used when a form must include cultureaware configuration settings to mirror data presentation order within its controls?
❍ A. Embedded resource file
❍ B. External resource file
❍ C. Satellite assembly
❍ D. Assembly resource file
209
210 Chapter 8
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Answer C is correct. A satellite assembly is used to store user interface configuration settings that vary between cultures, such as formatting and layout.
Answer A is incorrect because an embedded resource is compiled within the
code and is suitable for including common graphical icons and other standard components in an application. Answer B is incorrect because an
external resource file is most often used to include resources provided by
third-party vendors. Answer D is incorrect because an assembly resource file
is preferred for use with localized data that is not tied directly to the user
interface, such as message box text.
Question 9
Your application contains Unicode strings encoded in the default .NET
Framework encoding format. You want to copy these strings into a file in ASCII
encoding format so that your legacy ERP system can read the file and update its
system. How can you convert the data into ASCII encoding?
❍ A. Call the UnicodeEncoding.GetChars() method to perform the conversion.
❍ B. Call the ASCIIEncoding.GetChars() method to perform the conversion.
❍ C. Call the UnicodeEncoding.GetBytes() method to perform the conversion.
❍ D. Call the ASCIIEncoding.GetBytes() method to perform the conversion.
Answer D is correct. The GetBytes() method of any encoding object translates from Unicode characters to bytes that are represented by the encoding
object. Therefore, calling the ASCIIEncoding.GetBytes() method converts
the UTF-16 characters to ASCII format. Answers A and B are not correct
because the GetChars() method of any encoding object translates the bytes
represented by the ecoding object into Unicode characters. Answer C is not
correct because it would fetch the result in a Unicode byte array.
Question 10
How should you configure a form for mirroring in Visual Studio .NET applications?
❍ A. Set the LeftToRight property to No
❍ B. Set the RightToLeft property to Yes
❍ C. Set the Mirrored property to True
❍ D. Call the SetProcessDefaultLayout API
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Globalization
. . . . . . .
Answer B is correct. You should set the RightToLeft property to Yes to configure a form for mirrored presentation. Answers A and C are incorrect
because they specify nonexistent properties LeftToRight and Mirrored.
Answer D is incorrect because SetProcessDefaultLayout is a Windows API
used to mirror an entire application’s interface, and it is not part of the .NET
Framework’s basic settings available within Visual Studio .NET.
211
212 Chapter 8
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Need to Know More?
Symmonds, Nick. Internationalization and Localization Using
Microsoft .NET. Apress, 2001.
Unicode home page: www.unicode.org/.
Microsoft Global Software Development Archives: www.microsoft.
com/globaldev/articles/articles.asp.
9
Working with Legacy
Code
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terms you’ll need to understand:
✓ ActiveX controls
✓ COM/COM+ components
✓ Windows API
✓ Wrapper
✓ aximp.exe
✓ tlbimp.exe
✓ Platform Invoke
Techniques you’ll need to master:
✓ Understand the function of a proxy wrapper when integrating
legacy components within .NET applications.
✓ Know how to convert ActiveX controls to use within .NET
applications.
✓ Understand how to use Platform Invoke to invoke common
Windows API calls.
214 Chapter 9
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Although the .NET Framework can handle almost any possible application
development need, most organizations implement new .NET applications
within a collection of existing legacy code written using earlier technologies.
The ActiveX, COM, and COM+ functionality can be integrated into .NET
application development. You can also make calls to the Windows application programming interface (API) through .NET applications. This makes
migration to the .NET Framework much easier than writing everything
from the ground up. The interoperability features of .NET can handle legacy code in many ways:
➤ ActiveX—ActiveX controls can be placed on Windows forms.
➤ COM/COM+—These components can be instantiated and invoked by
.NET code.
➤ Windows API—The Windows API can be invoked using the Platform
Invoke capability (PInvoke) within .NET applications.
In this chapter, we discuss the integration of legacy code objects within
.NET application development.
It should be noted that the interoperability of .NET code is two-way. It is possible for
.NET code to call COM components, and vice versa.
Using ActiveX Controls
The .NET Framework utilizes an object-oriented development style, while
ActiveX components deliver encapsulated functionality through standard
interfaces that communicate with the form on which they are placed. To
make a legacy ActiveX control accessible as a .NET class, it is necessary to
encapsulate the ActiveX control within a wrapper, which serves as a proxy
between the .NET and ActiveX development technologies.
A wrapper is a software layer that acts as a control container for an ActiveX component. It allows .NET code to treat the contained component as a normal Windows
Forms control.
215
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Working
. . . . .with
. . Legacy
. . . . Code
. . .
The Windows Forms ActiveX Control
Importer (aximp.exe)
The System.Windows.Forms namespace includes a wrapper class, AxHost,
which is used to encapsulate ActiveX components. An instance of the AxHost
class must be customized for the contained ActiveX control. This is accomplished using the Windows Forms ActiveX Control Importer (aximp.exe), as
in the following example:
1. Create a folder to house the imported control.
2. Open the Visual Studio .NET command prompt, accessed through
Start, Programs, Microsoft Visual Studio .NET, Visual Studio .NET
Tools, Visual Studio .NET Command Prompt.
3. Navigate to the folder created in Step 1, and then enter the following
command (here, we are importing the SysInfo control included with
Visual Basic 6.0 on a system running Windows 2000):
aximp c:\winnt\system32\sysinfo.ocx
In Windows XP, replace c:\Winnt in the previous command with
c:\Windows.
The Importer lists the names of the files that were created by the
import process:
SysInfoLib.dll
AxSysInfoLib.dll
4. Open Visual Studio .NET and create a new Visual C# .NET Windows
application.
5. Right-click the References node of the Solution Explorer, and select
Add Reference to open the Add Reference dialog box.
6. Select the COM tab and browse to the folder created in Step 1.
7. Add references to both files created in Step 3.
8. Modify the form’s class definition as follows:
public class SampleControl : System.Windows.Forms.Form
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
private AxSysInfoLib.AxSysInfo sysInfo1;
public SampleControl()
{
// Required for Windows Form Designer support
216 Chapter 9
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
InitializeComponent();
// TODO: Add any constructor code after
// InitializeComponent call
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.Resources.ResourceManager resources = new
System.Resources.ResourceManager(Type.GetType(
“MyProject.SampleControl”));
this.sysInfo1 = new AxSysInfoLib.AxSysInfo();
((System.ComponentModel.ISupportInitialize)this.sysInfo1).
BeginInit();
this.SuspendLayout();
//
//SysInfo1
//
this.sysInfo1.Enabled = true;
this.sysInfo1.Name = “sysInfo1”;
this.sysInfo1.OcxState = (System.Windows.Forms.AxHost.State)
resources.GetObject(“SysInfo1.OcxState”);
this.sysInfo1.Size = new System.Drawing.Size(38, 38);
this.sysInfo1.TabIndex = 0;
//
// SampleControl
//
this.AutoScaleBaseSize = new System.Drawing.Size(5,
➥13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.AddRange(new System.Windows.Forms.Control[]
{this.sysInfo1});
this.Name = “SampleControl”;
this.Text = “SampleControl”;
this.Load += new System.EventHandler(this.SampleControl_Load);
((System.ComponentModel.ISupportInitialize)this.sysInfo1).
EndInit();
this.ResumeLayout(false);
}
#endregion
[STAThread]
static void Main()
217
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Working
. . . . .with
. . Legacy
. . . . Code
. . .
{
Application.Run(new SampleControl());
}
private void SampleControl_Load(object sender, System.EventArgs e)
{
MessageBox.Show(sysInfo1.OSVersion.ToString());
}
}
9. Switch back to Design view of the form to see the included instance of
the SysInfo control (see Figure 9.1).
Figure 9.1
Sample form displaying an instance of the imported SysInfo ActiveX component.
Importing Controls Using the Visual Studio
.NET Toolbox
Although the Windows Forms ActiveX Control Importer tool can be used to
create the necessary files to import an ActiveX component, you can also perform this task using the Visual Studio .NET toolbox. This is considered an
easier method because most of the setup work is done for you when importing the desired ActiveX component. The following example displays this
capability:
1. Open Visual Studio .NET and create a new Visual C# .NET Windows
application.
2. Right-click the toolbox and select Customize Toolbox to open the
Customize Toolbox dialog box.
3. Select the COM components tab in the Customize Toolbox dialog box.
Scroll down the list of registered controls on the system, and click the
checkbox for any controls to import, as shown in Figure 9.2.
218 Chapter 9
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Figure 9.2
The Customize Toolbox dialog box showing the Masked Edit Control selected for import.
4. Click OK to add the imported control to the toolbox, as shown in
Figure 9.3.
Figure 9.3
The Visual Studio .NET toolbox showing the newly imported Masked Edit control.
5. Drag and drop the imported control onto a form, as with any other
Windows Forms control.
The properties of an imported ActiveX control can be accessed using the properties
window. You also can click the ActiveX Properties hyperlink at the bottom of the
sheet to open the ActiveX control’s property sheet directly.
219
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Working
. . . . .with
. . Legacy
. . . . Code
. . .
Using ActiveX Controls
Imported ActiveX controls can be used like any other type of Windows
Forms control. However, there are a few drawbacks to consider:
➤ Performance—Calls to the wrapper providing support to ActiveX compo-
nents will generate additional delay, resulting in decreased performance
compared to pure .NET controls.
➤ Property names—Some property names might change when importing an
ActiveX component into the .NET Framework, to avoid conflicts with
existing properties. The most commonly encountered property name
change is the State property, which is renamed to CtlState during the
conversion process.
➤ Errors—Because ActiveX components are not managed code, errors and
memory-access issues can cause abnormal operation or undesired application termination.
➤ Deployment—Including ActiveX controls can add to the complexity of
application deployment because each workstation must have the ActiveX
control properly installed and registered.
Using COM Components
Beyond simply including ActiveX components within Windows Forms, you
will encounter situations that involve the instantiation and invocation of
other types of legacy COM components, including controls and class
libraries. During the process of migration to the .NET Framework, it is possible that other developers within an organization might continue producing
new COM-based functionality, while vendors might continue to make use of
this technology for some time beyond your organization’s migration. It is
critical to know how to use COM components within your .NET applications.
Runtime Callable Wrappers
The .NET Framework makes use of a Common Language Runtime (CLR),
which provides support for managed code, including garbage collection,
member management, security, and versioning. Legacy code, which is not
designed to operate within the CLR, does not gain this support and thus is
termed unmanaged code.
220 Chapter 9
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A proxy class must wrap unmanaged code, such as COM components, to
allow the CLR to call the encapsulated component. This proxy is termed a
runtime-callable wrapper. If you have Visual Basic 6.0, you can follow the next
steps to create a suitable COM component to test the inclusion of an unmanaged COM component within a .NET application:
1. Open Visual Basic 6.0 and create a new ActiveX DLL project.
2. Rename the Project1 node to MyCustomer, and the Class1 node to
Balances in the Project Explorer.
3. Add code to the Balances class:
Option Explicit
Private mintCustomerCount As Integer
Private macurBalances(1 To 10) As Currency
‘ Create a read-only CustomerCount property
Public Property Get CustomerCount() As Integer
CustomerCount = mintCustomerCount
End Property
‘ Create a GetBalance method
Public Function GetBalance(CustomerNumber As Integer) As Currency
GetBalance = macurBalances(CustomerNumber)
End Function
‘ Initialize the data
Private Sub Class_Initialize()
Dim intI As Integer
mintCustomerCount = 10
For intI = 1 To 10
macurBalances(intI) = Int(Rnd(1) * 100000) / 100
Next intI
End Sub
4. Save the project and then build the MyCustomer.dll to create the
COM component.
The Type Library Importer Tool (tlbimp.exe)
It is possible to import the metadata of a COM component using the Type
Library Importer (tlbimp.exe) tool to import the component’s type library.
You can create a runtime-callable wrapper for the COM component created
in the last example using the following steps:
1. Open the Visual Studio .NET command prompt, accessed through
Start, Programs, Microsoft Visual Studio .NET, Visual Studio .NET
Tools, Visual Studio .NET Command Prompt.
221
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Working
. . . . .with
. . Legacy
. . . . Code
. . .
2. Navigate to the folder containing the MyCustomers.dll and enter the
following code:
tlbimp MyCustomer.dll /out:NETMyCustomer.dll
3. After creating a Visual C# .NET Windows application, right-click the
References node in the Solution Explorer and select Add Reference.
4. Navigate to the NETMyCustomer.dll file and then click OK to add
the new reference to the project.
5. Switch to Code view of the form and add the following using directive:
using NETMyCustomer;
6. Use the component within your code as you would any .NET managed
code component. The wrapper will serve as a proxy between the .NET
and COM technologies.
Table 9.1 displays a number of important options for the Type Library
Importer tool (tblimp.exe).
Table 9.1 Options for the Type Library Importer Tool
Option
Meaning
/asmversion:versionNumber
Specifies the assembly’s version number
/delaysign
Prepares the assembly for delay signing
/help
Displays help on these options
/keycontainer:containerName
Signs the assembly with the strong name from the
specified key container
/keyfile:filename
Signs the assembly with the strong name from the
specified key file
/namespace:namespace
Specifies the namespace for the assembly
/nologo
Suppresses the startup banner display
/out:filename
Specifies the name of the created assembly
/primary
Produces a primary interop assembly
/publickey:filename
Contains a public key used to sign the resulting file
/reference:filename
Specifies a file used to resolve references from the
imported file
/silent
Suppresses information that would be displayed during
conversion
/strictref
Refuses to create the assembly if any references cannot be resolved
(continued)
222 Chapter 9
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 9.1 Options for the Type Library Importer Tool (continued)
Option
Meaning
/sysarray
Imports COM safe arrays as instances of the
System.Array class
/unsafe
Creates interfaces without .NET Framework security
checks
/verbose
Displays additional information during conversion
/?
Displays help on these options
Using COM Components Directly
The Visual Studio .NET interface supports directly adding a reference to
COM components. To do so, follow these steps:
1. After creating a new Visual C# .NET Windows application, right-click
the References node in the Solution Explorer and select Add
Reference.
2. Select the COM tab in the Add Reference dialog box and navigate the
list of registered COM components until you locate the MyCustomer
library.
3. Click OK to add the reference to the COM component.
4. Add the following code to the top of your form’s class definition:
using MyCustomer;
5. Use the component within your code as you would any .NET managed
code component. The wrapper will serve as a proxy between the .NET
and COM technologies.
When deciding between the Type Library Importer tool and directly referencing a
COM component, you should use the direct reference only if you do not need to be
able to sign the resultant assembly and place it in the Global Assembly Cache (GAC)
for distribution. If you need to distribute the application or manage its name, namespace, or version, you must use the Type Library Importer tool.
Using COM+ Components
COM+ extended the COM standard to allow several new features when running under Windows 2000 and later:
➤ Role-based security
➤ Object pooling and reusability
223
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Working
. . . . .with
. . Legacy
. . . . Code
. . .
➤ Queued components for asynchronous calls
➤ Transactional processing
➤ Publisher/subscriber events model
References to COM+ components can be created using the same techniques
as used for COM components. Using wrapped COM and COM+ components within .NET applications involves the same basic problems detailed
earlier in this section.
Using Platform Invoke
In addition to COM and COM+ components, the .NET Framework can
access other types of unmanaged code libraries. .NET can call functions
from unmanaged Windows API libraries through the use of Platform Invoke
(PInvoke), described in the following steps:
1. After creating a new Visual C# .NET application, place a
Label control
named lblComputerName on the form. Add the following code at the top
of the form’s class definition:
using System.Text;
using System.Runtime.InteropServices;
2. Add the following lines of code in the class definition, which indicates
that the GetComputerName method is implemented in kernel32.dll:
[DllImport(“kernel32.dll”, CharSet=CharSet.Auto)]
public static extern int GetComputerName(
StringBuilder buffer, ref uint size);
3. Add the following code to handle the
Load
event of the form:
private void SampleForm_Load(object sender, System.EventArgs e)
{
StringBuilder sbBuf = new StringBuilder(128);
UInt32 intLen = (uint) sbBuf.Capacity;
Int32 intRet=0;
// Call the Win API method
intRet = GetComputerName(sbBuf, ref intLen);
lblComputerName.Text = “This computer is named “ +
sbBuf.ToString();
}
In Viusal C# .NET, you should use a StringBuilder object for a Windows API call that
expects a string buffer.
224 Chapter 9
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PInvoke also can use API calls that require structures as parameters.
The .NET Framework and Visual Studio .NET include a variety of features
to make it easy to use legacy components. In this chapter, you learned about
three of those features:
➤ The capability to use ActiveX controls on a Windows form
➤ The capability to instantiate and invoke objects from a COM compo-
nent
➤ The capability to call functions from an unmanaged DLL
225
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Troubleshooting
. . . . . . . . .
Practice Questions
Question 1
After importing your favorite ActiveX control using the .NET toolbox, you insert
an instance of it as MyControl and need to manipulate a property named State.
Which of the following will result in the desired manipulation?
❍ A. Include this line of code:
MyControl.CtlState = 1;
❍ B. Include this line of code:
MyControl.AxState = 1;
❍ C. Include this line of code:
MyControl.State = 1;
❍ D. Include this line of code:
CtlState.MyControl = 1;
Answer A is correct. The State property is renamed during the import
process to CtlState, to avoid conflicting with the existing .NET State property. Answer B is incorrect because the normal renaming method results in a
property named CtlState. Answer C is incorrect because the State property
is a standard .NET property that requires the renaming of the imported
property to CtlState. Answer D is incorrect because the property specification must follow the name of the control, which is reversed here.
Question 2
Which of the following are reasons for using legacy code within .NET applications? (Select all that apply.)
❑ A. Other developers might be continuing to develop COM and ActiveX elements.
❑ B. Third-party components might use older technologies.
❑ C. COM+ components might be faster than their .NET equivalent.
❑ D. It is possible to migrate in stages.
Answers A, B, and D are correct. Using legacy components in your .NET
application enables you to begin a staged migration while other developers
continue using technologies they are more familiar with; this also enables
226 Chapter 10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
you to support third-party provided components. Answer C is incorrect
because the use of a proxy wrapper between .NET code and encapsulated
COM or COM+ components generally causes legacy components to suffer a
performance penalty compared to .NET components running within the
CLR.
Question 3
You want to use the Microsoft Masked Edit ActiveX control in your Visual C#
.NET application. How can you make this control available for your Windows
forms? (Select two.)
❑ A. Add the control directly to the Visual C# .NET toolbox
❑ B. Add a direct reference to the COM component
❑ C. Use the aximp.exe utility
❑ D. Use the tlbimp.exe utility
Answers A and C are correct. To use an ActiveX control in Windows forms,
you can either use the Windows forms ActiveX Control Importer tool
(aximp.exe) or you can add the ActiveX control directly to the Visual Studio
.NET toolbox. The latter technique automatically creates the necessary
wrapper for the ActiveX control. Answers B and D are not correct because
you cannot add an ActiveX control by using these methods. These methods
enable you to use COM components in .NET applications.
Question 4
Which of the following methods can be used to create a runtime-callable wrapper for a COM component? (Select all that apply.)
❑ A. Placing the COM component directly on your form
❑ B. Using the aximp.exe utility
❑ C. Adding a direct reference to the COM component
❑ D. Using the tlbimp.exe utility
Answers C and D are correct. You can create the necessary wrapper for a
COM component by adding a reference to the COM component directly or
by using the Type Library Importer utility (tlbimp.exe). Answer A is incorrect because ActiveX components predate the CLR and cannot be placed
directly on a .NET Windows form; this question also specifies a more general COM component than an ActiveX component. Answer B is incorrect
227
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Troubleshooting
. . . . . . . . .
because the Windows Forms ActiveX Control Importer (aximp.exe) can be
used only with ActiveX controls.
Question 5
Which one of the following statements is most true regarding the inclusion of
legacy components in your .NET application?
❍ A. COM components cannot take advantage of the enhanced support provided by the CLR, whereas COM+ components can.
❍ B. Legacy components cannot be used when their property names conflict with existing .NET properties.
❍ C. Legacy components suffer a performance loss due to the presence of
the wrapper class.
❍ D. Legacy component use is transparent to users within .NET applications.
Answer C is correct. The proxy wrapper adds an extra processing step during calls to legacy components, creating a decrease in performance over
.NET components. Answer A is incorrect because both COM and COM+
components are unmanaged code and thus cannot use the CLR’s support
capabilities. Answer B is incorrect because conflicting property names automatically are renamed during conversion. Answer D is incorrect because
legacy component use is slower and might require extra steps to properly
deploy the additional components to user workstations.
Question 6
You have set a direct reference to a COM component named
MortgageCalculator. This component is heavily used by the mortgage application developed in Visual C# .NET. Users report that the performance of the application is poor; it takes a lot of time when they perform mortgage calculations.
Which of the following options should you take to solve the problem?
❍ A. Rewrite the MortgageCalculator component as a .NET component.
❍ B. Use the Type Library Importer tool to generate wrapper assembly.
❍ C. Use the Platform Invoke to make calls to the BarGraph component.
❍ D. Store the MortgageCalculator component in the GAC.
Answer A is correct. Using COM components in .NET applications incurs
an overhead that can decrease the performance of your application. The best
option to remove the overhead is to rewrite the COM component as a .NET
228 Chapter 10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
component. Answer B is not correct because it does not matter how you generate wrapper assembly. Answer C is not correct because platform invoke is
used to call methods from unmanaged libraries, such as Windows API, not
from the COM component. Answer D is not correct because the
MortgageCalculator component is used by just one application and need not
be placed in the GAC.
Question 7
Which one of the following statements is most true regarding the usage of
PInvoke in .NET applications?
❍ A. PInvoke can be used to include legacy interoperability support for
ActiveX components.
❍ B. PInvoke can be used to include legacy interoperability support for COM
components.
❍ C. PInvoke can be used to include legacy interoperability support for COM
and COM+ components.
❍ D. PInvoke can be used to include legacy interoperability support for
Windows API calls.
Answer D is correct. Platform Invoke (PInvoke) is used to provide access to
Windows API calls. Answers A, B, and C are incorrect because PInvoke does
not provide support for COM, COM+, or ActiveX components, all of which
require a proxy wrapper class.
Question 8
Which of the following legacy items can be directly added using the Visual
Studio .NET interface? (Select all that apply.)
❑ A. ActiveX controls
❑ B. COM components
❑ C. COM+ components
❑ D. Windows API calls
Answers A, B, and C are correct. An ActiveX component can be directly
imported using the Visual Studio .NET toolbox, while COM and COM+
components can be directly added to the References node of the Solution
Explorer. Answer D is incorrect because PInvoke calls to the Windows API
require code within your application.
229
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Troubleshooting
. . . . . . . . .
Question 9
You are planning to use a COM component in your .NET application. You want
to place the COM component in the LegacyComponents namespace. Which of
the following options should you choose?
❍ A. Set a direct reference to the COM component. Change the namespace
in the wrapper class created to LegacyComponents.
❍ B. Use the Type Library Importer tool to create the wrapper class with the
/keycontainer option to specify the container namespace.
❍ C. Use the Type Library Importer tool to create the wrapper class with the
/namespace option to specify the desired namespace.
❍ D. Use the Type Library Importer tool to create the wrapper class with the
/out option to specify the output namespace.
Answer C is correct. When you want to manage the name, namespace, version, and other details while creating the wrapper assembly, you should
choose to create the wrapper using the Type Library Importer tool rather
than add a direct reference to the COM component. The /namespace option
is used to specify the namespace for the wrapper class. Answer A is not correct because you should not add a reference to the COM assembly if you
want to specify a namespace explicitly. Answer B is not correct because the
/keycontainer option signs the assembly with the strong name from the specified key container. Answer D is not correct because the /out option specifies
the name of the created wrapper assembly.
Question 10
Your application needs to use the GetUserName API function from advapi32.dll.
You declare the method using DllImport attribute, as follows:
[DllImport(“advapi32.dll”)]
public static extern bool GetUserName
(String buffer, ref int size);
When you call this method, you notice that the string buffer is empty, even
though there is a username specified. What should you do to solve the problem?
❍ A. Use the ref keyword along with the buffer declaration.
❍ B. Use the out keyword along with the buffer declaration.
❍ C. Replace the String object with StringBuilder object.
❍ D. Set the size of the string to a large number.
230 Chapter 10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Answer C is correct. In Platform Invoke calls, you should use the
StringBuilder object for a Windows API call that expects a string buffer to
hold the return value. Therefore, you should replace the String object with
the StringBuilder object. Answers A, B, and D are simply incorrect.
231
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Troubleshooting
. . . . . . . . .
Need to Know More?
Kalani, Amit. MCAD/MCSD Training Guide: Developing and
Implementing Windows-Based Applications with Microsoft Visual C#
.NET and Microsoft Visual Studio .NET, Exam 70-316. Que
Certifications, 2003.
Nathan, Adam. .NET and COM: The Complete Interoperability Guide.
Sams, 2002.
Troelsen, Andrew. COM and .NET Interoperability. Apress, 2002.
Windows Forms Community Site: www.windowsforms.net/.
10
User Assistance and
Accessibility
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terms you’ll need to understand:
✓ User assistance
✓ Accessibility
✓ HTML Help
✓ Topic files
✓ Table of contents
✓ Index
✓ HelpProvider component
✓ Pop-up help
✓ Tool Tip
✓ High Contrast mode
Techniques you’ll need to master:
✓ Understand the purpose of user assistance and accessibility
planning within your application.
✓ Know how to create and consume an HTML Help file project.
✓ Understand how to plan for application accessibility.
234 Chapter 10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Complex applications should include assistive coding to help users during
operation. This might include traditional help files or ToolTips that provide
specific help for individual components. Accessibility planning might include
details such as high contrast monochromatic (black-and-white) display or
alternate methods for data output such as Braille text readers.
➤ User assistance is the process of providing help within an application.
➤ Accessibility refers to making your application usable by those with dis-
abling conditions.
This chapter covers several ways in which your application can take advantage of the user assistance and accessibility options available within the .NET
Framework.
HTML Help
Multipaned HTML Help files are often the most familiar form of userassistive programming (see Figure 10.1). These files support typical help
descriptions that can be cross-linked using HTML hyperlinks, enabling a
user to navigate among related topics. Context-sensitive applications allow
access to HTML Help files that relate to the currently selected control.
Figure 10.1
An example of an HTML Help file.
At the time of this writing, HTML Help version 1.3 is the current standard. Version 2.0
is currently in beta and has not yet released the application programming interface
(API) that is necessary to call it from a Visual C# .NET form through context-sensitive
help.
235
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . User
. . . Assistance
. . . . . . and
. . Accessibility
. . . . . . .
Inside HTML Help 1.3
Many utilities can be used to create HTML Help files, including shareware
and commercial applications such as Robohelp. When you install Visual
Studio .NET, the HTML Help Software Development Kit (SDK) is
installed, along with a utility intended to make the creation of HTML Help
files less arduous: the HTML Help Workshop utility.
The HTML Help SDK includes the following components:
➤ HTML Help Workshop—An Integrated Development Environment (IDE)
for developing HTML Help files
➤ HTML Help ActiveX Control and HTML Help Java Applet—Components
that can be used for navigation within HTML Help files
➤ HTML Help Viewer—A host application used to display HTML Help
files
➤ HTML Help Image Editor—An application that can capture screenshots
and perform graphics-editing tasks
➤ HTML Help—An application that can execute HTML Help files outside
the browser
➤ HTML Help Compiler—An application that converts HTML Help
Workshop files into actual HTML Help files
➤ HTML Help Authoring Guide—Documentation for HTML Help file
developers
An HTML Help solution involves several files:
➤ Help project file—Determines the overall structure of the HTML help
file
➤ Topic files—Contain individual sections of help documentation written as
HTML files
➤ Graphics, sound, animation, and multimedia files—Can be embedded within
HTML Help files
➤ Contents files—Contain table of contents information
➤ Index files—Contain index information
236 Chapter 10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Help Project
The first step toward creating an HTML Help 1.3 solution is to create a
Help project. This can be done by completing the following steps:
1. Launch the HTML Help Workshop by choosing Start, Programs,
HTML Help Workshop, HTML Help Workshop.
2. Select File, New, and choose Project as the new file type. Click OK to
launch the New Project Wizard, and click Next to bypass the introduction.
3. Select an appropriate location and name for the new HTML Help
Project (.hpp) file and click Next. In the Existing Files page, click Next
because you do not need to include any existing files.
4. Click Finish to create the new project file, as shown in Figure 10.2.
Figure 10.2 New Help project in HTML Help Workshop.
Creating Topic Files
When you have created your HTML Help project, you must then create
topic files designed to assist the user in a particular situation. You first need
to know how your application will operate before you can create an appropriate help file for each situation. You can create a topic file by following
these steps:
1. In the HTML Help Workstop, select File, New.
2. Select HTML File from the available options, and click OK to open
the new HTML file.
3. Provide a meaningful title for the new file, and click OK to open the
file in the HTML Help Workshop workspace.
237
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . User
. . . Assistance
. . . . . . and
. . Accessibility
. . . . . . .
4. Modify the HTML file to include specific details for the desired topic,
such as these:
<!DOCTYPE HTML PUBLIC “-//IETF//DTD HTML//EN”>
<HTML>
<HEAD>
<meta name=”GENERATOR” content=”Microsoft&reg; HTML Help Workshop 4.1”>
<Title>Topic-Specific Title</Title>
</HEAD>
<BODY>
<h1>Topic Heading</h1>
<p><img src=”SomeImage.jpg”></p>
<p>This is the topic help text that will be displayed following the
image file noted above.</p>
</BODY>
</HTML>
5. Select File, Save File and provide a meaningful name for the topic file
to save.
You are not required to edit the raw HTML code here. You can also use any common HTML-editing utility, such as Microsoft’s FrontPage.
Linking Topic Files
Using HTML files for online help allows the cross-linking of individual
topic files through the use of a hyperlink. Hyperlinks should be familiar to
anyone who browses the Web. Clicking a hyperlink redirects the browser’s
focus to another page. This functionality allows users to navigate between
related topics.
A hyperlink can be placed anywhere in the body of the HTML file (between
the <BODY> and </BODY> tags), and it can be either a file reference for a
local file or a remote URL referencing an external file:
<p><a href=”somepage.htm”>Some Page</a></p>
<p><a href=”http://www.mycorp.com/someotherpage.htm”>
Some Other Page</a></p>
Creating a Table of Contents
To make your HTML Help files useful to users looking for a particular item,
you should create a table of contents. After you have created your topic files,
you can accomplish this within the HTML Help Workshop as follows:
1. In the HTML Help Workshop, select File, New. Select Table of
Contents and click OK.
238 Chapter 10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2. Provide a meaningful name for the new table of contents (.hhc) file,
and save the file.
3. Click the Options button on the Projects tab. Set the default file to the
proper HTML (.htm) file, and set the contents file to your newly created table of contents file (.hhc).
4. Select Edit, Insert Topic to add your topic files (.htm). When you
select existing items within the interface, your new additions become
subordinate items within the table of contents listing, as shown in
Figure 10.3.
Figure 10.3 Topic files listed within a table of contents in the HTML Help Workshop.
5. Continue adding topics until the table of contents is completed.
Creating an Index
One additional measure of assistance for users is a searchable index. You can
create this in the HTML Help Workshop by completing the following steps:
1. In the HTML Help Workshop, select File, New. Select Index and click
OK.
2. Provide a meaningful name for the new index (.hhk) file and save the
file.
3. Select Edit, Insert Keyword to open the Keyword dialog box. Select
the target HTML Help file (.hhp) project.
4. Provide a keyword and select Browse to navigate to the target topic file
(.htm) for the keyword. Then click OK.
239
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . User
. . . Assistance
. . . . . . and
. . Accessibility
. . . . . . .
5. Continue adding keywords until completed. Then click the Options
button on the Project tab of the HTML Help Workshop.
6. On the Files tab, set the index file to your newly created index file
(.hhk) and click OK.
Remember that a table of contents provides a structured way for users to find topics of interest. The index allows users to rapidly search for keywords.
Compiling and Testing an HTML Help File
After you have completed all topic files, the table of contents, and an index,
you can compile the HTML Help project and test it by following these steps:
1. In the HTML Help Workshop, save and close all files. Select File,
Compile to open the Create a Compiled File dialog box.
2. Select options if you want to display or save the compiled files. Provide
a meaningful name for the completed file and then click Compile.
3. After the compilation has been completed, click the View Compiled
File button, browse to the newly created file, and click View to open
the file in the Help browser.
Implementing User Assistance
After you have created your help files, you must make this information available in your application. User assistance has many elements, including the
following:
➤ Readme files and other introductory material for the user to refer to
even before installing the application
➤ Printed, online, or electronic documentation
➤ Email, telephone, or on-site support by product specialists
➤ Wizards, builders, and other user interface components designed to
guide the user through a process
➤ Help files, pop-up help, and ToolTip details for individual controls
Within your .NET application, you can provide integrated user assistance in
three main ways:
240 Chapter 10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ Help files—You can use the HelpProvider component to show a tradi-
tional help file.
➤ Pop-up help—You can use the HelpProvider component to provide pop-
up help for a dialog box.
➤ ToolTips—The ToolTip component can provide quick help for individual
controls.
The Help Class
The Help class can be used to display help from compiled Help files (.chm)
or HTML files in the HTML Help format. It consists of two static methods—ShowHelp and ShowHelpIndex—that enable you to display a help file
to its default topic instead of any specific topic. The ShowHelp method displays the contents of a specified help file, and the ShowHelpIndex method
displays the index of a specified help file.
The HelpProvider Component
The HelpProvider component can link your application and an associated
help file. By placing a HelpProvider component on your form, it extends
other objects on the form to include help-related properties. The extended
properties automatically appear in the Properties list for the form and its
controls.
The HelpNamespace property of the HelpProvider component specifies the
help file or target URL to use, while the HelpNavigator and HelpKeyword
properties specify the information to show from the help file.
Table 10.1 displays the possible values for the HelpNavigator property.
Table 10.1 Values of the HelpProvider.HelpNavigator Property
Value
Meaning
AssociateIndex
Displays the first topic listed in the index for the specified
HelpKeyword property
Find
Displays the search page of the specified help file
Index
Displays the index for the specified help file
KeywordIndex
Displays the index for the specified HelpKeyword property
TableOfContents
Displays the table of contents for the specified help file
Topic
Displays the topic identified by the specified HelpKeyword property
241
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . User
. . . Assistance
. . . . . . and
. . Accessibility
. . . . . . .
Pop-Up Help
Implementing the HelpProvider component to open a normal HTML Help
browser window might not always be desired. Dialog boxes are intended to
keep users focused on a simple task until it has been completed, and switching to another window might not be desirable in such a scenario. Pop-up
help can be used to allow the display of focused help information, without
including the additional navigability of a separate Help browser window or
to focus redirection.
After placing a HelpProvider component on your form, you can provide
pop-up help by entering text within the HelpString property for each control. Clicking the Help button on the form’s toolbar and then clicking a
control displays the HelpString text for that control.
To display a form’s Help button, set the HelpButton property to true, the MinimizeBox
property to false, and the MaximizeBox property to false.
The ToopTip Component
Another useful component that extends the properties of the controls on
your form is the ToolTip component. By placing a ToolTip component on
your form, you can provide a short text string for each control that will be
displayed when the user hovers the cursor over the control.
You can configure four properties to control the timing (in milliseconds) of
ToolTip displays:
➤ InitialDisplay—The delay before the initial ToolTip is displayed.
➤ AutoPopDelay—The time that the ToolTip remains visible.
➤ ReshowDelay—The delay before subsequent ToolTips are displayed as
the cursor moves across controls.
➤ AutomaticDelay—A single value used to set all three of the other proper-
ties. InitialDelay is set equal to AutomaticDelay, AutoPopDelay is set to
10 times AutomaticDelay, and ReshowDelay is set to one-fifth of
AutoDelay.
242 Chapter 10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Accessibility
When planning your application, you should take the time to consider the
various accessibility requirements of your users. Accessibility design planning includes five basic principles:
➤ Flexibility—The user interface should be flexibile and customizable,
allowing users to adjust it to their individual needs and preferences.
➤ Input methods—All operations in your application should be accessible by
the keyboard alone, and basic operations should be available via the
mouse as well. In the future, voice, directed-visual cues, and other types
of input might also be considered here.
➤ Output methods—Output should not depend on a single method (such as
sound, color, or text) for important information.
➤ Consistency—The application should be consistent with the Windows
operating system and other applications, to reduce the learning curve
required of new users.
➤ Compatibility with accessibility aids—Microsoft Windows includes a num-
ber of accessibility aids, such as the Magnifier and the On-Screen
Keyboard. Your application should support these.
Table 10.2 details some of the accessibility guidelines you should use to support these principles.
Table 10.2 Accessibility Guidelines for Application Design
Area
Guidelines
Color
Use color to highlight information, but not as the sole means
of conveying important information. Remember that not all
users can distinguish among all colors.
Disks
Do not make the user insert or swap removable media during
the normal operation of the application.
General User Interface
Provide a user interface that is flexible enough to accommodate the varying needs and preferences of different users,
such as providing keyboard navigation in addition to mouse
navigation.
Keyboard focus
Many accessibility aids need to identify the location of the
keyboard focus to function properly. The .NET Framework
normally takes care of this for you.
(continued)
243
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . User
. . . Assistance
. . . . . . and
. . Accessibility
. . . . . . .
Table 10.2 Accessibility Guidelines for Application Design (continued)
Area
Guidelines
Keyboard input
Applications should be accessible via keyboard input.
Alternative input devices often emulate the keyboard, so if
your application is fully available via the keyboard, it will generally be available to these devices as well.
Layout
Every item onscreen should be identified by a label, to assist
users who cannot see the entire screen at one time.
Mouse input
Some users might use a mouse (or a device whose interface
emulates a mouse) more easily than a keyboard. Your application should also be available via the mouse.
Multitasking
Excessive consumption of processor power can interfere with
accessibility aids. Your application should be as efficient as
possible.
Size
Allow users to resize items onscreen to accommodate their
own preferences.
Sound
Use sound to enhance information, but do not rely on it as
the sole means of conveying important information. Users
with hearing impairments or those working in noisy environments might be unable to make use of sound cues.
Timing
Timed events should be adjustable by the user to accommodate varying reaction times based on user preferences.
Control Properties for Accessibility
The .NET Framework provides a number of accessibility-related properties
for controls, including these:
➤ AccessibleDescripton property—This is a description of the control that will
be reported to accessibility aids.
➤ AccessibleName property—This is the control’s name that will be reported
to accessibility aids.
➤ AccessibleRole property—This is the control’s role that will be reported to
accessibility aids.
➤ BackColor property and ForeColor property—Use the default value to use
the user’s selected screen colors.
➤ BackgroundImage property—Leave this property empty to help users read
text on your forms.
➤ Font-Size property—If the font size on your form is fixed, it should be set
to at least 10 points (10pt).
244 Chapter 10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ TabIndex property—Set the TabIndex for each control to ensure a sensible
navigation path and to make sure that shortcut keys work to access
controls.
➤ Text property—Use the ampersand character (&) to create shortcut keys
and ensure keyboard access to controls.
Supporting High Contrast Mode
Many users use the High Contrast property to make information more clearly recognizable. Your application can adjust its functionality based on the
value of the Boolean SystemInformation.HighContrast property. An event
handler for the SystemEvents.UserPrefernceChanged event can allow your
application to change its operation when the HighContrast property
changes.
To make effective use of the High Contrast mode, your application should
do the following:
➤ Use only system colors to display controls
➤ Add visual cues, such as a bold font face or special icons, to enhance
information instead of using color
➤ Remove background images or patterns
245
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . User
. . . Assistance
. . . . . . and
. . Accessibility
. . . . . . .
Practice Questions
Question 1
You have created an HTML Help file for an application. You have placed a
HelpProvider component on the form. You have set the HelpProvider component’s HelpNamespace property to HTML help file, to link the help file with the
application. You now want to display a specific help topic from the help file for
this form. Which of the following properties should you choose? (Select two.)
❑ A. HelpKeyword
❑ B. HelpString
❑ C. HelpNavigator
❑ D. ShowHelp
Answers A and C are correct. The HelpKeyword and HelpNavigator properties
specify the exact information to show from the help file. The HelpKeyword
property specifies the information to display. The HelpNavigator property
specifies which element of the help file to display. Answer B is not correct
because the HelpString property specifies the help to be displayed for the
pop-up help. Answer D is not correct because the ShowHelp property indicates whether the help for the form should be displayed.
Question 2
Which of the following are components of the HTML Help system? (Select all
that apply.)
❑ A. Project file
❑ B. Topic files
❑ C. Contents file
❑ D. Index file
❑ E. Keyword file
Answers A, B, C, and D are correct. An HTML Help project includes the
project file, several topic files, a contents file, and an index file. Keywords are
associated with help destinations within the index file rather than in a separate keywords file, making answer E incorrect.
246 Chapter 10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 3
Where should you place a hyperlink reference within a topic file? (Select the best
answer.)
❍ A. Between the <HEAD> and </HEAD> tags
❍ B. Between the <BODY> and </BODY> tags
❍ C. Between the <HTML> and </HTML> tags
❍ D. Between the <LINK> and </LINK> tags
Answer B is correct. A hyperlink reference should be placed within the body
of the HTML file, between the <BODY> and </BODY> tags. Answer A is
incorrect because the <HEAD> and </HEAD> tags define the header portion of the HTML file. The <HTML> and </HTML> tags enclose both the
header and body portions of the HTML file, making answer C incorrect
because it is not the best option available. Answer D is incorrect because a
hyperlink uses <a href=“...”> and </a> tags rather than <LINK> and
</LINK> tags.
Question 4
Your application contains a modal dialog box form. You need to provide user
assistance in the form of pop-up help for the dialog box form. How should you
set the properties of the form? (Select all that apply.)
❑ A. Set the HelpButton property to true.
❑ B. Set the HelpButton property to false.
❑ C. Set the MaximizeBox property to true.
❑ D. Set the MaximizeBox property to false.
❑ E. Set the MinimizeBox to true.
❑ F. Set the MinimizeBox to false.
Answers A, D, and F are correct. To display pop-up help, the form should
have the HelpButton set to true and the MaximizeBox and MininmizeBox
properties set to false.
247
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . User
. . . Assistance
. . . . . . and
. . Accessibility
. . . . . . .
Question 5
One of your users makes use of an electromyogram mouse emulator that moves
the cursor based on muscular tension. Which of the accessibility design principles would include planning for this device? (Select the best answer.)
❍ A. Flexibility
❍ B. Input methods
❍ C. Output methods
❍ D. Consistency
❍ E. Compatibility with accessibility aids
Answer B is correct. Input method planning includes making sure that your
application supports mouse and keyboard access. Alternate input-emulation
devices that use keyboard and mouse functionality should then work with
your application. Answer A is incorrect because flexibility addresses the need
to allow users to select their own preferences. Answer C is incorrect because
a mouse emulator is an input device rather than an output device. Answer D
is incorrect because consistency involves making your application compatible with the standard Windows interface, to make it more easily navigable to
users familiar with the Microsoft platform. Answer E is incorrect because the
Windows accessibility aids are software rather than hardware.
Question 6
You are creating an installation wizard for your new application and want to
provide help for each stage of the installation. It is important that no new
processes are instantiated during the installation. Which form of help should
you implement to meet this requirement?
❍ A. HTML Help
❍ B. Pop-up help
❍ C. ToolTips
❍ D. Readme files
Answer B is correct. Pop-up help provides assistance to users within an application without requiring a secondary help browser window. Answer A is
incorrect because HTML Help makes use of the help file browser. Answer
C is incorrect because a ToolTip is used to provide brief by-control assistance when a user passes the cursor over a control, and it would not be the
best solution for user help for each section of the installation process. Answer
D is not correct because opening Readme files would require a different
process to start.
248 Chapter 10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 7
Your application needs to be accessible by accessibility aids such as screen
readers. Which properties should you explicitly set for every control? (Select
two.)
❑ A. ForeColor property
❑ B. BackColor property
❑ C. AccessibleName property
❑ D. AccessibleDescription property
❑ E. AccessibleRole property
Answers C and D are correct. The AccessibleDescription and AccessibleName
properties provide important information for accessibility aids. The
AccessibleRole property needs to be set only in special situations, thus making answer E incorrect. Answers A and B are not correct because the
ForeColor and BackColor properties need not be set; if they are left at their
default values, the user can adjust colors through the Control Panel.
Question 8
Which ToolTip properties can be used to set the delay before a ToolTip is displayed? (Select all that apply.)
❑ A. AutomaticDisplay property
❑ B. AutoPopDelay property
❑ C. InitialDisplay property
❑ D. ReshowDelay property
Answers A, C, and D are correct. The InitialDisplay property specifies the
delay before the initial ToolTip is displayed, and the ReshowDelay property
specifies the delay before another ToolTip is displayed when a user passes the
cursor over several controls. The AutomaticDisplay property can be used to
set all three of the other values. Answer B is incorrect because the
AutoPopDelay specifies the length of time that a ToolTip will be displayed
after the cursor moves over the control.
249
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . User
. . . Assistance
. . . . . . and
. . Accessibility
. . . . . . .
Question 9
Which utility within the HTML Help SDK provides the integrated development
environment for developing HTML Help projects?
❍ A. HTML Help Viewer
❍ B. HTML Help
❍ C. HTML Help Workshop
❍ D. HTML Help Compiler
Answer C is correct. The HTML Help Workshop provides the IDE for
developing HTML Help projects. Answers A and B are incorrect because the
HTML Help Viewer and HTML Help are applications that can be used to
view or execute HTML Help files outside the help browser. Answer D is
incorrect because the HTML Help Compiler is used to convert HTML
Help project files into actual HTML Help files.
Question 10
Your application uses the system default colors and fonts throughout. When the
user makes a data entry mistake, the computer beeps and the cursor remains in
place. When the user saves a record, the data in the controls is cleared and the
cursor is returned to the first control on the form. What should you do to make
this form more accessible?
❍ A. Provide audio notification of saves.
❍ B. Provide an additional, nonaudio means of notification for data entry
errors.
❍ C. Prompt the user before clearing the form.
❍ D. Set the form’s BackColor property to White instead of depending on
the system properties.
Answer B is correct. Your application should provide an additional nonaudio
means for notifying data entry errors. Answer A is not correct because an
accessible application should not depend on sound as the sole means of feedback. Answer C is not correct because this requires the user to respond to a
dialog box every time the form is cleared. Answer D is not correct because
an application should mostly use the system properties to set the form’s properties, such as BackColor.
250 Chapter 10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Need to Know More?
Kalani, Amit. MCAD/MCSD Training Guide: Developing and
Implementing Windows-Based Applications with Microsoft Visual C#
.NET and Microsoft Visual Studio .NET, Exam 70-316. Que
Certification, 2003.
Windows Forms Community Site: www.windowsforms.net/.
Microsoft Accessibility Site: www.microsoft.com/enable/dev/.
11
Printing
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terms you’ll need to understand:
✓ PrintDocument component
✓ Print method
✓ BeginPrint event
✓ QueryPageSettings event
✓ PrintPage event
✓ EndPrint event
✓ PrintPageEventArgs class
✓ PageSettings class
✓ PrinterSettings class
✓ PageSetupDialog component
✓ PrintPreviewDialog component
✓ PrintPreviewControl control
✓ PrintDialog component
Techniques you’ll need to master:
✓ Understand the order of events generated during a print job.
✓ Understand how to configure the common PageSettings and
PrinterSettings properties.
✓ Understand how to use the four standard Windows printing
controls.
252 Chapter 11
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Many applications require the capability to produce permanent, printed output. This chapter reviews sending output to a printer from within your
.NET application. Although the Visual Studio .NET package includes an
integrated version of Crystal Reports, this is not a focus of the exam and thus
it is not covered in detail here.
The PrintDocument Component
The .NET Framework makes use of the System.Drawing.
Printing.PrintDocument class for printing output. You can print anything
you can draw using the PrintDocument class. Printing in .NET applications
is very similar to drawing text and graphics using the classes in the
System.Drawing and its child namespaces. You learned about drawing graphical interface elements in Chapter 1, “Introducing Windows Forms.”
To implement printing, you need to create a new instance of the
PrintDocument class, set its properties and then call its Print method, which
fires the PrintDocument.PrintPage event. You can retrieve a Graphics object
from the PrintPage event and treat it as the page from which data can be
printed. Using methods of the Graphics class, such as the Font and Brush
objects, you can paint text and graphics on each page.
To implement printing, the order of operations is as follows:
1. Instantiate a copy of the PrintDocument component in the Windows
form.
2. Write code in the component’s PrintPage event handler that will dic-
tate what is to be printed. At the end of this event, set the
HasMorePages property to indicate whether there are more pages to
print.
3. Call the Print method of the PrintDocument object to generate output
to the printer.
4. The BeginPrint event fires once, before the first page of the job prints.
5. The QueryPageSettings event fires immediately before each PrintPage
event, allowing manipulation of the page settings through
QueryPageSettingsEventArgs.PageSettings property before the page is
printed.
6. The PrintPage event fires once for each page to be printed.
7. The EndPrint event fires once, after the last page of the job has
printed.
253
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Printing
. . . .
Printing Text
The DrawString method of the Graphics class allows you to print text. In the
following steps, you learn how to use the DrawString method to create a
sample form capable of printing multiple pages. The number of pages is calculated based on the number of lines and the height of the selected font:
1. Open Visual Studio .NET create a new Visual C# .NET Windows
application with a form.
2. Place a TextBox control named txtText, a Label control, a
NumericUpDown control named nudCopies, a FontDialog component, two button controls named btnSetFont and btnPrint, and a
PrintDocument component from the toolbox on your form. Figure
11.1 shows the design for this form.
Figure 11.1 You can print multiple lines of text by using the font height to calculate the vertical
position where the text should be printed.
3. Add this using directive in Code view:
using System.Drawing.Printing;
4. Add this code to the class definition:
// Create a default font to print with
Font fnt = new Font(“Arial”, 10, FontStyle.Regular, GraphicsUnit.Point);
// Number of lines printed so far
Int32 intLines = 0;
5. Add this code to handle the events:
private void btnPrint_Click(object sender, System.EventArgs e)
{
intLines=0;
printDocument1.Print();
}
private void btnSetFont_Click(object sender, System.EventArgs e)
{
254 Chapter 11
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
// Start with the current font
fontDialog1.Font = fnt;
// If the user clicks OK, set a new font
if(fontDialog1.ShowDialog() == DialogResult.OK)
{
fnt = fontDialog1.Font;
}
}
private void printDocument1_PrintPage(object sender,
➥System.Drawing.Printing.PrintPageEventArgs e)
{
// Determine the height of the font
float fltFontHeight = fnt.GetHeight(e.Graphics);
// Vertical position for the next line of text
float fltCurrentY = 0;
bool pageDone = false;
while (!pageDone)
{
// Check to see whether there’s more space on the page
if(fltCurrentY <= e.MarginBounds.Height)
{
// Increment the line number
intLines += 1;
if(intLines <= nudCopies.Value)
{
// Print the text, using the selected font
e.Graphics.DrawString(txtText.Text, fnt, Brushes.Black,
➥0, fltCurrentY);
// And increment the vertical location on the page
fltCurrentY += fltFontHeight;
}
else
{
// We’ve printed all the copies we need to print. In
// this case, set the flags to indicate that this page
// is done, but there are no more pages
pageDone = true;
e.HasMorePages = false;
}
}
else
{
// We want to print another line, but there’s no space
pageDone = true;
e.HasMorePages = true;
}
}
}
6. Insert the Main method to launch this form, set the form as the startup
object, and then run the application. After entering some text and
manipulating the controls, you can print the result by clicking the
Print button. The results automatically are formatted to fit on separate
pages if required by the font and the number of copies specified for
printing.
255
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Printing
. . . .
The PrintPageEventArgs Class
The System.Drawing.Printing.PrintPageEventArgs class is used to provide
properties of the printed page, such as the margins and page size that define
the printable area. Table 11.1 presents many of the more common properties
of the PrintPageEventArgs class.
Table 11.1 Properties of the PrintPageEventArgs Class
Property
Meaning
Cancel
Gets or sets a value indicating whether the print job should be cancelled.
Graphics
Graphics object representing the page to be printed.
HasMorePages Boolean value indicating whether more pages are left.
MarginBounds
Rectangle representing the printable area of the page.
PageBounds
Rectangle representing the entire page.
PageSettings
Object that gets or sets page settings such as orientation.
The PageSettings property represents a PageSettings object that stores page
settings. The PageSettings object contains the PrinterSettings property that
exposes the PrinterSettings object. You should be familiar with some of the
more common properties of the PageSettings and PrinterSettings subclasses, as presented in Tables 11.2 and 11.3.
Table 11.2 Properties of the PageSettings Class
Property
Meaning
Bounds
Size of the page based on orientation.
Color
Gets or sets a value indicating whether to print in color.
Landscape
Is true if the page is in landscape (sideways) orientation.
Margins
Gets or sets the margins.
PaperSize
Gets or sets the paper size.
PaperSource
Gets or sets the paper source.
PrinterResolution
Gets or sets the resolution.
PrinterSettings
Returns the current PrinterSettings object.
256 Chapter 11
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 11.3 Properties of the PrinterSettings Class
Property
Meaning
CanDuplex
Is true if the printer supports duplex (two-sided) printing.
Collate
Is true if the printer output is collated.
Copies
Gets or sets the number of copies to print.
DefaultPageSettings
Returns a PageSettings object for this printer.
Duplex
Gets or sets the duplex setting.
FromPage
Gets or sets the first page number.
InstalledPrinters
Gets the names of all printers on the system.
IsDefaultPrinter
Indicates whether this is the default printer.
IsPlotter
Indicates whether this is a plotter.
IsValid
Indicates whether the PrinterName property designates a valid
printer.
LandscapeAngle
Number of degrees of rotation between portrait and landscape
output.
MaximumCopies
Maximum number of copies that you can print at once.
MaximumPage
Maximum number of pages allowed in the Print dialog box selection.
MinimumPage
Minimum number of pages allowed in a Print dialog box selection.
PaperSizes
Paper sizes supported by this printer.
PaperSources
Paper sources supported by this printer.
PrinterName
Gets or sets the name of the printer to use. Changing this property changes the target printer.
PrinterResolutions
Resolutions supported by this printer.
PrintRange
Page numbers specified for printing.
PrintToFile
Is true if output will be sent to a file.
SupportsColor
Is true if this printer supports color.
ToPage
Gets or sets the last page number to print.
Printing Graphics
It is also possible to print graphic images using the PrintDocument class, as
in the following example:
1. Open Visual Studio .NET and create a new Visual C# .NET Windows
application with a form.
257
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Printing
. . . .
2. Place a button control named btnPrintGraphics and a PrintDocument
component from the toolbox on your form.
3. Add these using directives in Code view:
using System.Drawing;
using System.Drawing.Printing;
using System.Drawing.Drawing2D;
4. Add this code to handle the events:
private void btnPrintGraphics_Click(object sender, System.EventArgs e)
{
printDocument1.Print();
}
private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
Graphics grfx = e.Graphics;
// Set the Smoothing mode to SmoothingMode.AntiAlias
grfx.SmoothingMode = SmoothingMode.AntiAlias;
// Create Pen objects
Pen penYellow = new Pen(Color.Blue, 20);
Pen penRed = new Pen(Color.Red, 10);
// Call Draw methods
grfx.DrawLine(Pens.Black, 20, 130, 250, 130);
grfx.DrawEllipse(penYellow, 20, 10, 200, 100);
grfx.DrawRectangle(penRed, 150, 10, 100, 100);
// No more pages to print
e.HasMorePages = false;
}
5. Insert the Main method to launch this form, set the form as the startup
object, and then run the application. When you click the button, the
form prints a rectangle, an ellipse, and a line on the output page.
Using the Printing Controls
Although it is possible to design forms that can be used to set all the
PageSettings and PrinterSettings property values, it is easier to use the provided Windows components to set Page settings and Printer settings:
➤ PageSetupDialog component
➤ PrintPreviewDialog component
➤ PrintPreviewControl control
➤ PrintDialog component
Each of these is discussed in the following sections.
258 Chapter 11
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The PageSetupDialog Component
The PageSetupDialog component is the standard Windows Page Setup dialog box used in most Windows applications, as shown in Figure 11.2.
Figure 11.2 The Page Setup dialog box showing a portrait-oriented page.
You can experiment with this component by modifying the first form created in this chapter to include a button control named btnPageSetup and a
PageSetupDialog component named pageSetupDialog1. Add the following
code to handle the Click event of the btnPageSetup control:
private void btnPageSetup_Click(object sender, System.EventArgs e)
{
// Create a PageSettings object and send it to the dialog
pageSetupDialog1.PageSettings = new PageSettings();
if(pageSetupDialog1.ShowDialog() == DialogResult.OK)
{
printDocument1.DefaultPageSettings =
➥pageSetupDialog1.PageSettings;
}
}
When you click the Page Setup button, an instance of the Page Setup dialog
box is displayed. This component has four properties that can be used to
enable or disable different portions of the dialog box:
➤ AllowMargins—If false, disables margin settings.
➤ AllowOrientation—If false, disables orientation (print direction) settings.
259
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Printing
. . . .
➤ AllowPaper—If false, disables paper size and source settings.
➤ AllowPrinter—If false, disables the Printer Selection button.
The PrintPreviewDialog Component
Another standard Windows component is the PrintPreviewDialog component, which enables a user to preview printed output before it is sent to the
printer.
You can experiment with this component by modifying the form used in the
previous section to include another button control named btnPreview and a
PrintPreviewDialog component named printPreviewDialog1. Add the following code to handle the Click event of the btnPreview control:
private void btnPreview_Click(object sender, System.EventArgs e)
{
printPreviewDialog1.ShowDialog();
}
When you click the Preview button, an instance of the PrintPreview dialog
box is displayed, as shown in Figure 11.3.
Figure 11.3
The PrintPreviewDialog component displaying two pages of formatted output.
The PrintPreviewDialog component provides access to several encapsulated
features:
➤ Capability to print from the preview interface (the printer icon)
➤ Adjustable Zoom settings (the magnifying glass icon)
➤ Multipage display modes allowing 1, 2, 3, 4, or 6 pages to be displayed
at once
➤ The capability to scroll through all pages of the document that is being
printed
260 Chapter 11
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The PrintDocument object’s events are fired in both the preview and print mode.
The PrintPreviewControl Control
It is also possible to embed a print preview control directly within your form
so that a separate preview dialog interface is not required. You can include
this functionality within the form you have been experimenting with by
adding a PrintPreviewControl control to the form and by modifying the
code fired by the Click event of the Preview button, as follows:
private void btnPreview_Click(object sender, System.EventArgs e)
{
intLines=0;
// Set the Document property of the control to printDocument1
printPreviewControl1.Document=printDocument1;
}
When you click the Preview button, an instance of the PrintPreviewControl
control is displayed within the expanded form, as shown in Figure 11.4.
Figure 11.4 Sample form showing an included instance of the PrintPreviewControl.
The PrintPreviewControl will not function properly if you drop an instance onto a
form and set its properties. It must be instantiated during runtime.
261
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Printing
. . . .
Unlike the PrintPreviewDialog component, the PrintPreviewControl control lacks the integrated feature buttons for presentation and scrolling.
However, the control includes several features that can be manipulated by
your code to produce the same results, as detailed in Table 11.4.
Table 11.4 Selected Properties of the PrintPreviewControl Control
Property
Meaning
AutoZoom
If true, automatically changes the zoom factor when the control is
resized.
Columns
Number of columns of pages to display.
Rows
Number of rows of pages to display.
StartPage
Page number of the first page to display.
UseAntiAlias
If true, allows antialiasing when displaying the print preview. This provides higher-quality text but takes longer to render.
Zoom
Zoom factor to use.
The PrintDialog Component
One more Windows component is the PrintDialog component, which
enables a user to control a printer and its properties.
You can experiment with this component by modifying the same form to
include another Button control named btnPrinter and a PrintDialog component named printDialog1. Add the following code to handle the Click event
of the btnPrinter control::
private void btnPrinter_Click(object sender, System.EventArgs e)
{
// Create a PrinterSettings object and send it to the dialog
printDialog1.PrinterSettings = new PrinterSettings();
if(printDialog1.ShowDialog() == DialogResult.OK)
{
printDocument1.PrinterSettings = printDialog1.PrinterSettings;
}
}
When you click the Printer button, an instance of the PrintDialog component is displayed, as shown in Figure 11.5.
The PrintDialog component allows a user to set printer-related settings
encapsulated in a PrinterSettings object. The settings are then retrieved and
applied to the PrintDocument object through its PrinterSettings property.
262 Chapter 11
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Figure 11.5
The PrintDialog component displaying current printer settings.
263
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Printing
. . . .
Practice Questions
Question 1
You are printing the first page of a two-page document and want to fire the
PrintPage event for the second page. How can you do this with the least amount
of effort?
❍ A. Set the HasMorePages property to false.
❍ B. Set the HasMorePages property to true.
❍ C. Perform a simple loop, instantiating the PagePrint method for each
page in order.
❍ D. Place two PrintDocument components within the application, and link
each to the appropriate page.
Answer B is correct. By setting the HasMorePages property to true, the
PrintDocument component will generate the next page’s output. Answer A is
incorrect because setting the HasMorePages property to false would tell the
component there are no more pages to print. Answers C and D are incorrect
because they involve far more effort and might limit later application expansion to include reports with more than two pages.
Question 2
Which events fire once for each page to be printed? (Select all that apply.)
❑ A. BeginPrint
❑ B. QueryPageSettings
❑ C. PrintPage
❑ D. EndPrint
Answers B and C are correct. The QueryPageSettings and PrintPage events
both fire once for each printed page. Answer A is incorrect because the
BeginPrint event fires once before the entire print job. Answer D is incorrect because the EndPrint event fires once after the entire job is done.
264 Chapter 11
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 3
You want to display a list of installed printers on a user’s computer. Which of the
following classes would you use to accomplish this?
❍ A. PrintController
❍ B. PrinterSettings
❍ C. PrinterResolution
❍ D. StandardPrintController
Answer B is correct. The PrinterSettings class is used to get information
about how a document is printed, including the printer that prints the document. The InstalledPrinters static method of this class retrieves the list of
all the installed printers. Answers A, C, and D are incorrect because they
provide no mechanism of determining the list of installed printers on a
machine.
Question 4
You need to configure printed output based on data you will acquire from a single SQL query, but based on business rules, you need to group the data into
separate pages. In which event should you place the SQL call?
❍ A. BeginPrint
❍ B. QueryPageSettings
❍ C. PrintPage
❍ D. EndPrint
Answer A is correct. You should use the BeginPrint event to perform preloading tasks that will be used for the entire print job. Answers B and C are
incorrect because the QueryPageSettings and PrintPage events fire once for
each page and would generate multiple hits against your SQL server, increasing the network and system load. Answer D is incorrect because the
EndPrint event fires only after all pages have been printed.
265
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Printing
. . . .
Question 5
You want to make sure that a report is always generated in Portrait mode. Which
of the following fulfills this requirement?
❍ A. Set the Bounds property of the PageSettings class to true.
❍ B. Set the Portrait property of the PageSettings class to true.
❍ C. Set the Landscape property of the PageSettings class to false.
❍ D. Set the Orientation property of the PageSettings class to Landscape.
Answer C is correct. By setting the Landscape property of the PageSettings
class to false, the output is forced to Portrait mode. Answer A is incorrect
because the Bounds property defines the available space based on the paper
orientation rather than the orientation itself. Answers B and D are incorrect
because they do not specify valid properties of the PageSettings class.
Question 6
Users report that their printouts are not properly formatted because of the mix
of fonts used. Which of the following options should you choose to ensure
proper formatting of the reports? You decide to calculate the page spacing
required for each font using the GetHeight method. Will this allow you to properly determine the number of lines that can fit on a page?
❍ A. Use the Font.GetHeight method.
❍ B. Use the PrintPageEventArgs.MarginBounds property.
❍ C. Use the PrintDocument.PrinterSetting property.
❍ D. Write an event handler for the PrintDocument.QueryPageSettings
event.
Answer A is correct. By summing by-line values calculated using the
GetHeight method to measure font size, it is possible to determine whether
a new page is required or whether the line of text will fit in the remaining
space. Answers B, C, and D are incorrect because they apply either to a page
as a whole or to the printer, but they do not provide any resolution to the
problem caused by using different fonts.
266 Chapter 11
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 7
You need to create an event log entry for each print job that details the number
of pages in a print job, along with a code that indicates whether any errors
occurred during page formatting for any of the pages. Where should you place
the code for this requirement?
❍ A. BeginPrint
❍ B. QueryPageSettings
❍ C. PrintPage
❍ D. EndPrint
Answer D is correct. An event log entry that includes details spanning an
entire print job should be generated within the EndPrint event, which fires
after the job is completed. You must add code necessary to handle any errors,
setting some type of flag to allow later specification of the error condition in
the event log entry. Answer A is incorrect because the BeginPrint event fires
before any pages have been printed. Answers B and C are incorrect because
the QueryPageSettings and PrintPage events fire once for every page that is
generated and would result in multiple event log entries.
Question 8
You want to allow your users to check the way the printed output will look before
they waste paper printing lengthy reports. They need to be able to vary the zoom
for close detail inspection of graphic images. Which elements can be used to
support this requirement? (Select all that apply.)
❑ A. PageSetupDialog
❑ B. PrintPreviewDialog
❑ C. PrintPreviewControl
❑ D. PrintDialog
Answers B and C are correct. Both the PrintPreviewDialog and
PrintPreviewControl elements can be used to support print preview,
although the PrintPreviewControl element requires additional code to manage the need for a variable zoom. Answer A is incorrect because the
PageSetupDialog component is used to control page settings. Answer D is
incorrect because the PrintDialog component is used to control printer settings.
267
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Printing
. . . .
Question 9
You need to print a document in which each page has different print settings.
Which of the following event handlers should you use to ensure that the correct
print settings are applied?
❍ A. BeginPrint
❍ B. EndPrint
❍ C. PrintPage
❍ D. QueryPageSettings
Answer D is correct. To print each page of a document using different page
settings, you handle the QueryPageSettings event of the PrintDocument
class. Answers A and B are incorrect because these events apply to the print
operation as a whole, not to individual pages. Answer C is incorrect because
you need to find the print settings before the PrintPage event is fired.
Question 10
You have been tasked with saving paper when executing the many lengthy print
jobs that are routinely generated. Which property of the PrinterSettings class
should you use to directly support this requirement, assuming that the printer
supports all properties?
❍ A. CanDuplex
❍ B. Collate
❍ C. Copies
❍ D. Duplex
Answer D is correct. The Duplex property can be used to force printouts on
both sides of each page, reducing the number of pages by half. Answer A is
incorrect because the CanDuplex property returns a value based on whether
the printer supports duplex printing. Answer B is incorrect because collating
the output simply involves the manner in which the resulting pages are
ordered. Answer C is incorrect because there is no requirement that the
number of copies of each report should be modified, so this is not the best
answer of those provided.
268 Chapter 11
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Need to Know More?
Charles Petzold. Programming Microsoft Windows with C#. Microsoft
Press, 2001.
Windows Forms Community Site: www.windowsforms.net.
Printing with Windows Forms: http://samples.gotdotnet.com/
quickstart/winforms/doc/WinFormsPrinting.aspx.
12
Testing and Debugging
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terms you’ll need to understand:
✓ Testing
✓ Bottom-up testing
✓ Top-down testing
✓ Trace class
✓ Debug class
✓ TraceListener class
✓ TraceSwitch class
✓ Tracing
✓ Debugging
✓ Step-by-step execution
✓ Breakpoint
Techniques you’ll need to master:
✓ Know different kinds of testing: unit, integration, and regression
✓ Know how to implement tracing in Windows applications
using the Trace and Debug classes of System.Diagnostics
namespace
✓ Know how to implement trace switches and conditional compilation for your application
✓ Know how to perform step-by-step debugging using the
debugging features provided by Visual Studio .NET
270 Chapter 12
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Before an application is deployed to users, it is critical to test the application
for errors or unexpected behaviors. This chapter examines the methods used
to plan a thorough testing of your application, as well as the classes provided by the .NET Framework for use in testing and debugging an application
during its runtime.
Application Testing
Application testing must be performed to ensure that an application is capable of functioning properly, even if presented with invalid or conflicting data.
In addition, it is important to do a simple measure of base functionality within the expected operational environment. Automated alpha-phase testing can
be done using code-based agents based on classes within the
System.Diagnostics namespace of the .NET Framework. Test users often
perform additional human-interaction testing during the beta-testing phase.
Remember that testing can prove only that specific bugs exist. Testing cannot prove
that an application is entirely free of errors—it can determine only that no known bugs
remain.
Testing may be performed during different stages of application development, such as when a module is developed, and when several modules are
integrated together to create a system. Testing is also crucial after performing a correction or update, to ensure that the changes have not introduced
new errors or caused unexpected results.
Stubs are often used during unit-level testing of individual modules and classes. A
stub is a replacement code segment that automatically returns the correct response
when called by the module being tested, avoiding extensive processing and data
access overhead generated by calling the actual code (assuming that the code even
exists). When multiple developers are working on separate portions of an application, stubs might be mandated during the independent development of various portions of the application.
When planning for a test, it is important to determine which software segment or functionality will be tested, what approach will be used during testing, what constitutes a pass or failure within the testing boundaries, and who
the responsible individuals will be during testing. Reporting and documentation of testing, including both successful and failed results, are an important part of the complete documentation for your application.
271
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Testing
. . . . and
. . Debugging
. . . . . .
Testing should include a measure of three key elements of operation:
➤ Correctness—When given a known set of valid data, the application
should produce the expected result. This element tests whether an application is functioning correctly.
➤ Reliability—When provided valid data repeatedly, the application should
produce the expected result for each iteration. This element tests
whether an application can function in repeated use, ensuring that values
are not held over from one iteration to the next.
➤ Robustness—When provided with invalid data, the application should be
capable of preventing invalid input or raising an error during improper
operation. This element ensures that the application can cope with
invalid data.
The following sections discuss three forms of testing: unit testing, integration testing, and regression testing.
Unit Testing
Unit testing involves testing a single code module or class. This level of testing ensures that each module can perform properly alone, allowing testing to
be conducted before other code segments have been created. This approach
also limits the scope of testing to a smaller segment of code and makes it possible to test modules of very resource-intensive applications without heavily
loading the development server.
Integration Testing
Integration testing ensures that all modules work with one another within an
application. Integration testing is performed in several ways, including these:
➤ Bottom-up—This approach begins at the unit level and progresses to
increasingly more complex levels of integration. Bottom-up testing is
more useful when the development team is well-experienced with the
technology; the product specifications are well-defined and only limited
risk is involved.
➤ Top-down—This approach involves testing the full functionality of the
application, using stubs for modules still under development. Focused
testing can then be performed on smaller subsystems and code modules
to eliminate any identified errors. Top-down testing is more useful when
the development team is inexperienced with the technology; product
specifications are not well-defined and high risks are involved.
272 Chapter 12
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ Umbrella—This approach involves testing of the user-interface element
of the application, such as reports, screen, and so on, prior to testing the
program components. This approach is more useful when your application involves extensive user interaction.
Regression Testing
Regression testing is performed each time a change is made to the application, to ensure that the modification has not introduced new errors into an
application and to ensure that the change provides the desired result.
When testing international applications, make sure that you are using either Unicode
or the proper code page for each language, and that you test the application using a
set of localization settings.
Tracing
Tracing refers to instrumenting your application by writing debugging statements in your code. These debugging statements are not removed from your
application when it is deployed to production servers; instead, the debugging
statement remains functional allowing you to trace unexpected paths of execution in your program. The .NET Framework includes two classes for tracing within the System.Diagnostics namespace: Trace and Debug. These
classes derive from the same abstract class and share the same Listeners collection, differing only in the symbol set used for each. These classes are used
to diagnose conditions within an application while it is running.
When you compile an application in the default (Debug) configuration, both
the DEBUG and TRACE symbol sets are included. When compiling
an application in Release mode, only the TRACE symbol is included.
Table 12.1 details some of the most useful members of the Trace and Debug
classes.
Table 12.1 Important Members of the Trace and Debug Classes
Member
Type
Description
Assert
Method
Displays a message if the specified condition is not met
AutoFlush
Property
Returns true if the Flush method should be called on listener
objects after each write
Close
Method
Flushes the output buffer and closes the listener objects
(continued)
273
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Testing
. . . . and
. . Debugging
. . . . . .
Table 12.1 Important Members of the Trace and Debug Classes (continued)
Member
Type
Description
Fail
Method
Returns an error message
Flush
Method
Flushes the output buffer’s data to the listener objects
Indent
Method
Increments the current IndentLevel by one
IndentLevel
Property
Gives the current indent level
IndentSize
Property
Gives the number of spaces used in an indent
Listeners
Property
Specifies the collection of objects monitoring trace output,
shared by both Trace and Debug
Unindent
Method
Decrements the current IndentLevel by one
Write
Method
Writes the specified data to the listeners
WriteIf
Method
Writes the specified data to the listeners if the specified condition is true
WriteLine
Method
Is identical to the Write method, but adds a newline
character
WriteLineIf
Method
Is identical to the WriteIf method, but adds a newline
character
Trace Listeners
Trace listeners are classes derived from the TraceListener class that handle
the reporting of data provided by the Trace and Debug classes. One or more
listener objects can be placed within the Listeners collection shared by the
Trace and Debug classes. Several types of listener objects are available within the .NET Framework, including these:
➤ DefaultTraceListener class—This is the default listener object automatical-
ly added to the Listeners collection. Objects of this class send their output to the Output window.
➤ TextWriterTraceListener class—This listener class can be used to output
messages to any object deriving from the Stream class, including external files and the console.
➤ EventLogTraceListener class—This listener class is used to output mes-
sages to the Windows Event Log.
You can define custom listeners by inheriting from the TraceListener base class and
overriding its methods with your customized methods. When you do so, at a minimum, you must implement the Write and WriteLine methods. Additionally, you can
implement the Fail, Close, and Flush methods.
274 Chapter 12
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Trace Switches
When your application is deployed, you might want to include the capability to turn application tracing off and on when necessary. This can be accomplished by including a TraceSwitch object or a BooleanSwitch object. These
classes derive from the Switch class and can be adjusted by including an
XML element to set the proper value for the switch object within an application’s XML configuration file.
The BooleanSwitch value is used for a simple trace-on/trace-off selection,
where any nonzero value represents a trace-on condition. If you want greater
control over tracing, you can use the TraceSwitch class to adjust the level of
tracing based on the enumerated values of the TraceLevel class, as detailed
in Table 12.2.
Table 12.2 The TraceLevel Enumeration
Value
Integer
Type of Trace Messaging
Off
0
None
Error
1
Adds error messages
Warning
2
Adds warning and error messages
Info
3
Adds informational, warning, and error messages
Verbose
4
Adds verbose, informational, warning, and error messages
Table 12.3 details some of the most important properties of the TraceSwitch
class.
Table 12.3 Important Properties of the TraceSwitch Class
Property
Description
Description
Description of the switch object.
DisplayName
The name of the switch class instance. This is used in the XML config
file to identify the object.
Level
The level of tracing, using one of the enumerated TraceLevel values
detailed previously.
TraceError
Returns true if Level is set to 1, 2, 3, or 4 (Error, Warning, Info, or
Verbose).
TraceInfo
Returns true if Level is set to 3 or 4 (Info or Verbose).
TraceVerbose
Returns true if Level is set to 4 (Verbose).
TraceWarning
Returns true if Level is set to 2, 3, or 4 (Warning, Info, or Verbose).
275
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Testing
. . . . and
. . Debugging
. . . . . .
Conditional Compilation
During compilation, you might want to vary the elements that are compiled
using one of the preprocessing directives. These directives enable you to skip
or replace segments of code during compilation, report warnings, or mark
regions of the code. These directives are evaluated before compilation of the
underlying application code. Table 12.4 details the preprocessing directives
available in Visual C# .NET.
Table 12.4 Visual C# .NET Preprocessing Directives
Directives
Description
#if, #else, #elif, and #endif
Used to evaluate a condition and then vary which code
elements are compiled based on that evaluation.
#define and #undef
Used to define or undefine symbols in the code.
#warning and #error
Used to explicitly generate error or warning messages.
#line
Used to alter the line numbers and source file
filenames reported by the compiler in warning and
error messages.
#region and #endregion
Used to mark sections of code that can be easily
expanded or collapsed to make code easier to read
within the Visual Studio .NET Integrated Development
Environment (IDE).
You can also mark methods to enable them to be conditionally compiled if a
symbol (DEBUG, TRACE, or a custom symbol) is specified in their
Conditional attribute. Only void methods (that do not return any value) can
make use of the Conditional attribute. The following method includes a
Conditional attribute that defines the DEBUG symbol:
[Conditional(“DEBUG”)]
public void InitDebugMode()
{
lblDebug.Text = “Debug Mode”;
lblDebug.Visible = true;
}
If the application is compiled in Debug mode (where the DEBUG symbol is
defined), the Label control displays the message “Debug Mode” when the
InitDebugMode method is invoked.
276 Chapter 12
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Debugging
When compiling code in the default Debug mode, the compiler includes several options that can assist during the process of debugging an application,
including stepping through the code, using code breakpoints, doing conditional debugging when an exception is thrown, performing process monitoring, and analyzing program state using the .NET debugging tools.
The .NET Framework supports transparent debugging of applications that use multiple languages. If some modules of your application are written in Visual C# .NET while
others are written in Visual Basic .NET, the debugger can step between languages
transparently.
Stepping Through Code During Execution
One method used in debugging an application is the step-by-step execution
of its code within the debugger. If the application terminates unexpectedly,
you will have a good idea of where the code caused problems in the application. You might also check for variable values and other ongoing changes the
code is making during its execution so that you can determine the effect of
each step.
Visual Studio .NET provides three options for step-by-step execution of an
application. These modes are selectable using keyboard shortcuts, as detailed
in Table 12.5.
Table 12.5 Options for Step-by-Step Application Execution
Debug Menu
Keyboard Shortcut
Function
Step Into
F11
This option allows step-by-step execution of
program code. If a method is called, the
debugger enters the code of the method and
steps through each line one at a time as well.
Step Over
F10
This option also allows step-by-step execution
of program code. If a method is called, it is
executed completely in one step and then the
step-by-step process continues on the next
line after the method call.
Step Out
Shift+F11
This option is used inside a method call to
execute the rest of the method without stepping. You resume step execution mode when
control returns to the calling method.
277
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Testing
. . . . and
. . Debugging
. . . . . .
Using Breakpoints
A breakpoint causes code execution to pause when encountered. If you place
a breakpoint in your code, the application will pause when it reaches the
breakpoint, enabling you to do the following:
➤ Examine the current program state of the application
➤ Enter step-by-step mode
➤ Allow program execution to continue
Within the Visual Studio .NET IDE, you can add a breakpoint by rightclicking the beginning of a line of code and selecting New Breakpoint from
the options provided. The New Breakpoint dialog box includes options to
create a breakpoint within a file, function, and address within the code, or
when a specific condition is met.
The New Breakpoint dialog box contains Condition and Hit Count buttons
that enable you to create conditional breakpoints. The Breakpoint Condition
dialog box allows you to break the program execution based on the runtime
value of an expression. The Breakpoint Hit Count dialog box enables you to
break the program execution only if the specified breakpoint has been hit a
given number of times. These dialog boxes can be especially helpful if you
have a breakpoint and want to step execute the program during specific circumstances.
You can right-click an existing breakpoint to remove or disable the breakpoint’s operation. Removing a breakpoint also removes any information that
you have associated with the breakpoint using the Breakpoints window.
Disabling a breakpoint simply causes the debugger to ignore a breakpoint
and continue normally. You can open the Breakpoints window (shown in
Figure 12.1) by selecting Debug, Windows, Breakpoints from the header.
Figure 12.1 The Breakpoints window showing a breakpoint set on the 32nd line of code within the
Calculator application.
278 Chapter 12
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Debugging When an Exception Is Thrown
It is possible to configure the debugger to respond when a particular exception is thrown, using the Exceptions dialog box shown in Figure 12.2. Here,
you can configure the debugger to continue or to break execution when an
exception is thrown or when an unhandled exception occurs, alerting you to
the presence of an unhandled exception within your code.
Figure 12.2 The Exceptions dialog box, which enables the developer to decide whether to break into
the debugger when the exception is thrown or when it is not handled.
Debugging a Running Process
Visual Studio .NET also allows you to debug processes that are running outside the Visual Studio .NET debugging environment. You can access external processes from Visual Studio .NET by running both on a local or remote
computer through the Processes dialog box (by selecting Tools, Debug
Processes), as shown in Figure 12.3.
By selecting the target system and the running process within the Processes
dialog box and clicking the Attach button, you can attach the process to the
Visual Studio .NET Debugger.
Note that, to debug a running process on the remote machine, you should
ensure that the remote system is running the Machine Debug Manager
(mdm.exe) service. This service can be installed using Visual Studio .NET or
through the Remote Components Setup. Mdm.exe provides remote debugging support. You should also ensure that you are a member of the Debugger
Users group on the remote computer.
279
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Testing
. . . . and
. . Debugging
. . . . . .
Figure 12.3 The Processes dialog box allows you to attach a debugger to a process that is under
execution.
The local computer and the remote computer must be members of a trusted domain
to perform remote debugging.
If you want to debug a DLL file rather than an EXE file under execution,
you must create a simple application that invokes the DLL and then attach
the debugger to the executing application’s process.
Analyzing Program State
During the debugging process, you will want to be able to evaluate many
conditions and values that changed while the program was under execution.
The Visual Studio .NET development environment provides several debugging windows that display valuable information on the state of the program
(which can be selected using the Debug, Windows menu option):
➤ Autos window—This window includes information on the variables with-
in the current and previous statements.
➤ Call Stack window—This window displays the path through which pro-
gram execution reached the current point within the code.
➤ Immediate window—This window can be used to invoke real-time evalua-
tion of variables and functions within the Command window.
➤ Locals window—This window shows variables that have their scope local
to the current method being executed.
280 Chapter 12
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ This window—This window shows all of the members associated with the
current object.
➤ Watch window—Each Watch window can be used to monitor the value of
a particular variable or an expression.
281
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Testing
. . . . and
. . Debugging
. . . . . .
Practice Questions
Question 1
You are developing an application using Visual Studio .NET on a team of 15
developers. Your team has performed extensive testing of the application and
eliminated all known errors. You have also configured your application to break
on any unhandled exceptions. Which of the following statements correctly
defines the state of your application?
❍ A. The application is bug free.
❍ B. The application has no known errors and is very reliable.
❍ C. The application has no known errors and is very robust.
❍ D. The application has no known errors and will stop on an unhandled
exception.
Answer D is correct. You have ensured that all known errors have been corrected. Answer A is incorrect because you cannot prove through testing that
there are no other errors: Your testing process might not have encompassed
all possible types of error that a user can create. Answers B and C are not the
most correct answers in this case. If your application repeatedly functions as
expected, it might be considered to have fulfilled the reliability requirement
for testing, and its capability to handle invalid data or incorrect actions would
define its robustness. Because you do not know anything about the specific
testing methods used, you cannot be certain of the reliability or robustness
of the application.
Question 2
Which of the following options defines the TRACE symbol?
❍ A. Default Release configuration.
❍ B. Default Debug configuration.
❍ C. Default Release configuration and the Default Debug configuration.
❍ D. Neither the default Release configuration nor the default Debug configuration.
Answers C is correct. The TRACE symbol is defined in both the default
Debug and default Release configurations. Answer A and B are incorrect
because they both are incomplete answers. Answer D is simply incorrect.
282 Chapter 12
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 3
You have the following segment of code in your program:
EventLogTraceListener traceListener =
new EventLogTraceListener(“TraceLog”);
Trace.Listeners.Add(traceListener);
Trace.WriteLine(“Sample Message”);
Debug.WriteLine(“Sample Message”);
When you debug the program through Visual Studio .NET, how many times
would the message “Sample Message” be written to the trace log?
❍ A. 1
❍ B. 2
❍ C. 3
❍ D. 4
Answer B is correct. When you add a listener object to the Trace.Listeners
collection, you also add a listener object to the Debug.Listeners collection
because Trace and Debug classes share their Listeners collection. Since the
message is written twice and one listener object is attached to the Listeners
collection, the message will be written twice.
Question 4
You want to control the tracing and debug output of a Windows application
without needing to recompile your code. Which of the following classes would
enable you to do this? (Select all that apply.)
❑ A. Debug
❑ B. Trace
❑ C. TraceListener
❑ D. TraceSwitch
❑ E. BooleanSwitch
Answers D and E are correct. TraceSwitch and BooleanSwitch classes can be
used to control the tracing and debugging output without needing to recompile the code. You can store the level of tracing required in XML application
configuration files, which can later be edited to reflect new tracing requirements without needing to recompile code. Answers A and B are incorrect
because Trace and Debug classes are used to write tracing output. Answer C
283
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Testing
. . . . and
. . Debugging
. . . . . .
is incorrect because the TraceListener object is used to listen to the messages
generated by the Trace and Debug classes.
Question 5
Which member of the Trace and Debug classes displays message when a specified condition is not met?
❍ A. Assert
❍ B. Write
❍ C. Fail
❍ D. WriteIf
Answer A is correct. The Assert method displays the message, if the specified
condition is not met. Answer B is incorrect because the Write method is used
to display the message without checking for any condition. Answer C is
incorrect because the Fail method is used to display the error message without checking for any condition. Answer D is incorrect because the WriteIf
method displays the message, if the specified condition is met.
Question 6
Which object type should be used to write an output message to a flat file?
❍ A. DefaultTraceListener class
❍ B. TextWriterTraceListener class
❍ C. EventLogTraceListener class
❍ D. TraceSwitch class
❍ E. BooleanSwitch class
Answers B is correct. The TextWriterTraceListener class is used to output
messages to objects deriving from the Stream class, including external flat
files. Answer A is incorrect because the DefaultTraceListener class is used to
write messages to the Output window. The EventLogTraceListener class is
used to write output to the Windows Event Log, making answer C incorrect
as well. Answer D and E are incorrect because TraceSwitch and
BooleanSwitch classes are used to control the level of tracing to be enabled;
they do not listen to the messages generated by the Trace and Debug
classes.
284 Chapter 12
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 7
If you selected a trace level of 3, which types of trace messages will be
returned? (Select all that apply.)
❑ A. Error
❑ B. Informational
❑ C. Verbose
❑ D. Warning
Answers A, B, and D are correct. Trace level 3 (Info) returns informational,
warning, and error messages. To return verbose messages, the trace level
must be set to level 4 (Verbose), making answer C incorrect here.
Question 8
Which property of the TraceSwitch class will return a true value if the trace level
is set to 1? (Select the best answer.)
❍ A. TraceError property
❍ B. TraceInfo property
❍ C. TraceVerbose property
❍ D. TraceWarning property
Answer A is correct. The TraceError property returns true if the Level property is anything other than 0. Answers B and C are incorrect because the
TraceInfo property returns true only if the trace level is 3 or 4; the
TraceVerbose property returns a true value for a level of 4 only. The
TraceWarning property returns a true value only when the Level property is
greater than 1, making answer D incorrect as well.
285
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Testing
. . . . and
. . Debugging
. . . . . .
Question 9
You are trying to debug a Windows application running on a remote machine
using Visual Studio .NET installed on your local machine. The local machine and
remote machine have a two-way trust relationship between their domains. When
you attempt to debug the application, you get a DCOM configuration error.
Which one of the following steps should you take to resolve this problem?
❍ A. Add your account to the Powered Users group on the local computer.
❍ B. Add your account to the Powered Users group on the remote
computer.
❍ C. Add your account to the Debugger Users group on the local computer.
❍ D. Add your account to the Debugger Users group on the remote
computer.
Answer D is correct. You should be a member of the Debugger Users group
on the remote computer in order to remotely debug a process running on
that computer. Answers A and C are incorrect because being a member of
any group in the local computer does not provide any privileges to debug a
process on a remote computer. Answer B is not correct because you should
be a member of the Debugger Users group rather than the Powered Users
group.
Question 10
Which of the following windows provides the easiest display of the variables
used in the previous and current statement?
❍ A. Autos
❍ B. Call Stack
❍ C. Immediate
❍ D. Locals
❍ E. Watch
Answer A is correct. The Autos window provides an automated display of the
variables in the current and previous statements. Answer B is incorrect
because the Call Stack window is used to display the path of execution used
to get to the current location in the application’s execution. Answer C is
incorrect because the Immediate window requires you to specify variables
and expressions at every stage of execution to monitor their values. Answer
D is incorrect because the Locals window shows all the variables that are
local to the current execution context. Answer E is incorrect because the
Watch window requires you to specify the variables and expressions in order
to evaluate them.
286 Chapter 12
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Need to Know More?
Kalani, Amit. MCAD/MCSD Training Guide: Developing and
Implementing Windows-Based Applications with Microsoft Visual C#
.NET and Microsoft Visual Studio .NET, Exam 70-316. Que
Certification, 2003.
Richard Grimes. Developing Applications with Visual Studio .NET.
Addison-Wesley, 2002.
Production Debugging for .NET Framework Applications:
http://msdn.microsoft.com/library/en-us/dnbda/html/DBGrm.asp.
Visual Studio .NET, Debugging .NET Applications, and More:
http://msdn.microsoft.com/msdnmag/issues/02/04/Basics.
The .NET Show: Debugging with Visual Studio .NET:
http://msdn.microsoft.com/theshow/Episode022.
13
Deploying a Windows
Application
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terms you’ll need to understand:
✓ XCOPY
✓ Cabinet (.cab) files
✓ Merge Module
✓ Bootstrapper
✓ Custom actions
✓ Delay signing
✓ Authenticode signature
✓ URL remoting
✓ Logo programs
Techniques you’ll need to master:
✓ Experiment with using setup projects and merge module projects to deploy Windows-based applications. Understand when
you should choose to create a setup project versus a merge
module project.
✓ Work with the different editors that are available in setup and
merge module projects, and thoroughly understand the purpose of each of these editors.
✓ Understand how digital signing is used when creating a strong
name for an assembly.
✓ Experiment with placing assemblies in the Global Assembly
Cache.
288 Chapter 13
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
After creating and testing your application, you must provide the completed
product to its users. This chapter focuses on the process involved in deploying simple and complex applications using XCOPY, the Windows Installer,
and zero-touch Web-based deployment methods. We also briefly examine
the use of shared assemblies and the application requirements for certification in the Microsoft Windows Logo program.
Deployment Tools
The Visual Studio .NET development platform has the new Setup and
Deployment projects category, which includes useful templates for creating
installation packages for many types of applications. These packages are
based on the Microsoft Windows Installer technology, which handles many
of the setup and configuration details automatically. When you decide to
deploy a package, its complexity and installation requirements will determine
the best tool for deployment.
You might be able to deploy a simple .NET application that uses managed
code and private assemblies by using nothing more than the XCOPY utility
to duplicate the application’s files to the desired destination. This type of
installation is insufficient when an application involves key management,
user registration, feature selection, relative path selection, the Global
Assembly Cache (GAC) manipulation, or the creation of shortcuts, databases, or a branded interface.
To support more complex installation requirements, you can use the
Windows Installer technology. Installer packages (.msi) can create shortcuts,
set Registry entries, add Start menu items, execute custom scripts, and allow
by-feature and on-demand installations. In addition, the Windows Installer
provides the capability to roll back an installation process, uninstall an application, and repair a component or an application.
Visual Studio .NET ships with version 2.0 of the Installer, which is compatible with
Windows NT 4 (Service Pack 6), Windows ME, Windows 2000, and Windows XP,
Windows 2003 Server. Microsoft provides a downloadable earlier version that can be
used on Windows NT 4.0, Windows 95, and Windows 98.
Deploying Your Application
Visual Studio .NET includes templates and setup wizards for several forms
of application deployment, including these:
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Deploying
. . . . . .a .Windows
. . . . . Application
. . . . . .
➤ Cab Projects—Used to package ActiveX components into redistributable
cabinet (.cab) files for Internet download
➤ Merge Module Projects—Used to create redistributable packages, includ-
ing shared components and assemblies
➤ Setup Projects—Used to create installation packages for Windows appli-
cations to be installed on client computer systems
➤ Web Setup Projects—Used to create installation packages for Web applica-
tions to be installed on a Web server
Visual Studio .NET also has a Setup Wizard that helps you interactively create these deployment projects. This chapter mainly discusses the Setup
Project, which is used to deploy Windows-based applications.
Setup Projects
After you have created an application and compiled it using the Release
option, you can wrap your application into a setup project using Visual
Studio .NET. You might want to include additional files, such as a license
agreement or a ReadMe file, to provide installation instructions or information on the purpose and use of the application. When all of these files have
been created, you can create a new Setup project by following these steps:
1. Open a Visual Studio .NET and open the Windows application for
which you want to create a setup project.
2. Add a project to the solution, select Setup and Deployment projects
from the Project Types tree, and then select Setup Wizard from the list
of templates on the right. Enter a name and location for the project,
and then click OK.
3. The Setup Wizard appears. The first page of the wizard is the welcome
screen. Click Next.
4. The second page of the wizard is the Choose a Project Type screen.
Choose Create a Setup for a Windows Application from the first group
of options to create a setup project for Windows applications, as shown
in Figure 13.1. Click Next.
5. The third page of the wizard is the Choose Project Outputs to Include
screen. Select Primary Output from the Windows application (in this
example, the name of the application is MyProject), as shown in Figure
13.2. Click Next.
289
290 Chapter 13
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Figure 13.1 The Choose a Project Type screen in the Setup Wizard prompts the user to select the
project type.
Figure 13.2 The Choose Project Outputs to Include screen in the Setup Wizard prompts the user to
select the project output that will be deployed by the installer.
6. The fourth page of the wizard is the Choose Files to Include screen.
You can use this screen to include any additional files in the setup project. Click Next.
7. The final page of the wizard is the Project Summary screen. Click
Finish to create the project.
8. Select the project in the Solution Explorer and provide meaningful
information for Manufacturer, ProductName, Title, and other information as desired using the Properties window for the project.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Deploying
. . . . . .a .Windows
. . . . . Application
. . . . . .
9. Build the setup project to create the setup package. When you are
done, open Windows Explorer and navigate to the Release folder inside
the project folder. You will find the Setup.exe file, along with the
installer package (.msi), initialization files (.ini), and any additional executables (.exe) needed.
On a machine with the .NET Framework installed, you can install your new
application by double-clicking the Setup.exe file. This enables you to specify the destination location during installation.If you later want to uninstall
this application, you can do so through Start, Control Panel, Add/Remove
Programs; simply select the application from the list of installed packages
and select Remove. Easy removability or reinstallation to replace damaged
component files is one of the many benefits of using the Windows Installer
to deploy your package.
Deployment of your application requires the .NET Framework, which you can install
from a source such as the Windows Update site. If you want to include a bootstrapper program that will automatically install the .NET Framework if it is not already present, you can download a sample from http://msdn.microsoft.com/downloads/
sample.asp?url=/msdn-files/027/001/830/msdncompositedoc.xml. Include the
bootstrap information within your initialization (.ini) file to direct the setup file to the
.NET Framework setup files.
Before deployment, you can modify the configuration settings for your package using the Property Pages dialog box for your project within the Solution
Explorer, as shown in Figure 13.3.
Figure 13.3 The configuration settings page for a setup project.
291
292 Chapter 13
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Five primary configuration properties are presented here:
➤ Output filename—Used to specify the name of the generated installer
(.msi) package.
➤ Package files—Used to specify whether the files should be packaged as
loose, uncompressed files, within the setup file or as one or more cabinet
(.cab) files. If multiple cabinet files are allowed, you can specify the maximum size for each, to reduce the size of each file that must be downloaded by a user installing the package.
➤ Bootstrapper—Used to specify whether the installation package should
include the capability to install the Windows Installer utility on the
client system if it is not already present, to allow installation of your
application.
➤ Compression—Used to specify whether your files should be compressed
for either size or speed of installation.
➤ Authenticode signature—Used to specify the file containing an
Authenticode digital signature and private key file that will be used during installation.
Customizing Setup Projects
You can also customize your setup project using the Visual Studio .NET IDE
editors. Visual Studio .NET provides different types of editors to customize
various aspects of the installation process:
➤ File System Editor—Used to specify the file system configuration that will
be used during installation. Within this editor, placeholders such as the
user’s Startup folder are provided to reflect a mapping to the appropriate
location for the user performing the installation. Some of the available
special folders include the Application folder, the Common Files folder,
the Program Files folder, the user’s desktop, and the System folder. This
editor can be used to configure shortcuts to your application that automatically are installed along with the application.
➤ Registry Editor—Used to specify Registry keys, subkeys, and values that
will be added to the Registry of the user’s system during installation.
➤ File Types Editor—Used to specify file type associations, allowing your
application to automatically open a file if its type (based on the file
extension) matches the associated value.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Deploying
. . . . . .a .Windows
. . . . . Application
. . . . . .
➤ User Interface Editor—Used to customize the installation interface to
include dialog boxes within the start, progress, and end stages of installation. This editor can be used to include rich-text (.rtf) files such as your
license agreement and readme files mentioned earlier, so the installation
will continue only after the user acknowledges reading the details provided.
➤ Custom Actions Editor—Used to allow the specification of compiled .dll
or .exe files to be executed during the install, commit, rollback, or uninstall phases of installation. These might be used to configure a database
for your application or any other type of executable action that is not
directly a part of the installation itself. If a custom action fails, the entire
installation is rolled back, leaving the target machine to its original state.
➤ Launch Conditions Editor—Used to set conditions that must be met
before an installation can begin, such as whether the .NET Framework
is already installed or whether a particular Registry key is present. If the
condition is not met, installation terminates.
You can view editors by right-clicking the project in the Solution Explorer
and then selecting View and the desired editor.
The Condition property is present on Editor elements such as folders, files, Registry
keys, custom actions, and launch conditions. The Condition property consists of a
valid conditional statement in the form of a string that evaluates to either true or
false. If this property does not evaluates to true, the action is not enacted.
Shared Assemblies
Chapter 4, “Components and .NET Assemblies,” covered the creation of
assemblies, noting that a shared assembly is stored in the Global Assembly
Cache (GAC) so that it can be shared by several applications. Because the
GAC allows multiple versions of the same assembly to be present at once,
the assembly must be designated using a strong name; this includes the
assembly’s text name (the name of the file without its extension), the version
number (major, minor, build, and revision), culture information (neutral or
localized), and a unique digital signature. The following sections discuss how
to digitally sign an assembly and how to add shared assemblies to the GAC.
293
294 Chapter 13
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Signing the Assembly
The digital signature is created using a public key encryption process that
involves first creating a public key/private key pair using the Strong Name
utility (sn.exe), calculating a hash of the assembly, and then encrypting the
hash using the private key. The encrypted hash value and the public key are
accessed within the assembly’s manifest by the CLR and are used to verify
that the assembly remains uncorrupted and unique.
When signing multifile assemblies, you need to sign only the assembly manifest
because it contains hash values for the included files. When the signed manifest is
verified as unchanged, it is easy to then evaluate the included files to ensure that
they are also correct.
Immediate Signing
You can create a public key/private key pair using the Strong Name command-line utility provided within the .NET Framework Software
Development Kit (SDK) using this format:
sn –k MyKeys.snk
You should then add this file to your component project and use the
AssemblyVersion and AssemblyKeyFile attributes in the AssemblyInfo.cs file
to specify the version number and keyfile (.snk) to be used when signing this
assembly. The settings will look something like this:
[assembly: AssemblyVersion(“1.0.*.*”)]
[assembly: AssemblyKeyFile(@”<Path to Keyfile>\MyKeys.snk”)]
When you rebuild the component, its digital signature is created to provide
a unique strong name. Using asterisks (*) for the build and revision number
allows the compiler to update those values automatically each time you
rebuild the component.
Delay Signing
It is also possible to sign an assembly using only its public key so that it can
later be uniquely signed using a more secure private key. This eliminates the
need to provide both public and private keys to all developers.
You can extract just the public key from your keyfile using this line:
sn.exe –p MyKeys.snk MyPubKey.snk
When using this file to sign your assembly, you must specify the use of a
delay sign, as shown here:
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Deploying
. . . . . .a .Windows
. . . . . Application
. . . . . .
[assembly: AssemblyVersion(“1.0.*.*”)]
[assembly: AssemblyDelaySign(true)]
[assembly: AssemblyKeyFile(@”<Path to Keyfile>\MyPubKey.snk”)]
After development has been completed, you can re-sign the final component
using the following private key:
sn.exe –R MyComponent.dll MyKeys.snk
Authenticode Signing
An assembly signed with a strong name does not automatically assert a company’s identity, such as its name. For that purpose, you can use an
Authenticode signature, in which case the company’s identity is asserted by a
third-party certification authority (such as Verisign or Thawte). You can use
the File Signing tool (signcode.exe) to attach an Authenticode signature to
the assembly.
An important thing to know is the order of commands when signing an
assembly using both sn.exe and signcode.exe. You must sign your assembly
with the Strong Name tool (sn.exe) before you sign it with the File Signing
tool (signcode.exe).
Adding an Assembly to the GAC
When you have associated a strong name with your new assembly, you can
add it to the GAC in several ways:
➤ Windows Installer—You can create a Merge Module (.msm) project with-
in Visual Studio .NET, which then is added to your Setup project for
the application that will consume the shared assembly. The Windows
Installer then adds the shared assembly to the installation host’s GAC
during installation.
➤ Windows Explorer—During installation of the .NET Framework, the
Assembly Cache Viewer Shell Extension (shfusion.dll) is installed. This
component allows the addition of new assemblies into the GAC by
simply navigating to the assembly cache (%systemroot%\WINNT\
assembly or %systemroot%\Windows\assembly) and then dragging
and dropping the component (.dll) file into this folder.
➤ Microsoft .NET Framework Configuration tool—You can use the Add an
Assembly option within the .NET Framework Configuration tool to add
your component to the GAC. This utility is found in the Administrative
Tools section of the Windows Control Panel.
295
296 Chapter 13
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ Global Assembly Cache Tool (GacUtil.exe)—This command-line utility can
be used to add or remove an assembly from the GAC. The utility
accepts switches to install (/i), list (/l), or uninstall (/u) assemblies within
the GAC.
Creating and Deploying the
Installation Components
Many of your components will make use of additional resources, such as performance counters, event logs, or databases. When you deploy your application, it is important that these additional resources are included in the final
installation component. This is accomplished by including an instance of the
Installer class in your setup project.
The Installer class derives from the System.Configuration.Install.Installer
class and includes the following methods:
➤ Commit method—Use this method to write the code that needs to be exe-
cuted after successful installation.
➤ Install method—Use this method to write the code that needs to be exe-
cuted during the application’s installation.
➤ Rollback method—Use this method to write the code that needs to be exe-
cuted when the Install method fails to complete. This method is used to
undo any changes enacted by the Install method before its failure.
➤ Uninstall method—Use this method to write the code that needs to be
executed when an installed application is selected for uninstallation using
the Add/Remove Programs Wizard.
When you choose Add Installer within the properties of a class, a new
instance of the ProjectInstaller class is added to your project. This object
maintains a collection of Installer objects required for the instance to install
the component within its Installers property. You can also create a custom
class that inherits from the base Installer class to implement your own code
and overload the methods of the base class.
Within the Setup project, you can use the Custom Actions Editor to add the
primary output from the Installer component. This action adds the necessary
installation code to the Installer methods of the project. When you install
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Deploying
. . . . . .a .Windows
. . . . . Application
. . . . . .
this component, the necessary setup configuration is enacted on the installation host, provided that you added the following to your class before compilation:
[RunInstaller(true)]
You can also use the Installer tool (InstallUtil.exe) command-line utility to
install an assembly that includes additional component resources, as shown
here:
InstallUtil.exe MyComponent.dll
InstallUtil.exe MyComponent.dll AnotherComponent.dll
This utility can also be used to uninstall a component as well, as shown here:
InstallUtil.exe /u MyComponent.dll
If you are installing components from multiple assemblies by using the installutil.exe
command and any assembly fails to install, installutil.exe rolls back the installations
of all other assemblies. However, the process of uninstallation is not transactional.
URL Remoting
The .NET Framework includes a zero-touch deployment model that allows
the installation of an application simply by navigating to the proper URL for
the application’s executable (.exe) file within Internet Explorer. The Web
server does not need to have the .NET Framework for this to function—in
fact, it does not even need to be a Microsoft Web server. The local system’s
.NET Framework handles the installation and execution of the application
using a zone-based security model. Downloaded assemblies are maintained
in a download cache, which is unique for each user and for each download
location from which the user has remoted an application.
The security model used is based on the zone from which the application is
executed, which can be one of the following:
➤ My_Computer_Zone—This zone includes local file and URL paths on the
same system. By default, this zone has the FullTrust permission.
➤ LocalIntranet_Zone—This zone includes URLs accessing systems located
on the same network. By default, this zone has the LocalIntranet permission.
➤ Internet_Zone—This zone includes all addresses outside the local net-
work. By default, this zone has its permissions set to None if the .NET
Framework Service Pack 1 (SP-1) has been installed; otherwise, it has
the Internet permission.
297
298 Chapter 13
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ Trusted Sites Zone—This zone includes Web sites that you trust to not
damage your computer or data. By default, this zone has the lowest
security permission, and most of the code originating from this zone will
be capable of executing.
➤ Restricted Sites Zone—This zone includes Web sites that could potentially
damage your computer or data. By default, this zone has the highest
security permission and disallows the code originating from this zone to
execute.
You can modify the security zone settings using the Microsoft .NET
Framework Configuration tool located in the Administrative Tools section of
the Windows Control Panel. In the Microsoft .NET Framework
Configuration tool, select the Runtime Security Policy, Machine, Code
Groups, All_Code, My_Computer_Zone nodes to modify or view the security settings at the machine level. You can also adjust the runtime security
policy for a particular assembly within the Runtime Security Policy folder.
When you configure the Runtime Security settings for an assembly, you have
the option to configure access for only the logged-in user or for all users on
the machine.
Remember that if you relax the security for a zone, such as providing FullTrust to the
Internet_Zone, you might allow undesired components to run on your system.
Deployment Considerations
Many different methods exist for deployment of your application, including
these:
➤ Removable media—This deployment form makes use of removable stor-
age such as floppy disks, CD-ROMs, ZIP disks, or even small solid-state
storage devices. This is suitable when a user does not have an Internet
connection, when the deployable application is so large that file transfers
would not be reasonable, or when the tightest security is required for
data contained within the application. By configuring the Setup project
to use cabinet (.cab) files, you can specify a maximum size for each to
allow the application to fit within the capacity of the media type used.
The Setup.exe and Installer package (.msi) should be placed on the first
disk in a series.
➤ Network download—This deployment makes use of file shares to allow
remote users to access and download an application, generally from a
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Deploying
. . . . . .a .Windows
. . . . . Application
. . . . . .
read-only file share with access security limited by group membership.
In this scenario, you can configure the Setup project to create a single
setup file for the application, to simplify download for your users.
➤ Administrative installation—This deployment method involves installing
the Windows Installer package to a network file share using the
MSIEXEC command with the /a switch (example: MSIEXEC /a
MyApp.msi). Users with access to this image within their workgroup can
then install and run the application, accessing source files over the network.
➤ Web-based distribution—It is possible to use the Web to distribute an
application’s setup files. This method does not require a reproduction
and distribution method, as with removable media. In this deployment
method, you can allow the Setup project to generate the Installer package and multiple cabinet files so that the application can download its
files as needed during installation.
Windows Logo Program
Requirements
To reflect the degree to which a new application conforms to the guidelines
for Windows development, Microsoft makes available several forms of logo
certification. Products branded with a logo must meet at least the basic
requirements of each program to be certified. Users thus know to what
degree the application is considered compatible with their operating system.
Currently, you should be aware of three types of logo programs:
➤ Certified for Windows—This logo program ensures that an application
meets the technical requirements for the Application Specifications for
Windows 2000, detailed at www.microsoft.com/windowsserver2003/
partners/isvscfw.mspx. This site also includes prerelease guidelines for
Windows Server 2003 program requirements.
➤ Designed for Microsoft Windows XP—This logo program ensures that an
application meets the technical requirements for Designed for Microsoft
Windows XP Application Specifications, detailed at
www.microsoft.com/winlogo.
➤ .NET Connected—This logo program ensures that applications conform
to varying levels of application specifications within the .NET and XML
Web Service Application Specifications. Details of this program can be
found at www.microsoft.com/net/logo.
299
300 Chapter 13
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Practice Questions
Question 1
If you want to package a shared assembly for distribution, which of the following templates would be best for this requirement?
❍ A. Cab project
❍ B. Merge Module project
❍ C. Setup project
❍ D. Web Setup project
Answer B is correct. A Merge Module project is used to create a redistributable package that includes shared components or assemblies. Answers A
and D are incorrect because Cab and Web Setup projects are used to package ActiveX controls and Web applications for deployment to a Web server.
Answer C is incorrect because Setup projects are used to create Windows
Installer packages for application distribution.
Question 2
After building a Setup project, which files will be present in the Release folder
of the setup project? (Select all that apply.)
❑ A. .exe
❑ B. .ini
❑ C. .msi
❑ D. .txt
Answers A, B, and C are correct. The Setup project produces the installer
package (.msi), initialization files (.ini), and any additional executable files
(.exe) needed. Text (.txt) files are not produced directly by this process, making answer D incorrect.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Deploying
. . . . . .a .Windows
. . . . . Application
. . . . . .
Question 3
When deploying an application packaged as an .msi file to a user accessing the
package through a network file share, what components must be loaded first?
(Select all that apply.)
❑ A. .NET Framework on the server
❑ B. .NET Framework on the workstation
❑ C. Windows Installer on the server
❑ D. Windows Installer on the workstation
Answers B and D are correct. Both the .NET Framework and Windows
Installer components must be installed on the user’s workstation before
installing an installer package (.msi). Because all installation processing is
performed on the workstation, neither component is specifically required on
the server, making answers A and C incorrect.
Question 4
Which Setup project configuration option would be used to specify the creation
of .cab files no larger than 1.4MB to fit your application on multiple floppy
disks?
❍ A. Bootstrapper
❍ B. Compression
❍ C. Package files
❍ D. Output filename
Answer C is correct. The package files option allows specification of the type
of file to be generated, including the capability to specify the maximum size
for generated cabinet (.cab) files. The Bootstrapper option is used to specify
whether the distributable application should carry a copy of the Windows
Installer package with it for installation first if the destination system lacks
the utility, making answer A incorrect. Answer B is incorrect because the
Compression option is used to specify whether the installer package should
be compressed to make the file smaller or to speed up its installation. The
Output filename is used to specify the name for the generated installer package, making answer D incorrect as well.
301
302 Chapter 13
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 5
Which editor should be used to enable the automatic creation of a shortcut icon
for your application during the installation in the user’s desktop?
❍ A. Custom Actions Editor
❍ B. Launch Conditions Editor
❍ C. File Types Editor
❍ D. File System Editor
❍ E. User Interface Editor
Answer D is correct. The File System Editor allows you to specify shortcuts
and icons mapped to user-relative paths such as the user’s desktop. Answer A
is incorrect because the Custom Actions Editor is used to configure additional installation actions to be taken that are not directly a part of the installation itself. The Launch Conditions Editor is used to specify conditions that
must be met before installation can occur, making answer B incorrect.
Answer C is incorrect because the File Types Editor is used for file type association between the application and files of the type it should handle. The
User Interface Editor is used to configure dialog boxes that will be presented to the user during the installation process, making answer E incorrect.
Question 6
You want to execute custom code when the installation of a component is successful. Which of the following methods of the Installer should you choose to
write your custom code?
❍ A. Install
❍ B. Rollback
❍ C. Commit
❍ D. Uninstall
Answers C is correct. The Commit method executes when the installation is
successful. Answer A is not correct because the Install method executes when
the installation is performed; the installation might or might not be successful. Answer B is not correct because the Rollback method is executed when
the installation fails. Answer D is not correct because the Uninstall method
executes to remove an installation.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Deploying
. . . . . .a .Windows
. . . . . Application
. . . . . .
Question 7
A strong name must include which of the following elements? (Select all that
apply.)
❑ A. Authenticode signature
❑ B. Culture
❑ C. Digital signature
❑ D. Version
❑ E. Text name
Answers C, D, and E are correct. An assembly’s strong name must include a
text name, a version number, culture information (if specified), and a unique
digital signature created from the hashed value of the application. Answer A
is not correct because an Authenticode signature can be added to allow thirdparty verification of an assembly’s source, but it is not required for its strong
name. Answer B is not correct because although culture information may be
included, it is not necessary.
Question 8
When using delay signing, which key(s) are used to sign the assembly initially?
❍ A. Public key
❍ B. Private key
❍ C. Both keys
❍ D. Hashed key
Answer A is correct. In delay signing, the public key is used to sign the
assembly during development. The private key is used later to sign the
assembly for deployment, making answers B and C incorrect. Answer D is
incorrect because the hashed value is used along with the signing key to create the final digital signature.
303
304 Chapter 13
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 9
Which methods can be used to register a shared assembly within the GAC?
(Select all that apply.)
❑ A. Global Assembly Cache tool
❑ B. Internet Explorer
❑ C. Microsoft .NET Framework Configuration tool
❑ D. Windows Explorer
❑ E. Windows Installer
Answers A, C, D, and E are correct. An assembly can be registered in the
Global Assembly Cache through the Global Assembly Cache tool
(GacUtil.exe), the Microsoft .NET Framework Configuration tool,
Windows Explorer, and Windows Installer. Answer B is incorrect because
Internet Explorer cannot register a shared assembly in the GAC.
Question 10
Which zone should you edit to allow the execution of an assembly identified by
a URL within the same subnet as the client?
❍ A. My_Computer_Zone
❍ B. My_Network_Zone
❍ C. LocalIntranet_Zone
❍ D. Internet_Zone
Answer C is correct. The LocalIntranet_Zone is used for URLs within the
same network. Answer A is incorrect because My_Computer_Zone is used
only for paths local to the user’s system. There is no My_Network_Zone,
making answer B incorrect. Internet_Zone is used for URLs outside the local
network, making answer D incorrect.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Deploying
. . . . . .a .Windows
. . . . . Application
. . . . . .
Need to Know More?
Jeffery Ritcher. Applied Microsoft .NET Framework Programming.
Microsoft Press, 2002.
Microsoft Developer Network: http://msdn.microsoft.com.
Microsoft Windows Update Site: http://windowsupdate.
microsoft.com.
Certified for Microsoft Windows logo program Web site:
msdn.microsoft.com/certification.
Designed for Microsoft Windows XP logo program Web site:
www.microsoft.com/winlogo.
Microsoft .NET Connected logo Web site: www.microsoft.com/
net/logo.
305
14
Maintaining and
Supporting a Windows
Application
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terms you’ll need to understand:
✓ Process class
✓ EventLog class
✓ PerformanceCounter class
✓ Start method
✓ CloseMainWindow method
✓ Kill method
✓ CreateEventSource method
✓ WriteEntry method
✓ Sampling
✓ Publishing
Techniques you’ll need to master:
✓ Understand the use of the Start, Kill, and CloseMainWindow
methods to start and stop processes.
✓ Know how to use event logs within your applications.
✓ Understand the purpose and use of performance counters.
308 Chapter 14
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
After you have created your Visual C# .NET application and deployed it to
your users, you will need to monitor its operation and make adjustments to
improve performance. In this chapter, we examine some of the methods that
can be used to fulfill this requirement, including the management of
Windows processes and event logs, and the monitoring of performance data
for running processes. Using these tools, you also can allow an application to
alter its behavior based on available system resources within a dynamic setting.
Introduction
Within the .NET environment, the Systems.Diagnostics namespace
includes many classes that can be used to manage or monitor a Windows
application, including the following:
➤ Process class—This class provides information about processes running on
a system, local or remote, and also grants control over starting and stopping processes on the local system.
➤ EventLog class—This class provides the capability to read from or write
to a Windows event log.
➤ PerformanceCounter class—This class provides access to performance data
about running processes, as well as the publication of performance data
over a network.
The Process Class
When an application is executed, it creates a process. Each process consumes
memory and other system resources, and is uniquely identified by a process
identifier (PID). The System.Diagnostics namespace includes a Process
class. The methods of the Process class can be used to start and stop running
processes, and its properties can be used to obtain information about running
processes.
Starting and Stopping Processes
The Start method of the Process class can be used to start an instance of the
target process, using startup information specified in the StartInfo property
to allow runtime configuration of the application’s environment. The
Process class also includes two methods that can be used to terminate a running process: CloseMainWindow and Kill.
309
. . . . . . . . . . . . . . . . . . . . .Maintaining
. . . . . . and
. . .Supporting
. . . . . .a .Windows
. . . . . Application
. . . . . .
The Process class can be used only to start and stop processes on the local system.
However, it is possible to access process information on both local and remote systems using this class.
CloseMainWindow is equivalent to clicking the Close icon of an application,
and it can be used only with applications that have a user interface and that
participate in the Windows message loop. The Kill method must be used for
applications that lack a user interface or that do not participate in the
Windows message loop, such as MS-DOS–based executables. The Kill
method terminates an application immediately without saving data or performing resource cleanup.
Table 14.1 details several members of the Process class that are useful for
starting or stopping processes.
Table 14.1 Members of the Process Class Useful for Starting or Stopping Processes
Member
Type
Description
CloseMainWindow
Method
Closes a process with a user interface by sending
a close message to its main window
EnableRaisingEvents
Property
Specifies whether an Exited event is raised when
the process terminates
ExitCode
Property
Is an exit value specified by a process on termination
Exited
Event
Fires on process termination
ExitTime
Property
Gives the time when the process ended
GetProcessById
Method
Is a Process object representing a running
process with the specified PID
GetProcesses
Method
Returns an array of Process objects in which each
element represents a running process
GetProcessesByName
Method
Returns an array of Process objects in which each
element represents a running process with the
specified name
HasExited
Property
Indicates whether a process has been terminated
Id
Property
Gives the PID of a process
Kill
Method
Immediately terminates a running process
StartInfo
Property
Specifies the properties to pass to the Start
method
(continued)
310 Chapter 14
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 14.1 Members of the Process Class Useful for Starting or Stopping Processes
(continued)
Member
Type
Description
WaitForExit
Method
Specifies the period to wait for process termination, blocking the current thread of execution
until the time has expired or the process has
terminated
WaitForInputIdle
Method
Causes a Process object to wait for the system to
enter an idle state
You can create a sample form that can start and stop instances of a calculator
application by performing the following:
1. Open an instance of Visual Studio .NET and create a new Visual C#
.NET Windows application.
2. Place two GroupBox controls, three Button controls
(btnLaunchCalculator, btnCloseRecentCalculator, and
btnCloseAllCalculators), and two Label controls on your form. Name
one of the Label controls lblLiveCalculators and set its Text property
to 0. Figure 14.1 shows the design for the form.
Figure 14.1 Design of a form that uses the Process class to start and stop processes.
3. Switch to the form’s Code view and add the following statement at the
top of the form’s class definition:
using System.Diagnostics;
4. Add the following code to your form:
ArrayList arrCalculators = new ArrayList();
private void Calculator_Exited(object sender, System.EventArgs e)
{
311
. . . . . . . . . . . . . . . . . . . . .Maintaining
. . . . . . and
. . .Supporting
. . . . . .a .Windows
. . . . . Application
. . . . . .
Process p = (Process) sender;
arrCalculators.RemoveAt(arrCalculators.IndexOf(p.Id));
lblLiveCalculators.Text =
(Int32.Parse(lblLiveCalculators.Text) - 1).ToString();
}
private void btnLaunchCalculator_Click(
object sender, System.EventArgs e)
{
Process prcCalculator = new Process();
prcCalculator.StartInfo.FileName = “calc.exe “;
prcCalculator.EnableRaisingEvents = true;
prcCalculator.Exited += new EventHandler(Calculator_Exited);
prcCalculator.Start();
prcCalculator.WaitForInputIdle();
arrCalculators.Add(prcCalculator.Id);
lblLiveCalculators.Text =
(Int32.Parse(lblLiveCalculators.Text) + 1).ToString();
}
private void btnCloseRecentCalculator_Click(
object sender, System.EventArgs e)
{
if(arrCalculators.Count > 0)
{
int intId = (int) arrCalculators[arrCalculators.Count - 1];
try
{
Process p = Process.GetProcessById(intId);
p.CloseMainWindow();
}
catch(Exception ex)
{
Trace.WriteLine(ex.Message);
}
}
}
private void btnCloseAllCalculators_Click(
object sender, System.EventArgs e)
{
Process[] arrCalculators = Process.GetProcessesByName(“calc”);
foreach(Process prcCalculator in arrCalculators)
{
prcCalculator.CloseMainWindow();
}
}
5. Insert the Main method, set the form as the startup object, and run
your project. When you click the Launch button, a new instance of the
Calculator process is launched. Clicking the Close Most Recent button
terminates the most recent instance of the Calculator process started
by this application. The Close All Calculators button stops all running
instances of the Calculator process.
312 Chapter 14
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
You can also use the Process component from the toolbox instead of creating a
Process object in the code. You can configure the Process component’s StartInfo
property to include the filename of the target process and its startup parameters.
Getting Process Information
Process information can be programmatically accessed using the properties
of an instance of the Process class created for a process running on a local or
remote system. Table 14.2 details some of the useful properties exposed by
this class.
Table 14.2 Useful Properties of the Process Class
Property
Description
MachineName
Gives the name of the machine on which the process is running
MainModule
Gives the main module of the process
MainWindowTitle
Is the caption in the main window of a process
Modules
Are modules loaded by the associated process
PriorityClass
Gives the priority class for the process
ProcessName
Gives the name of the process
ProcessorAffinity
Specifies the processors on which the threads in this process
can be scheduled to run
Responding
Indicates whether the user interface is responding
StandardError
Provides access to a StreamReader object, allowing you to read
error output
StandardInput
Provides access to a StreamWriter object, allowing you to write
input to the process
StandardOutput
Provides access to a StreamReader object, allowing you to read
output from the process
StartTime
Gives the process start time
Threads
Are threads running in the associated process
TotalProcessorTime
Gives the total processor time used by a process
UserProcessorTime
Gives the total user processor time used by a process
VirtualMemorySize
Gives the size of virtual memory used by a process
WorkingSet
Gives the physical memory used by a process
313
. . . . . . . . . . . . . . . . . . . . .Maintaining
. . . . . . and
. . .Supporting
. . . . . .a .Windows
. . . . . Application
. . . . . .
Windows Event Logs
Events logs provide a standard location where events and other messages can
be recorded and later reviewed using applications such as the Event Viewer.
The .NET Framework Class Library also includes several classes that can be
used to create event logs, read from or write events to the logs, and delete
event logs.
Three default event logs (the Application, Security, and System logs) cannot be deleted. (The security log is read-only and cannot be written to directly.) Additional
resources or applications also can create their own event logs, such as the Domain
Name System (DNS) and the Active Directory. It is important to be cautious while
using the Delete method on any of these logs: Deleting a log also removes all event
sources registered with the deleted event log.
Table 14.3 details some useful members of the EventLog class within the
System.Diagnostics namespace.
Table 14.3 Useful Members of the EventLog Class
Member
Type
Description
CreateEventSource
Method
Opens an event source for an application
Delete
Method
Removes a log resource
DeleteEventSource
Method
Removes an application’s event source from
a log
EnableRaisingEvents
Property
Specifies whether the EventLog object is
notified on the EntryWritten event
Entries
Property
Gives the contents of a log
EntryWritten
Event
Fires when an entry is written to an event
log on the local computer
Exists
Method
Indicates whether the specified log exists
GetEventLogs
Method
Returns an array of all event logs on the
local or the specified computer
Log
Property
Gives the name of the log to read from or
write to
LogDisplayName
Property
Gives an event log’s user-friendly name
LogNameFromSourceName
Method
Shows the name of the log to which a specified source is registered
MachineName
Property
Shows the name of the computer on which
to read or write events
(continued)
314 Chapter 14
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 14.3 Useful Members of the EventLog Class (continued)
Member
Type
Description
Source
Property
Specifies the event source to register and
use when writing to the event log
SourceExists
Method
Determines whether a given event source
exists
WriteEntry
Method
Writes an entry to the log
Each application must register an event source before it can interact with an
event log. Registration of the source is stored in the Registry. The
CreateEventSource method can be used to register the application with an
event log, creating the log if it does not yet exist.
Accessing Event Logs
The WriteEntry method of the EventLog class is used to write messages into
the event log specified by the event source. If the event source has not
already been created using the CreateEventSource method, it is created
automatically by the WriteEntry method. The type of event written is determined by its EventLogEntryType enumerated value (Error, FailureAudit,
Information, SuccessAudit, or Warning).
The following code shows you how to create a new event log and write an
entry to it:
EventLog el = new EventLog();
el.Log = “MyCustomLog”;
el.Source = “MyCustomLogSource”;
el.WriteEntry(“Created new event log”, EventLogEntryType.Information);
You can then view the newly created event log in the Event Viewer, as shown
in Figure 14.2.
To access the contents of an event log, you use the Entries property of the
EventLog object to return an EventLogEntryCollection object. The elements of this object are the individual event log entries. It is possible to view
events on the local system, as well as those from remote systems.
Although you can read event logs on remote systems, the EntryWritten event can be
used to fire only when event log entries are written on the local system.
315
. . . . . . . . . . . . . . . . . . . . .Maintaining
. . . . . . and
. . .Supporting
. . . . . .a .Windows
. . . . . Application
. . . . . .
Figure 14.2 You can use the Event Viewer to view the contents of the event logs.
Monitoring Performance
Microsoft Windows includes several hundred performance counters, each
monitoring a particular service parameter. Other applications, such as
Exchange and SQL Server, also provide a wide variety of performance counters that can be used to obtain current operational parameters. Microsoft
Windows organizes performance counters into categories, such as Memory,
Processor, or PhysicalDisk, while categories can be further divided into
instances. Each instance of the Process class, for example, has its own associated performance counters.
Reading Performance Data
The PerformanceCounter class is provided to allow your .NET applications
to read performance data from processes running on a local or remote system and to publish their own performance counters. Table 14.4 details some
important members of the PerformanceCounter class.
Table 14.4 Some Important Members of the PerformanceCounter Class
Member
Type
Description
CategoryName
Property
Gives the performance counter category name
Close
Method
Closes the performance counter and releases its
resources
CounterHelp
Property
Describes the performance counter
CounterName
Property
Gives the performance counter name
CounterType
Property
Gives the performance counter type
Decrement
Method
Decrements the performance counter value by 1
Increment
Method
Increments the performance counter value by 1
(continued)
316 Chapter 14
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 14.4 Some Important Members of the PerformanceCounter Class (continued)
Member
Type
Description
IncrementBy
Method
Increments or decrements the performance counter
value by the specified amount
InstanceName
Property
Gives the instance name
MachineName
Property
Gives the computer name
NextSample
Method
Returns the raw, uncalculated value newly sampled for
a performance counter
NextValue
Method
Returns the calculated value newly sampled from a performance counter
RawValue
Property
Returns a sampled raw value from a performance
counter
ReadOnly
Property
Indicates whether a PerformanceCounter is in read-only
mode
RemoveInstance
Method
Removes an instance from a PerformanceCounter
object
Sampling is the process of reading the value of a performance counter. You
can sample existing performance counters on local and remote systems. You
can view sampled performance data using the Performance Monitor (perfmon.exe) utility and also within your .NET application. A listing of available
performance counters can be easily accessed within the Server Explorer of
Visual Studio .NET, where you can drag and drop the desired counter into
your application (see Figure 14.3).
Figure 14.3 Selection of the Available Bytes performance counter within the Server Explorer.
Publishing Performance Data
The .NET Framework enables you to create your own custom performance
counters, which you then can access from other applications in addition to
using the Performance Monitor utility. You can use the Create method of the
PerformanceCounterCategory to programmatically add a new category, or
317
. . . . . . . . . . . . . . . . . . . . .Maintaining
. . . . . . and
. . .Supporting
. . . . . .a .Windows
. . . . . Application
. . . . . .
you can right-click the Performance Counters node of the Server Explorer
and select Create New Category from the options provided.
When you create a new performance counter, it must be placed within a new category. It is not possible to place a custom counter within an existing category, although
it is possible to add multiple new performance counters within the newly created category.
318 Chapter 14
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Practice Questions
Question 1
Which of the following are valid message type values that can be written in the
event log? (Select all that apply.)
❑ A. Error
❑ B. FailureAudit
❑ C. Information
❑ D. Kill
❑ E. Warning
Answers A, B, C, and E are correct. The type of an event log message must
be one of the EventLogEntryType enumerated values: Error, FailureAudit,
Information, SuccessAudit, and Warning. Answer D is incorrect because the
Kill method of the Process class is not a member of the EventLogEntryType
enumeration.
Question 2
You want to determine whether a given event log exists on a machine. Which of
the following methods can you call to determine this?
❍ A. Exists
❍ B. SourceExists
❍ C. GetEventLogs
❍ D. LogNameFromSourceName
Answer A is correct. The Exists method determines whether a log exists on
a machine. Answer B is not correct because the SourceExists method determines whether a particular source exists. Answer C is not correct because the
GetEventLogs method creates an array of the event logs available on a local
or specified machine. Answer D is not correct because the
LogNameFromSourceName method determines the log name for a specified source.
319
. . . . . . . . . . . . . . . . . . . . .Maintaining
. . . . . . and
. . .Supporting
. . . . . .a .Windows
. . . . . Application
. . . . . .
Question 3
You have written an application that presents an opening standalone form that
can be used to select which external module to access. If no user input is provided after 15 minutes, you want to close the process. Which of the following
methods of the Process class would best fulfill this requirement?
❍ A. Close
❍ B. CloseMainWindow
❍ C. Dispose
❍ D. Kill
Answer B is correct. The CloseMainWindow method should be used to terminate a process with a user interface. Answers A and C are incorrect because
the Process class does not include the Close or Dispose methods. Answer D
is incorrect because the Kill method terminates a process without performing resource cleanup, so it would not be the best solution here.
Question 4
You have written an application that monitors an event log so that it can trigger
a regular low-priority data update process only when the primary application
process has completed. Although the primary process is writing to the event log
and your application is capable of reading events from the log, your program
fails to automatically trigger the desired event. What should you do within the
code to configure the EventLog object so that it can trigger your process?
❍ A. Set its Enabled property to true
❍ B. Set its Enabled property to false
❍ C. Set its EnableRaisingEvents property to true
❍ D. Set its EnableRaisingEvents property to false
Answer C is correct. You must set the EnableRaisingEvents property of an
EventLog object to true to allow it to raise events on the local system.
Answers A and B are incorrect because an Enabled property is not used for
this purpose. Answer D is incorrect because setting the EnableRaisingEvents
property to false prevents the handler from raising events.
320 Chapter 14
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 5
You develop a Windows forms application that needs to display the message
from a custom event log on the user’s computer. You choose the event log
object to accomplish this. Which of the following properties should you choose
for retrieving the event log messages?
❍ A. Log
❍ B. Entries
❍ C. Source
❍ D. LogDisplayName
Answer B is correct. You should use the Entries property to retrieve the contents of a specified log. Answer A is not correct because the Log property
gets the name of the event log instead of the entries. Answer C is not correct
because the Source property is the name registered with the event log as a
source of entries. Answer D is not correct because the LogDisplayName
property is used to obtain a friendly name of the specified event log.
Question 6
Which of the following statements are true regarding performance counters?
(Select all that apply.)
❑ A. Performance counters are grouped into performance counter categories.
❑ B. Each performance counter category has its own set of associated
values.
❑ C. Each performance counter instance has its own set of associated
values.
❑ D. Performance counter categories must include one or more performance counter instances.
❑ E. You can add performance counters only to an existing performance
counter category.
Answers A and C are correct. Performance counters are grouped into performance counter categories, and each performance counter instance has its
own set of published values. Answer B is incorrect because performance
counter values are published for each instance rather than for an entire performance category. Answer D is incorrect because a performance category
might contain zero instances, while Answer E is incorrect because you cannot add performance counters to existing categories. You must create a new
category, which can contain none, one, or many new performance counters.
321
. . . . . . . . . . . . . . . . . . . . .Maintaining
. . . . . . and
. . .Supporting
. . . . . .a .Windows
. . . . . Application
. . . . . .
Question 7
Which of the following default event logs can be written to on a local system?
(Select all that apply.)
❑ A. Application
❑ B. Event
❑ C. Security
❑ D. System
Answers A and D are correct. The Application and System default event logs
can be written to on a local system. Answer B is incorrect because there is no
default event log named Event; Answer C is incorrect because the security
event log is read-only.
Question 8
Your colleague is experimenting with the classes in the System.Diagnostics
namespace of the .NET Framework class libraries. She has requested that you
review her code. A part of the code that is designed to list events from an event
log is as follows (line numbers are for reference purposes only):
01:
02:
03:
04:
05:
06:
07:
EventLog log = new EventLog();
log.Log = “Security”;
//log.MachineName = “.”;
foreach(EventLogEntry entry in log.Entries)
{
MessageBox.Show(“Entry: “ + entry.Message);
}
Which of the following statements is true of the previous code segment?
❍ A. The code correctly displays all the events from the security event log
on the local computer.
❍ B. The code throws an exception because you cannot read from the security event log.
❍ C. Your colleague must uncomment Line 3 to read the events from the
local computer.
❍ D. Your colleague must use the Source property of the EventLog class to
specify the source of the event.
Answer A is correct. The code segment correctly displays the events from the
security event log on the local computer. Answer B is not correct because the
security event log is read-only. Answer C is not correct because if the
MachineName is not specified, the local machine is assumed. Answer D is
322 Chapter 14
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
not correct because it is necessary to specify the Source property only when
writing to an event log.
Question 9
You have written an application that includes several initialization procedures
that occur when the form is first loaded. Some users complain that the form
often generates an error because the initialization procedures are not completing before user access is allowed. You want to fire an event to enable user
access only after the initialization routine is completed. Which member of the
Process class should you monitor to meet this requirement?
❍ A. Exited
❍ B. ExitTime
❍ C. HasExited
❍ D. StartInfo
❍ E. WaitForExit
❍ F. WaitForInputIdle
Answer F is correct. The WaitForInputIdle method causes a Process object
to wait for an idle state, which occurs only after the initialization procedures
have been completed. Answers A, B, C, and E are incorrect because they
involve the termination of an application and would not be suitable for taking action when the process must continue running. Answer D is incorrect
because the StartInfo property is used to pass parameters and operating environment settings to the process during instantiation.
Question 10
You have created a custom performance counter that publishes a value representing how many records remain unprocessed. This value is decreased by 10
as each cycle processes a record batch, until it reaches 0. What method of the
PerformanceCounter class would best suit this requirement?
❍ A. Decrement
❍ B. DecrementBy
❍ C. Increment
❍ D. IncrementBy
❍ E. NextValue
323
. . . . . . . . . . . . . . . . . . . . .Maintaining
. . . . . . and
. . .Supporting
. . . . . .a .Windows
. . . . . Application
. . . . . .
Answer D is correct. The IncrementBy method is used to increment and
decrement a published performance counter by an arbitrary value. Answers
A and C are incorrect because the Decrement and Increment methods adjust
the published value only by 1. Answer B is incorrect because the
PerformanceCounter class does not have a separate DecrementBy method.
Answer E is incorrect because the NextValue method is used to return a
newly sampled value rather than to publish a value.
324 Chapter 14
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Need to Know More?
Kalani, Amit. MCAD/MCSD Training Guide: Developing and
Implementing Windows-Based Applications with Microsoft Visual C#
.NET and Microsoft Visual Studio .NET, Exam 70-316. Que
Certifications, 2003
Burton, Kevin. .NET Common Language Runtime Unleashed. Sams,
2002.
Performance tips and tricks in .NET applications: http://msdn.
microsoft.com/library/default.asp?url=/library/en-us/
dndotnet/html/dotnetperftips.asp.
15
Configuring a Windows
Application
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terms you’ll need to understand:
✓ Dynamic properties
✓ Code-access security
✓ Role-based security
✓ Permissions
✓ Code groups
✓ Permission sets
✓ WindowsIdentity object
✓ WindowsPrincipal object
✓ IsInRole method
✓ PrincipalPermission class
Techniques you’ll need to master:
✓ Understand how to use dynamic properties to manage runtime
configuration.
✓ Know how to use code groups to manage user permissions.
✓ Understand the use of the WindowsIdentity and
WindowsPrincipal objects.
326 Chapter 15
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Many values used within an application must allow for dynamic configuration. An example of this is the need for a data-aware application to provide a
mechanism for changing the target database source. Without this flexibility,
applications cannot adjust as changes are made to the distributed network
environment. The .NET platform allows for dynamic configuration changes
to be readily integrated into your application through the use of XML configuration files.
It is also important to plan for access control, restricting who may use your
application, and for limitations on available capabilities within your application. Role-based access control allows the application to alter its behavior
based on the permissions provided to the current logon account or to the
application itself.
This chapter focuses on dynamic configuration at runtime, code access security, and role-based security integration.
You will rarely need to configure detailed access control over Windows controls. The
.NET Framework uses a LicenseProvider object that can be configured by the control’s
developer. If the license requirements stored in this object are met, the control can be
added to your application. Everything else is automatically handled by the .NET
Framework.
Dynamic Application Configuration
Applications might require dynamic runtime configuration to allow contact
with a service provider, such as an e-mail or database server, determination
of available system and network resources, or changes to the user environment to meet with deployment requirements or user preference. The .NET
Framework includes support for dynamic properties that can be configured
at runtime without requiring a recompilation of the base application.
Using Dynamic Properties
Dynamic properties are managed at runtime by the System.
Configuration.AppSettingsReader class. The Visual Studio .NET IDE
enables you to define dynamic properties for your application.
You can use dynamic properties only within applications that create an executable
(.exe) file. Applications that create .dll files cannot use dynamic properties.
327
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuring
. . . . . . .a .Windows
. . . . . Application
. . . . . .
You configure a dynamic property for a form by performing the following
steps:
1. Open an instance of Visual Studio .NET and create a new Visual C#
.NET Windows application.
2. In the form’s properties window, click the plus (+) sign next to the
(DynamicProperties) entry.
3. Click in the (Advanced) section and click the ellipsis (…) button to
open the Dynamic Properties dialog box (see Figure 15.1). In the
Properties list, select the check boxes for the ShowInTaskbar and Text
properties.
Figure 15.1 The Dynamic Properties dialog box enables you to configure dynamic properties by
selecting the desired properties and their key mappings.
4. Select the properties that will be configured for dynamic runtime eval-
uation. Then click OK to close the dialog box.
After you save the form and run the application within the IDE, the app.config file is created and displayed in the Solution Explorer window. Editing this
XML file allows manipulation of the dynamic properties used each time the
application is run.
After you compile the application, the <appname>.exe.config file is created in
the application’s bin\Debug directory. This XML file can be edited to alter
the configuration settings used at runtime.
You can set any simple property (that is, any property whose value is not an instance
of a class or a structure) to be a dynamic property.
Some .NET components include dynamic properties already. If you drag
an Access database from the Server Explorer to a Windows Form, .NET
328 Chapter 15
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
automatically includes a dynamic property entry for the OleDbConnection
component. If you later remove a property from the dynamic properties list,
the key and last value for that property remain in the configuration file. It is
important to remember to remove any password or development-only values
from the file before deploying your application.
All of the dynamic properties on forms, controls, and components in a project use
the same configuration file, named <appname>.exe.config.
Application configuration files generally override settings in the machine
configuration file (machine.config), unless the machine configuration file
specifies that the application configuration file not be used.
Using the .NET Framework Configuration
Tool
When you load the .NET Framework on a server, the .NET Framework
Configuration tool is included (see Figure 15.2). You can locate this
Microsoft Management Console (MMC) utility by selecting Start,
Programs, Administrative Tools, Microsoft .NET Framework
Configuration.
Figure 15.2 The .NET Framework Configuration tool.
Using the .NET Framework Configuration tool, it is possible to do the following:
329
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuring
. . . . . . .a .Windows
. . . . . Application
. . . . . .
➤ Manage the contents of the Global Assembly Cache (GAC)
➤ Manage machine-wide configured assemblies, which map from one
assembly version to another, as shown in Figure 15.3
Figure 15.3 A configured assembly, mapping version 1.0.3300.0 to the new 2.0.0.0 version.
➤ Manage remoting channels, which allow communication with objects on
remote systems
➤ Manage security policy settings
➤ Manage application settings, which allow each application to have its
own remoting and configured assembly rules
The .NET Framework Configuration tool does not perform validation when specifying
a new configured assembly mapping. If you attempt to load a nonexistent assembly,
you will get a Just In Time (JIT) debugging error.
Configuring Security
The security model in .NET development breaks down into two primary
areas:
➤ Code access security—This manages the security of the code itself,
enabling the .NET Framework to verify permissions before allowing
code to run or ensuring that all necessary permissions are availble to
access required resources on the system before execution.
330 Chapter 15
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ Role-based security—This manages the logon account’s access rather than
the application code itself, allowing control of application access based
on user or group membership.
The .NET Framework also includes security features such as public-key and privatekey encryption, but these are not focus topics on the exam.
Code access security involves controlling access to resources. Within the
.NET Framework, this involves the following:
➤ Permissions
➤ Code groups
➤ Permission sets
Permissions
Permissions specify whether access to a resource is granted or denied. These
permissions can include the capability to read or write information into the
Windows Registry specified through the RegistryPermission setting.
Application code can request permissions in four ways:
➤ By requesting the minimum permissions required to run
➤ By requesting optional permissions desired but not required
➤ By refusing permissions to ensure that the code cannot access a particu-
lar set of resources
➤ By demanding permissions on behalf of calling code
The machine determines the maximum permissions possible, but application
code can be configured to request or receive lesser permissions than the maximum. The .NET Framework groups permissions into three types:
➤ Code access—These represent access to a protected resource or operation.
➤ Identity—These represent access based on credentials provided by the
code.
➤ Role-based—These represent access based on the logon account executing
the code.
331
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuring
. . . . . . .a .Windows
. . . . . Application
. . . . . .
Permissions within the .NET Framework are derived from the
System.Security.CodeAccessPermission class. Table 15.1 details some of the
more useful permissions derived from this class.
Table 15.1 Permissions in the .NET Framework
Permission
Type
Explanation
DirectoryServicesPermission
Code access
Controls access to the
System.DirectoryServices namespace.
DnsPermission
Code access
Controls access to Domain Name
System (DNS) services.
EnvironmentPermission
Code access
Controls access to environment
variables.
EventLogPermission
Code access
Controls access to the Windows
event log.
FileDialogPermission
Code access
Controls access to files selected
from the Open dialog box.
FileIOPermission
Code access
Controls access to reading and writing files and directories.
IsolatedStorageFilePermission
Code access
Controls access to private virtual file
systems.
IsolatedStoragePermission
Code access
Controls access to isolated storage.
MessageQueuePermission
Code access
Controls access to message queuing via Microsoft Message Queue
(MSMQ).
OleDbPermission
Code access
Controls access to data via the
System.Data.OleDb namespace.
PerformanceCounterPermission
Code access
Controls access to performance
counters.
PrintingPermission
Code access
Controls access to printers.
ReflectionPermission
Code access
Controls access to the .NET reflection features.
RegistryPermission
Code access
Controls access to the Windows
Registry.
SecurityPermission
Code access
Controls access to unmanaged
code.
ServiceControllerPermission
Code access
Controls access to starting and
stopping services.
SocketPermission
Code access
Controls access to Windows
sockets.
(continued)
332 Chapter 15
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table 15.1 Permissions in the .NET Framework (continued)
Permission
Type
Explanation
SqlClientPermission
Code access
Controls access to data via the
System.Data.SqlClient namespace.
UIPermission
Code access
Controls access to the user interface.
WebPermission
Code access
Controls access to making Web
connections.
PublisherIdentityPermission
Identity
Represents the identity of the publisher, as determined by the code’s
digital signature.
SiteIdentityPermission
Identity
Represents the identity of the Web
site from which the code originated.
StrongNameIdentityPermission
Identity
Represents the identity for the
strong name of the assembly.
URLIdentityPermission
Identity
Represents the identity of the uniform resource locator (URL) where
the code originated.
ZoneIdentityPermission
Identity
Represents the identity for the security zone where the code originated.
This is viewed on the Security tab of
Internet Explorer Options.
PrincipalPermission
Role-based
Represents the user’s credentials.
Allows checks against the active
principal.
If the available listing of permissions is inadequate for your needs, it is also
possible to create custom permissions by deriving from the
System.Security.CodeAccessPermission class.
Requesting Minimum Permissions
Application code should request the least permissions required to operate.
You can follow an example of this with these steps:
1. Open an instance of Visual Studio .NET and create a new Visual C#
.NET Windows application.
2. Place a Label control, a TextBox control (txtFileName), a Button con-
trol (btnGetFile), and an OpenFileDialog component (dlgOpen) on
your form.
333
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuring
. . . . . . .a .Windows
. . . . . Application
. . . . . .
3. Switch to Code view and add the following code before the class decla-
ration:
using System.Security.Permissions;
[assembly:FileDialogPermissionAttribute(
SecurityAction.RequestMinimum, Unrestricted=true)]
private void btnGetFile_Click(
object sender, System.EventArgs e)
{
try
{
if(dlgOpen.ShowDialog() == DialogResult.OK)
txtFileName.Text = dlgOpen.FileName;
}
catch (Exception ex)
{
MessageBox.Show(“Exception: “ + ex.Message);
}
}
4. After saving and compiling this project, you can launch the executable
and ensure that access of the FileDialogPermission is accomplished
through the FileDialogPermissionAttribute request.
In this example, the SecurityAction.RequestMinimum flag establishes that
you are determining whether the application code has been granted at least
the minimum necessary permissions to operate. The SecurityAction enumeration consists of four values that you should be familiar with:
➤ RequestMinimum—Determines whether the application code has at least
the minimum permissions needed to run.
➤ RequestOptional—Requests additional desired permissions that are not
strictly required to run the application. This requires a try-catch block
to handle the exception if a permission is not available.
➤ RequestRefuse—Limits the permissions granted to the application code,
to restrict the harm application code can cause.
➤ Demand—Requires all code that calls this application to have a particular
permission.
Code Groups
A code group is a set of assemblies that share a security context. Every
assembly in a code group shares the same permissions, but an assembly also
can belong to more than one code group at the same time. The .NET
Framework supports seven code-group membership conditions:
334 Chapter 15
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ Application directory—All code in the installation directory of the running
application.
➤ Cryptographic hash—All code matching a specific cryptographic hash,
creating a single-assembly code group.
➤ Software publisher—All code from a specific publisher, verified by
Authenticode digital signing. The Authenticode digital signing identifies
the publisher of the software and verifies that the software has not been
tampered with.
➤ Site—All code from a particular Internet domain.
➤ Strong name—All code with the specified assembly strong name.
➤ URL—All code from a specified URL.
➤ Zone—All code from a specified security zone (Internet, Local Intranet,
Trusted Sites, My Computer, or Untrusted Sites).
Permission Sets
It is not possible to assign permissions directly within the .NET Framework.
You must construct permission sets, which contain one or more permissions
that are assigned as a unit. The .NET Framework includes seven default permission sets:
➤ Nothing—Grants no permissions
➤ Execution—Grants permission to run but not to access protected
resources
➤ Internet—Grants limited permissions for code of unknown origin
➤ LocalIntranet—Grants high permissions for code within an enterprise
➤ Everything—Grants all permissions except the permission to skip
security checks
➤ SkipVerification—Grants the permission to skip security checks
➤ FullTrust—Grants all permissions over all resources
Granting Permissions
The easiest way to grant permissions is to use the .NET Framework
Configuration tool (shown in Figure 15.2). To configure a specific set of
335
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuring
. . . . . . .a .Windows
. . . . . Application
. . . . . .
permissions for the application created in the previous section of this chapter, follow these steps within this tool:
1. Expand the Runtime Security Policy node, then the User node, and
then the Permission Sets node. You should see the built-in .NET permission sets. Right-click the Everything permission set and select
Duplicate. A new permission set named Copy of Everything is created.
Rename the permission set No FileDialog.
2. Select the
No FileDialog permission and click the Change Permissions
link in the right panel of the .NET Framework Configuration tool. In
the Create Permission Set dialog box, select File Dialog and click
Remove. Click Finish to save your changes.
3. Expand the Code Groups node under the User node, and click the
default All Code code group. Click the Add a Child Code Group link in
the right panel of the configuration tool. This opens the Create Code
Group dialog box. Name the new group Chapter15. Enter a description
and click Next. Choose the Hash condition. Click the Import button
and browse to the application’s executable file created in the previous
example. Select the No FileDialog permission set, and click Next. Click
Finish to create the new code group. Right-click the newly created
code group, and select Properties to view the code group’s Properties
dialog box, as shown in Figure 15.4. Check the first check box to make
this code group exclusive.
Figure 15.4 Configuring a group named Chapter15.
4. Run the application’s executable file created in the previous example by
double-clicking it in Windows Explorer. A policy exception error box
appears, indicating that the code cannot be run.
336 Chapter 15
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
To evaluate the final permissions available to a piece of code, right-click the
Runtime Security node and select Evaluate Assembly from the options provided.
Requesting permissions through the use of attributes is known as declarative security. Imperative security involves creating objects to represent the permissions your
code requires. Imperative security is generally used only when security must be
configured based on runtime conditions.
Computing Final Permissions
Determination of the final permissions available to your code involves determining the permissions at each level (Enterprise, Machine, User, and
Application Domain) and then evaluating all of the permissions assigned at
each level within the hierarchical code group structure. The final set of permissions is the intersection of all of these evaluations. If there is no assignment of a particular permission at any point in the path discovered by the
Common Language Runtime (CLR) code walk through all layers and all
code groups, the permission is not available to your application.
Evaluation occurs at the Enterprise level first and then the Machine, User,
and the Application Domain levels. If the CLR encounters a code group with
the LevelFinal property, evaluation stops at that level. Code group evaluation is performed in order of the organized hierarchy set using the Microsoft
.NET Framework Configuration tool. If a code group is marked as an
Exclusive group, the CLR stops evaluating code group membership for a
piece of application code.
After determining the code group membership of an application, the CLR
calculates all of the permissions for each code group and takes the intersection of these for the final permissions granted by the code group. Then the
CLR determines all of the code groups that the code has membership in and
takes the union of these permission sets, to create the final set of permissions
granted to the code at a particular level. The final evaluation involves calculating the intersection of the permissions granted at each level, to yield the
final set of permissions for a code module. If your code has multiple modules, the ultimate set of permissions for the entire application will be the
intersection of the final permissions assigned to each module.
337
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuring
. . . . . . .a .Windows
. . . . . Application
. . . . . .
Configuring Authorization
Role-based security involves authentication and authorization.
Authentication involves verifying the identity of the requesting account, and
authorization refers to granting rights based on that identity.
In Windows applications, authentication is mainly based on the user’s
Windows login credentials. The user is authenticated as soon as he logs on
to Windows, and this identity then is used by .NET applications to implement security. The .NET Framework provides various other forms of
authentication, mainly used by ASP.NET applications. But you need to know
about them because they are specified in the exam objectives.
The following list summarizes the various forms of authentication provided
by the .NET Framework:
➤ None—No authentication is attempted, and access is granted to all
requests.
➤ Forms-based—Credentials are requested from the user via an HTML
form. The application sends back an identity key if acceptable.
➤ Windows—ASP.NET applications can use the built-in Windows authen-
tication available within IIS.
➤ Passport—Microsoft Passport provides a centralized authentication and
profile service for member sites.
➤ Custom—It is possible to develop a custom authentication scheme,
although this is not recommended due to potential security risks.
Identity and Principal Objects
Role-based authorization within the .NET Framework involves two interfaces: IIdentity and IPrincipal. Applications that use Windows accounts use
these interfaces through the WindowsIdentity and WindowsPrincipal
objects, although it is possible to create your own custom authorization
scheme using the IIdentity and IPrincipal classes directly.
The WindowsIdentity object represents the current user running the code
and includes information such as the username and authentication method.
The WindowsPrincipal object adds functionality to the WindowsIdentity
object, representing the entire security context of the user running the code,
including the roles to which the user belongs.
338 Chapter 15
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
You can obtain the WindowsIdentity of the current user through the static
GetCurrent method of that class, as shown in the following example:
1. Open an instance of Visual Studio .NET and create a new Visual C#
.NET Windows application.
2. Place a ListBox control (lbProperties) and a Button control
(btnGetProperties) on the form.
3. Switch to Code view and add the following using directive:
using System.Security.Principal;
private void btnGetProperties_Click(object sender, System.EventArgs e)
{
AppDomain.CurrentDomain.SetPrincipalPolicy(
PrincipalPolicy.WindowsPrincipal);
lbProperties.Items.Clear();
WindowsIdentity wi = WindowsIdentity.GetCurrent();
// Dump its properties to the listbox
lbProperties.Items.Add(“WindowsIdentity:”);
lbProperties.Items.Add(“ Authentication type: “ +
wi.AuthenticationType);
lbProperties.Items.Add(“ Is Anonymous: “ + wi.IsAnonymous);
lbProperties.Items.Add(“ Is Authenticated: “ +
wi.IsAuthenticated);
lbProperties.Items.Add(“ Is Guest: “ + wi.IsGuest);
lbProperties.Items.Add(“ Is System: “ + wi.IsSystem);
lbProperties.Items.Add(“ Name: “ + wi.Name);
lbProperties.Items.Add(“ Token: “ + wi.Token.ToString());
WindowsPrincipal prin = new WindowsPrincipal(wi);
lbProperties.Items.Add(“WindowsPrincipal:”);
lbProperties.Items.Add(“ Authentication Type: “ +
prin.Identity.AuthenticationType);
lbProperties.Items.Add(“ Is Authenticated: “ +
prin.Identity.IsAuthenticated);
lbProperties.Items.Add(“ Name: “ + prin.Identity.Name);
lbProperties.Items.Add(“ Member of Users: “ +
prin.IsInRole(@”MYDOMAIN\Users”));
}
4. When you run the project, the code returns the current values of the
WindowsIdentity and WindowsPrincipal classes. Note that you need to
replace MYDOMAIN in the previous code with your domain name.
The IsInRole method enables you to test the role membership of the current
user against the specified DOMAIN\Group name. This method accepts
three forms of arguments:
➤ IsInRole(WindowsBuiltInRole)—Uses one of the WindowsBuiltInRole
constants to check group membership
➤ IsInRole(String)—Checks for membership in the specified group
339
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuring
. . . . . . .a .Windows
. . . . . Application
. . . . . .
➤ IsInRole(Integer)—Checks for membership in a group with the specified
role identifier (RID)
The PrincipalPermission Class
Another way to identify group membership involves using the
PrincipalPermission class or the PrincipalPermissionAttribute attribute, as
in the following example:
1. Open an instance of Visual Studio .NET and create a new Visual C#
.NET Windows application.
2. Switch to code view and add the following using directive:
using System.Security.Permissions;
using System.Security.Principal;
3. Add the following code to handle the Load event of the form:
private void Form1_Load(object sender, System.EventArgs e)
{
// Tell the CLR to use Windows security
AppDomain.CurrentDomain.SetPrincipalPolicy(
PrincipalPolicy.WindowsPrincipal);
// Create a new PrincipalPermission object
// This object matches any user in a group named Administrators
PrincipalPermission pp = new PrincipalPermission(
null, “Administrators”);
// See if the user is in the group
try
{
pp.Demand();
MessageBox.Show(“You are in the Administrators group”);
}
catch (Exception ex)
{
MessageBox.Show(“Exception: “ + ex.Message);
}
}
4. When you run the project, the code either notifies you if you are a
member of the Administrators group or displays the security exception
message.
340 Chapter 15
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Practice Questions
Question 1
After compiling your application into an executable named MyApp.exe, what will
be the name of the file that contains the values assigned to dynamic properties
in your application?
❍ A. app.config
❍ B. MyApp.config
❍ C. machine.config
❍ D. MyApp.exe.config
❍ E. MyApp.exe
Answer D is correct. The configuration file for an executable application
derives its name from <application name>.exe.config. Answer A is incorrect
because app.config is used only by an application within the IDE. Answer B
is incorrect because it lacks the executable designation (exe) linking it to the
primary MyApp.exe executable. Answer C is incorrect because the
machine.config file details machine configuration details rather than application-level settings. Answer E is incorrect because MyApp.exe is the name
of the compiled executable rather than its associated configuration file.
Question 2
You want to develop an application that can be easily customized by users
through an application configuration file. You have decided that a few properties
of the form need to be customized. Which of these form properties can be set
in a configuration file through dynamic property support?
❑ A. Text
❑ B. Font
❑ C. BackColor
❑ D. ForeColor
❑ E. Opacity
❑ F. ShowInTaskBar
341
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuring
. . . . . . .a .Windows
. . . . . Application
. . . . . .
Answers A, E, and F are correct. You can set any simple property (that is, any
property whose value is not an instance of a class or a structure) to be a
dynamic property. Therefore Text, Opacity and ShowInTaskBar can be set
up as dynamic properties which can be configured through an configuration
file. Answers B, C, and D are not correct because the Font property is an
instance of the Font class and the BackColor and ForeColor properties are
of type Color Structure.
Question 3
Which of the following actions can be performed using the Microsoft .NET
Framework Configuration tool? (Select all that apply.)
❑ A. Manage configured assemblies
❑ B. Manage remoting channels
❑ C. Manage application settings
❑ D. Manage security policy settings
❑ E. Manage the contents of the GAC
Answers A, B, C, D, and E are all correct. The Microsoft .NET Framework
Configuration tool can be used to manage configured assemblies, remoting
channels, application settings, security policy settings, and the contents of
the Global Assembly Cache (GAC).
Question 4
How many configuration files can an application have?
❍ A. One
❍ B. Two
❍ C. Three
❍ D. As many as needed
Answer A is correct. An application can have only one configuration file.
Answers B, C, and D are incorrect because they specify an incorrect number
of configuration files. However, it is possible for an application to have its
settings affected by a machine.config file.
342 Chapter 15
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 5
You have an assembly named PieChart, which is a member of code groups in
the Enterprise, Machine, and User levels. PieChart is a member of the All Code
group in the Enterprise level that has the FullTrust permission set. In the
Machine level, it is a member of the Low Risk code group that has the
LocalIntranet permission set. In the User level, it is a member of the High Risk
code group that has the Internet permission set. What permission set will the
CLR assign to the PieChart assembly?
❍ A. FullTrust
❍ B. LocalIntranet
❍ C. Internet
❍ D. Nothing
Answer C is correct. The PieChart assembly is a member of code groups that
belong to different levels. Across levels, the permission set granted to an
assembly is the intersection of all the permission sets of the levels. Therefore,
the intersection of the FullTrust, LocalIntranet, and Internet permission sets
is the Internet permission set.
Question 6
Which of the following are valid permission object types? (Select all that apply.)
❑ A. Code-based
❑ B. Group-based
❑ C. Role-based
❑ D. User-based
❑ E. Identity
Answers A, C, and E are correct. The .NET Framework groups permissions
into three object types: code-based, role-based, and identity. Answer B is
incorrect because there is not a defined group-based security object type—
group-based access control is referred to as role-based security. Answer D is
incorrect because there is no defined user-based security object type.
343
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuring
. . . . . . .a .Windows
. . . . . Application
. . . . . .
Question 7
You have created an application that might be exposed to anonymous access,
and you want to ensure that only other code modules that have a specific set of
permissions can use your application. Which of the following SecurityAction
values would be most appropriate?
❑ A. RequestMinimum
❑ B. RequestOptional
❑ C. RequestRefuse
❑ D. Demand
Answer D is correct. The Demand security action specifies that only code
modules that have the specified permissions can call your application.
Answer A is incorrect because the RequestMinimum security action is used
to verify that the calling code has at least the minimum permissions specified.
Answer B is incorrect because the RequestOptional security action is used to
check whether the calling code has some optional, but not strictly required,
permissions. Answer C is incorrect because the RequestRefuse security
action is used to restrict the possible permissions that your application will
have. It is a good idea to configure a RequestRefuse in an anonymous-access
application, but it is not the best answer for the proposed requirement.
Question 8
Which of the following statements is not correct with respect to the security permissions in the Microsoft .NET Framework?
❍ A. Code access security permissions specify whether a user has the
access to execute given code.
❍ B. Identity security permissions specify that the given code has credentials that support a particular kind of identity.
❍ C. Role-based security permissions specify whether a user has a particular identity that is required to access the given code.
❍ D. If you place a demand on a particular security permission on your
code, all code that uses your code must have that security permission
to run.
Answer A is correct. Code access security permissions specify whether a particular code can access a protected resource or can perform a protected operation. Answers B, C, and D are true for the security permissions in the .NET
Framework.
344 Chapter 15
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 9
Which of the following default permissions sets should be used to grant all permissions except the permission to skip security checks?
❍ A. Execution
❍ B. Internet
❍ C. LocalIntranet
❍ D. FullTrust
❍ E. Everything
Answer E is correct. The Everything permission set includes all permissions
except the permission to skip security checks. Answers A, B, and C are incorrect because the Execution, Internet, and LocalIntranet permission sets do
not have sufficient permissions to meet the requirement. Answer D is incorrect because the FullTrust permission grants all permissions, including the
permission to skip security checks.
Question 10
Your application includes several ASP.NET components. Which type of authorization should you use to allow these components to use Windows authentication?
❍ A. Forms-based
❍ B. Windows
❍ C. Microsoft Passport
❍ D. Custom
Answer B is correct. The Windows method of authorization allows
ASP.NET applications to use the built-in Windows authentication available
within IIS. Answer A is incorrect because a forms-based authorization
method can be used to prompt a user for credentials but would not function
automatically with the user’s Windows account. Answer C is incorrect
because the Passport service is used for authorization through a centralized
service rather than through integrated Windows authentication. Answer D is
incorrect because it is not necessary to create a custom authorization
method; the Windows authorization method will suffice.
345
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuring
. . . . . . .a .Windows
. . . . . Application
. . . . . .
Need to Know More?
Kalani, Amit. MCAD/MCSD Training Guide: Developing and
Implementing Windows-Based Applications with Microsoft Visual C#
.NET and Microsoft Visual Studio .NET, Exam 70-316. Que
Certification, 2003.
LaMacchia, Brian A. et al. .NET Framework Security. AddisonWesley, 2002.
Visual Studio .NET how-to resources: http://msdn.microsoft.
com/howto/visualstudio.asp.
16
Sample Test #1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
348 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Do not read Chapters 16–19 until you have learned and practiced all the
material presented in the earlier chapters of this book. These chapters serve
a special purpose: They are designed to test whether you are ready to take
Exam 70-316. In these chapters, you will find two sample exams. Each sample exam is followed by an answer key and a brief explanation of correct
answers, along with explanation as to why the other answers are not correct.
Reading these chapters before other chapters is like reading the climax of a
story and then going back to find out how the story arrived at that ending.
Of course, you don’t want to spoil the excitement, do you?
How to Take the Sample Exams
Each sample exam in this book consists of 60 questions; you should complete
an exam within 150 minutes. The number of questions and the time duration
in the actual exam might vary but should be close to this number.
After you have studied the material presented in the earlier chapters of this
book, you should take Sample Test #1 to check how prepared you are. After
you have completed the sample exam, evaluate yourself using the answer key
in Chapter 17, “Answer Key for Sample Test #1.” When you evaluate yourself, note the questions that you answered wrong, identify their corresponding chapters in the book, and then read and understand that material before
taking Sample Test #2. After you take Sample Test #2, evaluate yourself
again, and reread the material corresponding to any wrong answers. Finally,
repeat both the sample exams until you can correctly answer all the questions. Information in the following sections helps you in taking the sample
exam and then evaluating yourself.
Exam-Taking Tips
You take these sample exams on your own, but I strongly suggest that when
you take this practice exam, you treat it just as you would the actual exam at
the test center. Use the following tips to get the maximum benefit from the
sample exams.
➤ Before you start, create a quiet, secluded environment where you are not
disturbed for the duration of the exam.
➤ Provide yourself a few empty sheets of paper before you start. Use some
of these sheets to write your answers, and use the others to organize
your thoughts. At the end of the exam, use your answer sheet to evaluate
your exam with the help of the answer key that follows the sample exam.
349
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
➤ Don’t use any reference material during the exam.
➤ Some of the questions are vague and require you to make deductions to
come up with the best possible answer from the possibilities given.
Others are verbose, requiring you to read and process a lot of information before you reach the actual question.
➤ As you progress, keep track of the elapsed time and make sure that you’ll
be able to answer all the questions in the given time limit.
350 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sample Exam 1
Question 1
You have created a DataSet that contains a single DataTable object named
Customers. The Customers DataTable has all of the rows and columns from the
Customers table in your database. You would like to bind only selected columns
from the Customers table to a DataGrid control. You want a solution that
requires minimum programming, and you want to have minimum impact on the
performance of SQL Server. How should you proceed?
❍ A. Create a second DataTable in the DataSet. Copy the desired data to the
second DataTable. Bind the second DataTable to the DataGrid.
❍ B. Create a Command object to retrieve the desired columns from the
DataTable. Bind the Command object to the DataGrid.
❍ C. Bind the DataGrid to the entire DataTable. Use the Width property of
the columns in the DataGrid to hide the undesired columns by setting
them to 0 width.
❍ D. Create a DataView that retrieves only the desired rows from the
DataTable. Bind the DataGrid to the DataView.
Question 2
Your application includes a SqlDataAdapter object named sqlDataAdapter1 that
was created by dragging and dropping the Customers table from a database to
your form. Your application also includes a DataSet named dsCustomers1,
based on this SqlDataAdapter. What line of code should you use to load the data
from the database into the DataSet?
❍ A.
dsCustomers1= sqlDataAdapter1.Fill(“Customers”);
❍ B.
sqlDataAdapter1.Fill(“dsCustomers1”, “Customers”);
❍ C.
sqlDataAdapter1.Fill(dsCustomers1, “Customers”);
❍ D.
sqlDataAdapter1.Fill(dsCustomers1);
351
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 3
You have recently deployed an expense-reporting system in your company. The
application relies heavily on its SQL Server database. All employees in the company have identical access permissions to the database. You have created the
application in such a way that it uses each employee’s logon name and password in the connection string to connect to SQL Server. Users of the application
consistently report slow performance of the application. Your task is to optimize
the performance of this application. You noted that another application, which
uses the same SQL Server database, is having good performance. Which one of
the following steps will you take?
❍ A. Compile the application to native code using ngen.exe.
❍ B. Run the SQL Server Index Tuning Wizard.
❍ C. Increase the maximum size of the connection pool.
❍ D. Use same connection strings for all users.
Question 4
You are developing a Windows-based application named VerifyOrders. The
VerifyOrders application receives data from the Orders application in XML format. The VerifyOrders application enables its users to review the orders and
make any required changes. When the users are finished reviewing the orders,
the VerifyOrders application must create an output XML file, which is returned
to the Orders application. The output XML file must contain the original as well
as the changed values. Which of the following options will you choose to create
such an output XML file?
❍ A. Call the DataSet.WriteXmlSchema() method and pass an XmlWriter
object as a parameter.
❍ B. Call the DataSet.WriteXml() method and set the value for the
XmlWriteMode parameter to IgnoreSchema.
❍ C. Call the DataSet.WriteXml() method and set the value for the
XmlWriteMode parameter to WriteSchema.
❍ D. Call the DataSet.WriteXml() method and set the value for the
XmlWriteMode parameter to DiffGram.
352 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 5
You are writing a Visual C# .NET Windows application that executes several
stored procedures to update a SQL Server database. You use database transactions to ensure that either all updates to the database succeed or the changes
are rolled back in case of an error. You used the following code segment to create the database connection and the transaction object in your program:
SqlConnection sqlConnection1 = new SqlConnection
(strConnString);
sqlConnection1.Open();
SqlCommand sqlCommand1 = new SqlCommand();
SqlTransaction sqlTrans;
You need to prevent other users from updating or inserting rows into the database until the transaction is complete. Which of the following statements
enables you to fulfill this requirement?
❍ A.
sqlTrans = sqlConnection1.BeginTransaction(IsolationLevel.
➥ReadCommitted);
❍ B.
sqlTrans = sqlConnection1.BeginTransaction(IsolationLevel.
➥Serializable);
❍ C.
sqlTrans = sqlCommand1.BeginTransaction(IsolationLevel.
➥ReadCommitted);
❍ D.
sqlTrans = sqlCommand1.BeginTransaction(IsolationLevel.
➥Serializable);
353
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 6
You need to develop a Windows application that exports the content of the
Customers table to an XML file. The exported XML file will be used by a marketing company for various customer-relation programs. The marketing company requires that customer data be exported to the XML file in the following
format:
<Customers CustomerID=”ALFKI” ContactName=
”Maria Anders” Phone=”030-0074321” />
<Customers CustomerID=”ANATR” ContactName=
”Ana Trujillo” Phone=”(5) 555-4729” />
Which of the following code segments would you use to export the Customers
table to the XML format in the specified format?
❍ A.
foreach(DataColumn c in dataSet1.Tables[“Customers”].
➥Columns)
{
c.ColumnMapping = MappingType.Attribute;
}
dataSet1.WriteXml(“Customers.xml”);
❍ B.
foreach(DataColumn c in dataSet1.Tables[“Customers”].
➥Columns)
{
c.ColumnMapping = MappingType.Element;
}
dataSet1.WriteXml(“Customers.xml”);
❍ C.
foreach(DataColumn c in dataSet1.Tables[“Customers”].
➥Columns)
{
c.ColumnMapping = MappingType.Attribute;
}
dataSet1.WriteXml(“Customers.xml”, XmlWriteMode.
➥WriteSchema);
❍ D.
foreach(DataColumn c in dataSet1.Tables[“Customers”].
➥Columns)
{
c.ColumnMapping = MappingType.Element;
}
dataSet1.WriteXml(“Customers.xml”, XmlWriteMode.
➥WriteSchema);
354 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 7
You are developing a Windows form application that processes data from a SQL
Server 7.0 database. The application reads the data from the database in a forward-only way and does not perform any update operation. You use the
System.Data.SqlClient.SqlConnection object to connect to the SQL Server database. You then use a System.Data.SqlClient.SqlCommand object to run a stored
procedure and retrieve the results into a System.Data.SqlClient.SqlDataReader
object. The application reads two fields from each row of data, and concatenates
their values into a string variable. What can you do to optimize this application?
❍ A. Replace the SqlConnection object with an OleDbConnection object.
❍ B. Replace the stored procedure with a SQL statement.
❍ C. Replace the SqlDataReader object with a DataSet object.
❍ D. Replace the String variable with a StringBuilder object.
Question 8
Your application uses a SqlDataReader object to retrieve patient information
from a medical records database. When you find a patient who is currently hospitalized, you want to read the names of the patient’s caregivers from the same
database. You have created a second SqlDataReader object, based on a second
SqlCommand object, to retrieve the caregiver information. When you call the
ExecuteReader() method of the SqlCommand object, you get an error. What is
the most likely cause of this error?
❍ A. You are using the same SqlConnection object for both SqlDataReader
objects, and the first SqlDataReader is still open when you try to execute the SqlCommand.
❍ B. You must use a SqlDataAdapter object to retrieve the caregiver information.
❍ C. You must use the OleDbDataReader object to retrieve information
instead of the SqlDataReader object.
❍ D. You are using the ExecuteReader() method of the SqlCommand object,
but you should be using the ExecuteScalar() method instead.
355
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 9
Your application retrieves data from the Customers and Orders tables in a database by using a view named vwCustOrders. This view is used as the
CommandText for the SelectCommand of a DataAdapter object. The application
uses the Fill() method of this DataAdapter to fill a DataSet. The DataSet is bound
to a DataGrid control.
Users report that changes they make to data displayed on the DataGrid are not
saved to the database. What could be the problem?
❍ A. The DataGrid control does not support editing data from a database.
❍ B. You cannot update a DataSet that’s based on a view.
❍ C. The DataGrid control does not support two-way data binding.
❍ D. Your application does not call the Update() method of the DataAdapter
object.
Question 10
You use Visual C# .NET to develop a Windows application that will be used by
the customer service department. Your application receives data from the
Orders application. Users of your application get calls from the customers to
make changes to their orders. You write the code that enables them to make the
changes to the data, but now you want to write code that sends the changed
records back to the Orders application. Which of the following methods should
you use to accomplish this requirement?
❍ A. DataSet.Clone()
❍ B. DataSet.Copy()
❍ C. DataSet.GetChanges()
❍ D. DataSet.Merge()
356 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 11
You develop a Windows application that enables users to add new regions in the
SQL Server Sales database. You use the following Visual C# .NET code segment
to add regions:
SqlCommand command = new SqlCommand(null, sConn);
command.CommandText =
“INSERT INTO Region (RegionID, “ +
“RegionDescription) VALUES (@rid, @rdesc)”;
command.Parameters.Add ( “@rid”, rid);
command.Parameters.Add ( “@rdesc”, rdesc);
command.ExecuteNonQuery();
Each time the users use this application, they can add several regions. Which of
the following options will you use to ensure optimum performance of the application?
❍ A. Use the SqlCommand.ExecuteReader() method instead of the
SqlCommand.ExecuteNonQuery() method.
❍ B. Call the SqlCommand.Prepare() method before each call to the
SqlCommand.ExecuteNonQuery() method.
❍ C. Call the SqlCommand.Prepare() method before the first call to the
SqlCommand.ExecuteNonQuery() method.
❍ D. Call the SqlCommand.ResetCommandTimeout() method before each
call to the SqlCommand.ExecuteNonQuery() method.
357
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 12
You develop a Windows application named ProcessOrder using Visual C# .NET.
Your application receives orders from customers in an XML file named
Orders.xml. The Orders.xml file does not include any schema. Which of the following methods should you use to load the data from Orders.xml into a DataSet
object? (Select two.)
❑ A.
DataSet ds = new DataSet(“Orders”);
ds.ReadXml(“Orders.xml”, XmlReadMode.Auto);
❑ B.
DataSet ds = new DataSet(“Orders”);
ds.ReadXml(“Orders.xml”, XmlReadMode.DiffGram);
❑ C.
DataSet ds = new DataSet(“Orders”);
ds.ReadXml(“Orders.xml”, XmlReadMode.Fragment);
❑ D.
DataSet ds = new DataSet(“Orders”);
ds.ReadXml(“Orders.xml”, XmlReadMode.InferSchema);
❑ E.
DataSet ds = new DataSet(“Orders”);
ds.ReadXml(“Orders.xml”, XmlReadMode.ReadSchema);
358 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 13
You are a Microsoft .NET developer for a large warehousing company. You need
to develop an application that helps users manage the inventory. Inventory data
is stored in a SQL Server 2000 named Warehouse2 in a database named
Inventory. You use a SqlConnection object and Windows Integrated authentication to connect with the Inventory database. Which of the following connection
strings should you choose in your Visual C# .NET program?
❍ A.
“Provider=SQLOLEDB;Data Source=WareHouse2;
➥Initial Catalog=Inventory;
➥Integrated Security=SSPI;”
❍ B.
“Provider=SQLOLEDB;Data Source=WareHouse2;
➥Initial Catalog=Inventory;
➥user id=sa;password=Ti7uGf1;”
❍ C.
“data source=WareHouse2;
➥initial catalog=inventory;
➥Trusted_Connection=true;”
❍ D.
“data source=WareHouse2;user id=sa;
➥password=Ti7uikGf1;
➥initial catalog=inventory;”
359
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 14
The application that you’re designing should display employee information on a
DataGrid control by using complex data binding. Your database contains a table
of departments and a table of employees. The Employees table has a foreign key
that points back to the Departments table. The application should communicate
with the database via a slow WAN link. The list of departments changes approximately once every two months.
The form should display all the employees from a single department. Although
users will view only one department at a time, they will frequently need to view
several departments during the course of a session with the application.
You want to write minimum code. How should you design the filtering for this
form?
❍ A. Build one view on the server for each department. At runtime, have the
program use the appropriate view to retrieve the requested department.
❍ B. Each time the user requests a department, retrieve all the data into a
DataSet object. Then delete all rows from the DataSet object that do
not apply to this department.
❍ C. Retrieve all the data into a DataSet object. Use a DataView object, with
its RowFilter property set at runtime, to retrieve individual departments
as needed.
❍ D. Build one form for each department. Each form should be based on a
view that returns only the employees for that department. At runtime,
open the appropriate form. Hide the form when the user is done so
that it can be opened more quickly if it’s needed a second time.
360 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 15
You are working with a complex form that uses Panel controls to organize a
large amount of data. The form displays information from six different data
sources. Some of the panels contain data from more than one data source.
You have added navigation buttons to scroll through the data in one particular
data source. The navigation buttons increment and decrement the Position
property of a CurrencyManager object. You test the form, and the buttons do not
appear to scroll the data in that data source. What could be the problem?
(Choose the best two answers.)
❑ A. There are too many controls on the form, so your code is not being
executed.
❑ B. You retrieved the CurrencyManager object through the form’s
BindingContext object, but the Panel control has its own
BindingContext object.
❑ C. This particular CurrencyManager object does not support a Position
property.
❑ D. The BindingContext object that you’re using has more than one
CurrencyManager object, and you’re working with the wrong one.
361
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 16
You have to develop a Windows application that will be used by the Ordertracking system of your company. The application contains a form that displays
a list of orders placed by the customers for the past year. When the employee
selects an order from the list box, you need to display the order status and other
information of the selected order in a set of text boxes. You have retrieved the
order details in a DataSet object named dsOrders. The dsOrders object contains
a table named Order that contains the order status and other information. You
are required to bind the text box controls with the information from the DataSet.
Which line of code would you use to bind the text box control to the field named
OrderStatus in the Order table?
❍ A.
txtStatus.DataBindings.Add(“Text”, dsOrders, “Order.
➥OrderStatus”);
❍ B.
txtStatus.DataBindings.Add(“Text”, dsOrders, “”);
❍ C.
txtStatus.DataBindings.Add(“Text”, dsOrders, “OrderStatus”);
❍ D.
txtStatus.DataBindings.Add(“Tag”, dsOrders, “Order.
➥OrderStatus”);
❍ E.
txtStatus.DataBindings.Add(“Tag”, dsOrders, “”);
❍ F.
txtStatus.DataBindings.Add(“Tag”, dsOrders, “OrderStatus”);
362 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 17
You develop a Windows-based application that displays supplier data in a
DataGrid control. The supplier data is stored in a table named Suppliers within
the dsSuppliers DataSet object. The primary key for the Suppliers table is the
SupplierID column. You need to display the supplier data in the DataGrid control in ascending order of the field named State. Which of the following code
segments can you use? (Select two.)
❑ A.
DataView dvSuppliers = new
DataView(dsSuppliers.Tables[“Suppliers”]);
dvSuppliers.Sort = “State ASC”;
dataGrid1.DataSource = dvSuppliers;
❑ B.
DataView dvSuppliers = new
DataView(dsSuppliers.Tables[“Suppliers”]);
dvSuppliers.Sort = “ASC”;
dataGrid1.DataSource = dvSuppliers;
❑ C.
DataView dvSuppliers = new
DataView(dsSuppliers.Tables[“Suppliers”]);
dvSuppliers.ApplyDefaultSort = true;
dataGrid1.DataSource = dvSuppliers;
❑ D.
DataView dvSuppliers = new
DataView(dsSuppliers.Tables[“Suppliers”]);
dvSuppliers.Sort = “State”;
dataGrid1.DataSource = dvSuppliers;
363
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 18
You need to develop a database application that interacts with the Oracle database. You need to write code to return the total number of customers from the
database as quickly as possible. Which of the following actions should you
take?
❍ A. Write an ad-hoc SQL query to return the total number of customers.
Use the OleDbCommand.ExecuteScalar() method to execute the SQL
statement.
❍ B. Write an ad-hoc SQL query to return the total number of customers.
Use the OleDbCommand.ExecuteReader() method to execute the SQL
statement.
❍ C. Write an ad-hoc SQL query to return the total number of customers.
Use the OleDbDataAdapter.Fill() method to execute the SQL statement.
❍ D. Create a stored procedure to return the total number of customers.
Use the OleDbCommand.ExecuteScalar() method to execute the stored
procedure.
❍ E. Create a stored procedure to return the total number of customers.
Use the OleDbCommand.ExecuteReader() method to execute the
stored procedure.
❍ F. Create a stored procedure to return the total number of customers.
Use the OleDbDataAdapter.Fill() method to execute the stored procedure.
364 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 19
You are developing a Windows form using Visual C# .NET. You name the form
as form1 and place a TextBox control named textBox1 on the form. The
KeyPreview property of form1 is set to true. You write the following event handlers for form1:
private void form1_KeyPress(object sender,
System.Windows.Forms.KeyPressEventArgs e)
{
if(e.KeyChar == ‘a’)
{
Debug.WriteLine(“Handled by form”);
e.Handled = true;
}
}
private void textBox1_KeyPress(object sender,
System.Windows.Forms.KeyPressEventArgs e)
{
if(e.KeyChar == ‘a’)
{
Debug.WriteLine(“Handled by textbox”);
}
}
private void textBox1_KeyDown(object sender,
System.Windows.Forms.KeyEventArgs e)
{
if(e.KeyCode == Keys.A)
{
Debug.WriteLine(“Handled by textbox”);
}
}
When testing this form, the user presses the A key with the focus in textBox1.
What is the output generated from the event handlers?
❍ A.
Handled by form
❍ B.
Handled by textbox
Handled by form
Handled by textbox
❍ C.
Handled by textbox
Handled by form
❍ D.
Handled by textbox
365
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 20
Your form requires a control that behaves exactly like a TextBox control, except
that you want to display the text in red. You want to write minimum code. From
which of the following classes should you derive this control?
❍ A. UserControl
❍ B. TextBox
❍ C. Control
❍ D. Component
Question 21
You want to give end users the capability to customize your application so that
it fits better with their corporate look and feel. In particular, you want to specify
the text that appears in the title bar of the main menu form. You want to write
minimum code to do this. How would you add this capability to your application?
❍ A. Supply full source code with your application and tell users that they
can edit the text and rebuild the application.
❍ B. Let the user edit the text in the Registry and use the
Microsoft.Win32.Registry class to retrieve the value that they save.
❍ C. Make the Text property of the form a dynamic property, and provide an
XML file that the user can edit to set the value of the property.
❍ D. Run code in the form’s Load event to retrieve the form’s title from a
text file by using a FileStream object.
Question 22
Your department is responsible for maintaining a variety of accounting applications. You’ve been assigned the task of creating a standard control to represent
credit and debit accounts. The control will be made up of a collection of TextBox
and ComboBox controls. You want to write minimum code. On which class
should you base this control?
❍ A. Control
❍ B. UserControl
❍ C. Form
❍ D. Component
366 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 23
Your form enables the user to enter a telephone number into a TextBox control
named txtPhone. You use the Validating event of this control to check that the
phone number is in the correct format. If the phone number is not in the correct
format, you do not allow the focus to leave the txtPhone TextBox control.
The form also includes a Button control and a btnCancel, to cancel the data entry
action. The user should be able to click this button at any time, even when there
is invalid data in the textbox. What should you do to ensure this?
❍ A. Set the CausesValidation property of the TextBox control to true.
❍ B. Set the CausesValidation property of the Button control to true.
❍ C. Set the CausesValidation property of the TextBox control to false.
❍ D. Set the CausesValidation property of the Button control to false.
Question 24
Your application includes a CheckBox control with its ThreeState property set to
true. Your form displays this control in the indeterminate state. You want to take
an action only if the user checks the CheckBox. Which code snippet should you
use?
❍ A.
if (chkTriState.CheckState == CheckState.Checked)
{
// Take action
}
❍ B.
if (chkTriState.Checked)
{
// Take action
}
❍ C.
if (chkTriState.CheckState == CheckState.Indeterminate)
{
// Take action
}
❍ D.
if (chkTriState.CheckState == CheckState.Unchecked)
{
// Take action
}
367
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 25
The main menu form of your application uses the System.Drawing objects to
draw your company’s logo on the background of the form. You want to redraw
the logo whenever the form is resized so that it always fills the entire form. You
want a responsive interface, but you want to write minimum code to get it.
Which of the following options should you choose?
❍ A. Use a Timer control to call the Invalidate() method periodically.
❍ B. Call the Invalidate() method within an event handler for the form’s
Resize event.
❍ C. Call the Invalidate() method within an event handler for the form’s
Paint event.
❍ D. Set the form’s ResizeRedraw property to true.
Question 26
You are designing a Windows application with a variety of controls on its user
interface. Some controls will be infrequently used. For these controls, you do
not want the user to be able to tab into the control, but the user should still be
able to activate the control by clicking in it. Which of the following options
should you use?
❍ A. Set the TabIndex property of the control to 0.
❍ B. Set the TabIndex property of the control to –1.
❍ C. Set the TabStop property of the control to false.
❍ D. Set the Enabled property of the control to false.
368 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 27
Your form uses Label controls to convey information. When the text in the Label
control represents a higher than average value, you want to display it in bold;
when the text in the Label control represents a value that requires the user’s
attention, you want to display it in italics. If both conditions are true, you want
to display the text in bold italics. How should you set the Italic FontStyle for the
control when the value requires attention so that it adds italics whether or not
the font is already bold?
❍ A.
lblSampleText.Font.Style & FontStyle.Italic
❍ B.
lblSampleText.Font.Style ^ FontStyle.Italic
❍ C.
lblSampleText.Font.Style | FontStyle.Italic
❍ D.
lblSampleText.Font.Style | (FontStyle.Underline &
➥FontStyle.Bold)
Question 28
Your application’s main form contains two different Button controls named btnA
and btnB. When the user clicks either of these controls, or when the user moves
the mouse over these controls, you want to run code to display a message on
the form. The message is identical in all cases. You want to write minimum
code. How should you structure your code to fulfill this requirement?
❍ A. Write four separate event handlers, one each for the Click event of
btnA, the MouseMove event of btnA, the Click event of btnB, and the
MouseMove event of btnB.
❍ B. Write two event handlers. The first will handle both Click events, and
the second will handle both MouseMove events.
❍ C. Write two event handlers. The first will handle the Click and
MouseMove events for btnA, and the second will handle the Click and
MouseMove events for btnB.
❍ D. Write a single event handler to handle the Click and MouseMove
events of both controls.
369
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 29
You use Visual Studio .NET to develop an accounting application for your company. You need to develop a set of classes that contains classes and methods
for accounting-related business rules. Several applications in the company will
use these classes. Other developers should be able to instantiate these classes,
but you do not want those developers to create derived classes based on these
classes. Which of the following options should you choose to create such a
class? (Select two.)
❑ A. Create a Windows Control Library project to package your classes.
❑ B. Create a Windows Service project to package your classes.
❑ C. Create a Class Library project to package your classes.
❑ D. Use the following class-declaration template to define your classes:
public abstract class Class1
❑ E. Use the following class-declaration template to define your classes:
public sealed class Class1
❑ F. Use the following class-declaration template to define your classes:
private abstract class Class1
❑ G. Use the following class-declaration template to define your classes:
private sealed class Class1
Question 30
You are developing an accounting application that includes a class named
Transaction. The Transaction class is inherited by subclasses such as
DepositTransaction and PaymentTransaction. The Transaction class includes a
method named VerifyChecksum(). The VerifyChecksum() method should be
available to the Transaction class and to all classes derived from the Transaction
class, but not to any other classes in the application. Which access modifier
should you use in the declaration of the VerifyChecksum() method?
❍ A. protected
❍ B. public
❍ C. private
❍ D. internal
370 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 31
You develop a Windows application that helps manage production schedules for
a manufacturing company. This application uses a library named Production.dll.
You anticipate that, in the future, some other applications might use classes
from the Production.dll library. You might also need to maintain multiple versions of Production.dll. Which of the following options should you choose to
deploy Production.dll? (Select two.)
❑ A. Sign Production.dll with sn.exe.
❑ B. Sign Production.dll with signcode.exe.
❑ C. Install Production.dll in the Windows system directory.
❑ D. Install Production.dll in the Global Assembly Cache.
Question 32
You are designing a custom control for use in industrial automation. This control will monitor a serial port and raise events based on data sent in through the
serial port. This control will be hosted on forms, but it does not require any visual representation at runtime. From which class should you derive this control?
❍ A. Control
❍ B. UserControl
❍ C. Form
❍ D. Component
371
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 33
You are developing a Visual C# .NET application. Your application has two classes, named Person and Employee. The Employee class is derived from the
Person class, as shown in the following code:
01: public class Person
02:
{
03:
public virtual void GetInfo()
04:
{
05:
//Code to print person information
06:
}
07:
}
08:
class Employee: Person
09:
{
10:
public override void GetInfo()
11:
{
12:
// Calling the base class GetInfo method:
13:
14:
}
15: }
In the Employee class, you need to write code to call the GetInfo() method of
the Person class and then do some additional processing. To accomplish this,
which of the following lines of code should you insert at Line 13?
❍ A.
Person.GetInfo();
❍ B.
this.GetInfo();
❍ C.
base.GetInfo();
❍ D.
Person:GetInfo();
372 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 34
Your colleague is writing Visual C# .NET code to understand how exception handling works. She has written the following code, which handles the Click event
of a Button control that is placed on a Windows form:
private void button1_Click(object sender, _
System.EventArgs e)
{
Int32 i, j;
try
{
i = 0;
j = 5 / i;
Debug.WriteLine(“Result = “ + j.ToString());
}
catch (ArithmeticException aex)
{
Debug.WriteLine(“Arithmetic Exception”);
goto EndIt;
}
catch (Exception ex)
{
Debug.WriteLine(“Unknown Exception”);
goto EndIt;
}
finally
{
Debug.WriteLine(“Cleaning up”);
i = 0;
j = 0;
}
EndIt:
}
Which of the following output should you expect when the button is clicked?
❍ A.
Arithmetic Exception
Unknown Exception
❍ B.
Arithmetic Exception
❍ C.
Result =
Arithmetic Exception
Cleaning Up
❍ D.
Arithmetic Exception
CleaningUp
373
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 35
You develop a Windows-based application that retrieves data from a SQL Server
database named Customers. You use the System.Data.SqlClient data provider to
connect with the database. You need to log the severity level of the error
returned from the SQL Server .NET data provider. Which of the following
options should you choose?
❍ A. Catch the SqlException, which is thrown by the SQL Server .NET data
provider. Examine the Class property of the SqlException object.
❍ B. Catch the SqlException, which is thrown by the SQL Server .NET data
provider. Examine the Source property of the SqlException object.
❍ C. Catch the SqlException, which is thrown by the SQL Server .NET data
provider. Examine the Server property of the SqlException object.
❍ D. Catch the SqlException, which is thrown by the SQL Server .NET data
provider. Examine the State property of the SqlException object.
Question 36
You need to develop a Windows application that accesses the Orders XML Web
Service provided by your company’s business partner. You know the URL of the
Web Service. How can you generate client-side proxy classes for a Web
Service? (Select two.)
❑ A. Use a proxy tool such as the .NET WebService Studio tool.
❑ B. Use the Web Services Description Language tool.
❑ C. Use the Web Services Discovery Tool.
❑ D. Set a Web reference to point to the Web Service.
Question 37
You are asked to write a program that alerts users about the latest traffic and
weather conditions in their area. You use Visual Studio .NET to write such a program. To gather the traffic and weather data, your application calls a few Web
Services. Users of your application complain that the user interface of the application is unresponsive while the traffic and weather information is being
retrieved. Which of the following steps should you take to fix this problem?
❍ A. Move the application to a faster computer.
❍ B. Install a faster link to the Internet.
❍ C. Install more memory in the computer.
❍ D. Use asynchronous calls to invoke the Web Service.
374 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 38
You work as a Visual C# .NET programmer for a multinational marketing company. You have been given a task to create a localized version of a Windows
form for use in countries where the text is read from right to left. You need to
make sure that all the controls in the form are aligned properly for the ease of
local users. You need to make minimum changes in the code. Which of the following options should you choose to accomplish this task?
❍ A. Set the RightToLeft property of each control on the Windows form to
true.
❍ B. Set the RightToLeft property of each control on the Windows form to
RightToLeft.Yes.
❍ C. Set the RightToLeft property of the Windows form to true.
❍ D. Set the RightToLeft property of the Windows form to RightToLeft.Yes.
Question 39
You are responsible for maintaining a COM component that is used by numerous applications throughout your company. You are not yet ready to migrate this
COM component to .NET–managed code, but you need to make it available to
an increasing number of other projects that are being developed under the .NET
Framework. What should you do?
❍ A. Set a direct reference to the existing COM component from each .NET
project.
❍ B. Use the Type Library Importer tool to create and sign an assembly that
will use the COM component. Place the generated assembly in the
Global Assembly Cache.
❍ C. Obtain a Primary Interop Assembly for the COM component.
❍ D. Set a direct reference from a single .NET project to the COM component. Include this project in each solution that must make use of the
component.
375
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 40
You use Visual C# .NET to develop a Windows form that allows users to enter
readings from laboratory test results. You want to display help to the user in a
pop-up window when the user presses the F1 key. The help should be contextsensitive--that is, the help text displayed should correspond to the form element
that currently has the focus. You have decided that the help text will be associated with each control on the form. You choose to use the HelpProvider component to display help. Which of the following methods of the HelpProvider
component should you invoke to set the associated help text?
❍ A. SetHelpKeyWord()
❍ B. SetHelpNavigator()
❍ C. SetHelpString()
❍ D. SetShowHelp()
Question 41
Your corporate guidelines insist that the documents generated by programs
should be printed on legal-size paper. Unfortunately, users sometimes use the
Printer Setup dialog box to switch to letter-size paper for their own convenience.
Which event of the PrintDocument class can you use to check and (if necessary)
change the paper tray?
❍ A. BeginPrint
❍ B. EndPrint
❍ C. PrintPage
❍ D. QueryPageSettings
376 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 42
You use Visual Studio .NET to create an application that interacts with a
Microsoft SQL Server database. You create a stored procedure to calculate the
monthly wireless Internet access charges for the customers. You name the
stored procedure as CalculateAccessCharges. When you run the program, you
observe that the results from the stored procedure are not as expected. You
want to debug the CalculateAccessCharges stored procedure to find the error.
You want to minimize the time and efforts involved in debugging. Which of the
following actions should you take?
❍ A. Use the Tools, Debug Processes menu to attach a debugger to the SQL
Server and then step into the CalculateAccessAcharges stored procedure.
❍ B. Place a breakpoint in the CalculateAccessCharges stored procedure
and then use the Debug, Step Into menu to step into the Visual C#
program that calls the stored procedure.
❍ C. Use the SQL Server Print command to print the calculated values in
the stored procedure.
❍ D. Use the Debug.WriteLine() method to print the calculated values in the
stored procedure.
Question 43
You develop a Visual Studio .NET application that helps the shipping department
create mix-and-match pallets. Users of the application complain that the numbers of cases in the pallet is not displayed correctly. To find the location of the
error, you place a breakpoint on the GetCasesInPallet() method. However, when
you execute the program by selecting Debug, Execute, the execution does not
break at the breakpoint. Which of the following actions should you take to
resolve this problem?
❍ A. Select Exceptions from the Debug menu.
❍ B. Select Enable All Breakpoints from the Debug menu.
❍ C. Select Build, Configuration Manager and set the project’s configuration
to Debug.
❍ D. Select Build, Configuration Manager and set the project’s configuration
to Release.
377
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 44
Your application is failing when a particular variable equals 117. Unfortunately,
you cannot predict when this will happen. You want to write minimal code.
Which debugging tool should you use to investigate the problem?
❍ A. Locals window
❍ B. Output window
❍ C. Immediate window
❍ D. Conditional breakpoint
Question 45
You need to develop an application that performs regression analysis on sales
data. You start working on a code sample that you borrowed from your colleague. You encounter several compile-time errors when you customize the
code sample according to your requirements. You want to easily locate each
error and correct it as quickly as possible. Which of the following actions should
you take? (Select the best answer.)
❍ A. Locate each error using the Task List window, and fix them all before
recompiling the program.
❍ B. Locate each error using the Output window, and fix them all before
recompiling the program.
❍ C. Locate each error using the Find Results window, and fix them all
before recompiling the program.
❍ D. Locate each error using the Immediate window, and fix them all before
recompiling the program.
378 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 46
The Visual C# .NET project that you are developing contains the following API
declaration:
[DllImport(“kernel32.dll”, CharSet=CharSet.Auto)]
public static extern int GetComputerName(String buffer,
ref uint size);
The project also contains code to use this API to display the computer name:
public static void ShowName()
{
String buf = “”;
UInt32 intLen=128;
Int32 intRet;
// Call the Win API method
intRet = GetComputerName(buf, ref intLen);
Console.WriteLine(“This computer is named “ +
buf.ToString());
}
You deploy this project and ask users to test it. Users report that no computer
name is displayed. What should you do to resolve this problem?
❍ A. Use the ref keyword with the variable buf in the call to
GetComputerName() API.
❍ B. Tell the users that their computers have no name set in their network
properties.
❍ C. Replace the String object with the StringBuilder object in the code.
❍ D. Use the out keyword with the variable buf in the call to
GetComputerName() API.
379
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 47
You use Visual C# .NET to create an assembly named Tracker.dll. Tracker.dll contains classes for tracking a shipment. You need to deploy the assembly on the
target computer in such a way that it can be accessed by multiple .NET applications. Which of the following actions should you take? (Select all that apply.)
❑ A. Create a strong name for the assembly by using the Strong Name tool
(sn.exe).
❑ B. Register the assembly using the Assembly Registration tool
(regasm.exe).
❑ C. Use XCOPY to deploy the assembly to the Global Assembly Cache.
❑ D. Use XCOPY to deploy the assembly to the Windows system directory.
❑ E. Use a Setup and Deployment project to deploy the assembly to the
Global Assembly Cache.
❑ F. Use a Setup and Deployment project to deploy the assembly to the
Windows system directory.
Question 48
You have deployed your .NET application to several computers in the PRODUCTION domain that are not used for development. Your own computer is in the
DEVELOPMENT domain. There is a two-way trust relationship established
between the PRODUCTION domain and the DEVELOPMENT domain. Users
report problems with the running application. You want to attach to the remote
process for debugging, but you are unable to do so. What could be the
problem?
❍ A. The Machine Debug Manager (mdm.exe) is not installed on the computers in the PRODUCTION domain.
❍ B. Visual Studio .NET does not support cross-domain debugging.
❍ C. You cannot attach to a remote process that was compiled in the default
Release configuration.
❍ D. You must add a switch to the application’s configuration file to enable
remote debugging.
380 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 49
You use Visual C# .NET to develop an assembly that enables developers in your
company to create pie charts in their applications. You name the assembly as
PieChart.dll and package it as version 1.0.0, which is deployed into the GAC.
After two months, you discover that there is a bug in the assembly. You fix the
bug by releasing a new Version 1.0.1 of the assembly. You place the newly created assembly in the GAC. What will happen to the application written by other
developers that use PieChart.dll?
❍ A. The applications using the PieChart.dll assembly will break because the
applications will notice two versions of the assembly in the GAC and
won’t know which one to execute.
❍ B. The applications using the PieChart.dll assembly will notice a new version of the assembly and will load the new version of the assembly
and cause no problems.
❍ C. The applications using the PieChart.dll assembly will ignore the new
version of the assembly in the GAC and will continue to use the older,
buggy version of the assembly.
❍ D. The applications using the PieChart.dll assembly will be requested to
select the desired assembly version to run for their application.
Question 50
You use Visual C# .NET to develop a component that enables developers to create bar graphs in their applications. You name the component as BarGraph. The
developers need to deploy the BarGraph component with each application that
uses the component. How should you package the BarGraph component for
deployment?
❍ A. Use a Cab project to package the BarGraph component.
❍ B. Use a Setup project to package the BarGraph component.
❍ C. Use a Web Setup project to package the BarGraph component.
❍ D. Use a Merge Module project to package the BarGraph component.
381
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 51
Your company uses Visual Studio .NET to create a Windows-based application
that helps students learn geography. The application uses several graphics and
media files to make the presentation interesting and informative for the students. You have been assigned to create a setup program for this application.
Your installation program needs to target Windows XP computers with a full
installation of Windows XP Service Pack 1. For ease in distribution and use, you
need to package the setup program on a single CD-ROM. When you create the
setup program, you note that the size of the resulting package is more than what
you can fit on a CD. Which of the following steps should you take to accommodate the setup program on a single CD? (Select all that apply.)
❑ A. Select the Detected Dependencies folder of the Installer project. In the
Properties window, select the Exclude property for the .NET
Framework dependency and set it to true.
❑ B. Select the Detected Dependencies folder of the Installer project. In the
Properties window, select the Exclude property for the .NET
Framework dependency and set it to false.
❑ C. In the Deployment Project Properties dialog box, set the Package files
property to In Cabinet File(s).
❑ D. In the Deployment Project Properties dialog box, set the Compression
property to Optimized for Size.
Question 52
You develop a Windows-based application using Visual Studio .NET. The application needs to be distributed to users via the Internet. You use Visual Studio
.NET Setup and Deployment projects to package the application. When you test
the software on a Windows XP machine, you observe that your name is being
shown as the software publisher in the program support information in the Add
or Remove Programs section of the Windows Controls Panel. You need to
change the name so that your company’s name, instead of yours, is displayed
in the support information. Which of the following properties of the deployment
project should you change?
❍ A. Author
❍ B. Description
❍ C. SupportPhone
❍ D. SupportUrl
382 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 53
You have created a database-driven Windows application. Using Microsoft SQL
Server, you have also generated an installation script for your database. This
script is stored in a file named InstData.sql. You create a Setup project using
Visual Studio .NET to deploy this application on your client’s computer. Which
of the following actions should you take to create the database when deploying
your application on the client’s machine?
❍ A. Create a component that derives from the Installer class. Override its
Install() method to create the database. Add the component to the
Install node of the Custom Actions Editor in the Setup project.
❍ B. Create a component that derives from the Installer class. Override its
Install() method to create the database. Add the component to the
Commit node of the Custom Actions editor in the Setup project.
❍ C. Copy the InstData.sql file to the Application folder on the file system
on the target machine using the File System Editor. Add InstaData.sql
to the Install node of the Custom Actions Editor in the Setup project.
❍ D. Create a component that derives from the Installer class. Override its
Install() method to create the database. Add the component to the
Launch Conditions Editor in the Setup project.
Question 54
You work as a Visual Studio .NET developer for a big finance company on Wall
Street. The chief information officer of the company has decided to take steps
to increase the security in the organization so that malicious code cannot be
executed. You have been asked to implement a security policy that enables
users to execute applications locally and from the company’s intranet but that
prevents them from executing code originating from the Internet. You want to
complete this task with minimum efforts. Which of the following actions should
you take?
❍ A. Modify the enterprise security policy.
❍ B. Modify the machine security policy.
❍ C. Modify the user security policy.
❍ D. Modify the application-domain security policy.
383
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 55
You develop a Windows-based application using Visual C# .NET. The name of
the main executable file of your application is OrderHistory.exe. You use an
XML-based application configuration file to configure the behavior of
OrderHistory.exe. What should you name the application configuration file, and
where should you deploy it for the application to function correctly?
❍ A. Name the application configuration file as OrderHistory.xml, and
deploy it in the Windows\System32 directory.
❍ B. Name the application configuration file as OrderHistory.xml, and
deploy it in the same directory as OrderHistory.exe.
❍ C. Name the application configuration file as OrderHistory.exe.config, and
deploy it in the Windows\System32 directory.
❍ D. Name the application configuration file as OrderHistory.exe.config, and
deploy it in the same directory as OrderHistory.exe.
Question 56
You develop a Windows-based application using Visual C# .NET. Your code
would like File I/O permission, but it can run without this permission. You plan
to request the permission and trap the error if it is not granted. Which
SecurityAction action should you use with the FileIOPermission object?
❍ A. SecurityAction.RequestMinimum
❍ B. SecurityAction.RequestOptional
❍ C. SecurityAction.Demand
❍ D. SecurityAction.RequestRefuse
Question 57
You have used Visual C# .NET to develop a process-monitoring application.
Your application can identify any process on the system that has a user interface and enable you to collect information about the process. Now you want to
add code that can shut down the identified process as well. Which method
should you use to shut down these processes?
❍ A. Process.Kill()
❍ B. Process.WaitForExit()
❍ C. Process.CloseMainWindow()
❍ D. Process.WaitForInputIdle()
384 Chapter 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 58
The configuration file of a Windows application has the following contents:
<system.diagnostics>
<switches>
<add name=”BooleanSwitch” value=”-1” />
<add name=”TraceLevelSwitch” value=”33” />
</switches>
</system.diagnostics>
You are using the following statements to create switch objects in your code:
BooleanSwitch booleanSwitch =
new BooleanSwitch(“BooleanSwitch”, “Boolean Switch”);
TraceSwitch traceSwitch =
new TraceSwitch(“TraceLevelSwitch”, “Trace Switch”);
Which of the following options is correct regarding the values of these switch
objects?
❍ A. The booleanSwitch.Enabled property is set to false, and
traceSwitch.Level is set to TraceLevel.Verbose.
❍ B. The booleanSwitch.Enabled property is set to true, and
traceSwitch.Level is set to TraceLevel.Verbose.
❍ C. The booleanSwitch.Enabled property is set to false, and
traceSwitch.Level is set to TraceLevel.Error.
❍ D. The booleanSwitch.Enabled property is set to false, and
traceSwitch.Level is set to TraceLevel.Info.
Question 59
You have added the following statement to the Load event handler of a singleform Windows application:
Trace.Listeners.Add(new TextWriterTraceListener
➥(“TraceLog.txt”));
Which of the following statements are true with respect to program execution?
(Select all that apply.)
❑ A. TextWriterTraceListener will listen to all messages generated by the
methods of the Debug and Trace classes.
❑ B. TextWriterTraceListener will listen only to the messages generated by
the methods of the Trace class.
❑ C. All the trace messages will be stored in a file named TraceLog.txt.
❑ D. The trace messages will be displayed in the output window while the
program is run in either the Debug or the Release configurations.
385
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#1.
Question 60
You want to control the tracing and debug output of a Windows-based application without recompiling your code. Which of the following classes will enable
you to do this?
❍ A. TraceListener
❍ B. TraceSwitch
❍ C. Trace
❍ D. Debug
17
Answer Key for Sample
Test #1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
388 Chapter 17
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19. C
40. C
20. B
41. D
21. C
42. B
1. D
22. B
43. C
2. C
23. D
44. D
3. D
24. A
45. A
4. D
25. D
46. C
5. B
26. C
47. A and E
6. A
27. C
48. A
7. D
28. B
49. C
8. A
29. C and E
50. D
9. D
30. A
51. A and D
10. C
31. A and D
52. A
11. C
32. D
53. A
12. A and D
33. C
54. A
13. C
34. D
55. D
14. C
35. A
56. B
15. B and D
36. B and D
57. C
16. A
37. D
58. B
17. A and D
38. D
59. A, C, and D
18. D
39. B
60. B
Answer
Key
Detailed Answers
1. The correct answer is D. The DataView class represents a data-
bindable, customized view of a data table that is optimized for sorting,
filtering, searching, editing, and navigating. Answers A and B are not
correct because these actions will impact SQL Server with additional
hits, thereby decreasing performance. Answer C is not correct because
it is complicated and requires additional programming, and you were
asked to present a solution that requires little programming.
389
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Answer
. . . . .Key
. . for
. .Sample
. . . . Test
. . .#1.
2. The correct answer is C. Although answers C and D both use correct
syntax of the Fill method, the question clearly states the name of the
table; therefore, it is recommended to use the name of the table when
filling the DataSet. Answer A is not correct because there is not an
overload of the Fill method that accepts a single string parameter.
Answer B is not correct because there is not an overload of the Fill
method that accepts two string parameters.
3. The correct answer is D. Using the same connection string enables
ADO.NET to reuse existing pooled database connections instead of
creating new ones. This improves performance because creating new
database connections is a costly operation. Answer B is not correct
because another application that uses the same database is already performing well. Answer C is not correct because if different connection
strings are used, each request for the connection will create a new connection pool; therefore, increasing the maximum size of the pool will
not increase performance of the application. Answer A is not correct
because users are facing slow performance consistently, not just during
the first execution.
4. The correct answer is D because when you set the XmlWriteMode
parameter of the DataSet.WriteXml method to DiffGram, the output
contains both original and current values. Answer A is not correct
because the DataSet.WriteXmlSchema method writes the DataSet
structure as an XML Schema instead of writing XML data. Answers B
and C are not correct because, although the DataSet.WriteXml
method writes the DataSet as an XML file by setting the
XmlWriteMode parameter to IgnoreSchema or WriteSchema, it writes
only the current value of the data to the XML file.
5. The correct answer is B because IsolationLevel.Serializable places a
range lock on the database, preventing other users from updating or
inserting rows into the database until the transaction is complete.
Answer A is not correct because IsolationLevel.ReadCommitted holds
the lock while the data is being read, but data can be changed before
the transaction is complete. Answers C and D are not correct because
the BeginTransaction method is available for objects of the
SqlConnection type but is not available for objects of the
SqlCommand type.
6. The correct answer is A. The ColumnMapping property determines
how a column’s values will be written when the WriteXml method is
called on a DataSet to write output to an XML document. When you
set the ColumnMapping property of a column to
390 Chapter 17
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MappingType.Attribute, that column of the table is mapped to an
XML attribute. Answer B is not correct because setting the
ColumnMapping property of the column to MappingType.Element
maps that column of the table to an XML element. Answers C and D
are not correct because XmlWriteMode.WriteSchema specifies the
WriteXml method to write the current contents of the DataSet as
XML data, along with the relational structure as inline XSD schema.
Writing an additional schema is not required in the question.
7. The correct answer is D. Strings in Visual C# .NET are immutable, so
concatenating multiple values into a string requires deleting and recreating the string many times. The StringBuilder object is optimized
for changing textual data. Answer A is not correct because the
SqlConnection object is more optimized than OleDbConnection for
accessing a SQL Server 7.0 database. Answer B is not correct because
stored procedures have much higher performance than SQL statements. Answer C is not correct because, for a forward-only, read-only
operation, the SqlDataReader object provides the best performance.
8. The correct answer is A. You can have only a single SqlDataReader
object open on a single SqlConnection object. If you need a second
SqlDataReader object, you must open a second SqlConnection object.
Answers B and C are not correct because the question asks for the likely cause for the error, not just an alternative approach. Answer D is not
correct because you want to retrieve multiple values from the database,
and the ExecuteScalar method retrieves only the first column of the
first row in the result set.
9. The correct answer is D. Changes made to a DataGrid bound to a
DataSet are automatically saved to the DataSet. However, they are not
persisted to the underlying data source until you call the Update
method of the DataAdapter object that was used to fill the DataSet.
Answers A and C are not correct because the DataGrid control does
support editing the data from a database and two-way databinding.
Answer B is not correct because a DataSet, which is based on a view,
can be updated.
10. The correct answer is C. Calling the GetChanges method of a DataSet
returns a new DataSet that contains only records that have been
changed. Answer A is not correct because the DataSet.Clone method
copies the structure of the DataSet but does not copy any data. Answer
B is not correct because the DataSet.Copy method copies all the data
instead of only the changed data. Answer D is not correct because you
do not want to merge two DataSet objects.
391
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Answer
. . . . .Key
. . for
. .Sample
. . . . Test
. . .#1.
11. The correct answer is C. The SqlCommand.Prepare method creates a
prepared version of the command on an instance of SQL Server. After
the command has been prepared, further execution of that command
will be comparatively faster. Answer A is not correct because the
SqlCommand.ExecuteReader method is generally used to execute
query statements such as the SELECT statement rather than nonquery
statements such as the INSERT statement. Answer B is not correct
because if SQL Server needs to prepare the command with each execution, performance will decrease instead of increase. Answer D is not
correct because the SqlCommand.ResetCommandTimeout method
just resets the CommandTimeout property to its default value and does
not play a role in optimizing the performance in the given scenario.
12. The correct answers are A and D. In the current scenario, the
XmlReadMode.Auto and XmlReadMode.InferSchema options will
infer schema from the data. Answer B is not correct because the data in
Orders.xml file is not a DiffGram. Answer C is not correct because
when XmlReadMode is set to Fragment, the default namespace is read
as the inline schema.
13. The correct answer is C. To create a connection string for a
SqlConnection object that uses Windows Integrated authentication,
you need to specify the data source and the initial catalog, and indicate
that it is a secure connection. You can indicate that it is a secure connection by setting the Trusted_Connection or Integrated Security
parameters to true or sspi. Answers A and B are not correct because
you do not specify the provider in the connection string when connecting through the SqlConnection object. Answer D is not correct
because you need to use Windows authentication instead of SQL
Server authentication.
14. The correct answer is C. Using DataView.RowFilter property provides
an easy mechanism to retrieve a selected row from the databse.
Answers A and D are not correct because these answers require maintenance programming every time the list of departments changes.
Answer B is not correct because it will retrieve more data than necessary over the slow WAN line.
15. The correct answers are B and D. If you use a container control, such
as a GroupBox, Panel, or TabControl, to contain the data-bound controls, you can create a BindingContext for just that container control
and its controls. This allows each part of your form to be managed by
its own BindingManagerBase object. For things to work correctly, you
need to make sure that you are using the CurrencyManager from the
392 Chapter 17
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
correct BindingContext object. Answer A is not correct because
Windows forms can easily contain more controls on a form than specified in the given scenario. Answer C is not correct because all
CurrencyManager objects support a Position property.
16. The correct answer is A. The three parameters of the
ControlBindingsCollection.Add method are the name of the control
property to bind to, the data source to bind, and the navigation path to
the particular data to bind. So, in this case, the Text property of the
TextBox control should be data-bound to the OrderStatus field of the
Order table in the dsOrders data source. Answer B is wrong because an
empty string is passed to the last parameter only if the data source contains one property or data to bind. Answer C is wrong because the last
parameter of the Add method should specify the complete navigation
path of the property or data to which the control wants to bind.
Answers D, E, and F are wrong because to display the status in the text
box, you need to bind to the Text property instead of the Tag property
of the TextBox.
17. The correct answers are A and D. The Sort property of a DataView
object is a string containing the column name followed by ASC
(ascending) or DESC (descending). Columns are sorted ascending by
default. Answer B is not correct because you must specify the name of
a column in the Sort property, along with ASC or DESC. Answer C is
not correct because the ApplyDefaultSort property is used to automatically create a sort order, in ascending order, based on the primary key
of the table. The ApplyDefaultSort property applies only when the
table has a primary key defined and the Sort property is a null reference or an empty string.
18. The correct answer is D. To return a single value from the database,
you should use the ExecuteScalar method of the OleDbCommand
object. The ExecuteScalar method executes the query and retrieves the
first column of the first row of the result set. You should always use
stored procedures rather than the ad-hoc SQL statements for speedy
delivery. Answers A, B, and C are wrong because they use SQL queries
rather than stored procedures. Answers E and F are wrong because
they involve extra overhead if only a single value is to be returned from
the database.
19. The correct answer is C. The KeyDown event occurs before the
KeyPress events. Setting the Handled property to true in the form’s
KeyPress event prevents the control’s KeyPress event from firing. As a
result, the first message is displayed from the textBox1_KeyDown
393
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Answer
. . . . .Key
. . for
. .Sample
. . . . Test
. . .#1.
event handler and the next message is displayed by the form_KeyPress
event handler. Answer A is not correct because the KeyDown event
occurs before KeyPress. Answer B is not correct because the
textBox1_KeyPress event handler is not executed. Answer D is not correct because the KeyPreview property of form1 is set to true, which
causes the form1_KeyPress event handler to be invoked.
20. The correct answer is B. The easiest way to get a control to behave
precisely like a TextBox is to derive from the TextBox class. Answers A,
C, and D are not correct because they require additional code to be
written.
21. The correct answer is C. Dynamic properties provide a built-in mecha-
nism to set properties at runtime without needing to write any code.
Answers A and B are not correct because asking the user to modify the
program source code or Windows Registry could have undesirable
effects. Answer D is not correct because this option requires writing
additional code to retrieve a form’s text from a file.
22. The correct answer is B. The UserControl class provides you with a
design surface on which you can assemble constituent controls to create a custom control. Answer A is not correct because it requires you to
write additional code. Answer C is not correct because deriving from
the Form class is not a standard way of creating reusable controls.
Answer D is not correct because using the Component class to create
reusable visual components requires additional programming and is
therefore better suited for creating nonvisual components.
23. The correct answer is D. You should set the CausesValidation property
of the Button control to false because setting the CausesValidation
property of a control to false causes the Validating event of other controls to be ignored when the focus is shifted to the specified control.
Answers A and C are not correct because setting the CausesValidation
property of a TextBox control will not have any effect on the Button
control. Answer B is not correct because setting the CausesValidation
property of the Button control to true will not allow you to click the
Button control when there is invalid data in the textbox.
24. The correct answer is A. If a CheckBox control has its ThreeState
property set to true, its Checked property will return true even if the
check box is in the indeterminate state. Answer B is not correct
because you must evaluate the CheckState property to determine
whether the check box is actually checked. Answers C and D are not
correct because you want to take an action only when the user checks
the CheckBox control.
394 Chapter 17
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25. The correct answer is D. Using the ResizeRedraw property requires
less code and causes the form to refresh instantly. Answer A is not correct because calling the Invalidate method periodically will not refresh
the form instantly. Answer B is not correct because this approach
requires you to write more code. Answer C is not correct because the
Invalidate method triggers the Paint event, so calling it within the
Paint event leads to an infinite regress.
26. The correct answer is C. Setting the TabStop property of the control
to false removes the control from the tab order. Answers A and B are
not correct because they just change the order of a control instead of
removing the control from the tab order. Answer D is not correct
because if you set the Enabled property of the control to false, it cannot get the focus under any circumstances.
27. The correct answer is C. Using the Or (|) operator sets the proper bit
to represent the Italic FontStyle without altering any other bits that
might already be set. Answers A, B, and D are not correct because
these options cause additional bits to be set, resulting in an undesired
font style.
28. The correct answer is B. You should avoid duplicating code if you
don’t have to. However, the Click and MouseMove event handlers of
the Button control have different signatures. Therefore, you need to
write two event handlers. The first will handle both Click events, and
the second will handle both MouseMove events. Answer A is not correct because this approach requires a lot of code to be written. Answers
C and D are not correct because the Click and the MouseMove event
handlers have different signatures and must be written separately.
29. The correct answers are C and E. The Class Library project is the best
way to package a set of standard classes. If you do not want a class to
be inherited, it must be declared as sealed. Answers A and B are not
correct because these are not the appropriate project types for the
given scenario. Answer D is not correct because you are writing classes
with the implementation logic. Answers F and G are not correct
because if the classes are defined as private, other developers will not
be able to instantiate them.
30. The correct answer is A. The protected modifier limits member access
to the class containing the member and to subclasses of that class.
Answer B is not correct because the public modifier allows any class to
call the member. Answer C is not correct because the private modifier
limits access to the defining class only. Answer D is not correct because
395
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Answer
. . . . .Key
. . for
. .Sample
. . . . Test
. . .#1.
the internal modifier limits access to classes within the same project,
whether or not they are derived from the defining class.
31. The correct answers are A and D. You need to sign a shared assembly
with the strong name and then install the assembly in the Global
Assembly Cache. Answer B is not correct because you use sn.exe
instead of signcode.exe to sign an assembly with a strong name. Answer
C is not correct because the Windows system directory does not allow
multiple versions of an assembly to be maintained.
32. The correct answer is D. When a custom control does not require a
runtime user interface, the Component class provides the lowest overhead. Answers A, B, and C are not correct because they are more suitable for designing controls with a user interface.
33. The correct answer is C. The base keyword is used to access members
of the base class from within a derived class. Answer A is not correct
because the given syntax is for invoking static members of a class.
Answer B is not correct because the given syntax is for accessing the
method of the current class. Answer D is not correct because of its
invalid syntax.
34. The correct answer is D. An exception will be handled by the most
specific applicable catch block and the finally block will always be executed. Answers A and B are not correct because the finally block always
executes. Answer C is not correct because a division by 0 arithmetic
exception is thrown before the Debug.WriteLine method is executed
in the try block.
35. The correct answer is A. The SqlException.Class property gets a value
from 1 to 25 that indicates the severity level of the error. Answer B is
not correct because the SqlException.Source property gets the name of
the provider that generated the error. Answer C is not correct because
the SqlException.Server property gets the name of the computer running an instance of SQL Server that generated the error. Answer D is
not correct because the SqlException.State property gets a numeric
error code from SQL Server that represents an error, warning, or “no
data found” message.
36. The correct answers are B and D. Either of these options can generate
proxy classes for use in a client application. Answer A is not correct
because the .NET WebService Studio tool is used to invoke a Web
Service for testing. Answer C is not correct because the Web Services
Discovery Tool can locate files related to a Web Service, but it does
not generate any proxy classes.
396 Chapter 17
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37. The correct answer is D. Answers A, B, and C are not correct because
calls to a Web Service will block other processing unless you use asynchronous calls to invoke the Web Service.
38. The correct answer is D. When the RightToLeft property value is set
to RightToLeft.Yes, the horizontal alignment of the control’s elements
is reversed. Answers A and C are not correct because the RightToLeft
property is of the type System.Windows.Form.RightToLeft, which
specifies a value indicating whether the text appears from right to left,
such as when using Hebrew or Arabic fonts. Answer B is not correct
because you need to make minimum changes.
39. The correct answer is B. The Type Library Importer tool enables you
to place the RCW assembly in the GAC so that it can be shared by all
projects on the computer. Answers A and D are not correct because
you need to use the component in more than one project. Answer C is
not correct because a Primary Interop Assembly is for code from other
vendors, not for your own code.
40. The correct answer is C. The SetHelpString method specifies the help
string associated with the specified control. Answer A is not correct
because the SetHelpKeyWord method specifies only the keyword used
to retrieve the help text associated with a control. Answer B is not correct because the SetHelpNavigator method specifies the help command to use while retrieving the text from the help file. Answer D is
not correct because the SetShowHelp method specifies only whether
help is displayed for the specified control.
41. The correct answer is D. The QueryPageSettings event fires before
each page is printed and enables you to check and change page settings. Answers A and B are not correct because you do not have access
to the PageSettings objects in the event arguments of the BeginPrint
and EndPrint events. Answer C is not correct because the event arguments of the PrintPage event provide read-only access to the
PageSettings objects.
42. The correct answer is B. You can step into a stored procedure execu-
tion directly from within Visual Studio .NET. Answer A is not correct
because the Tools, Debug Processes menu item is useful for debugging
running processes, not stored procedures. Answer C is not correct
because this option takes more time and effort. Answer D is not correct because the Debug.WriteLine method cannot directly access the
stored procedure values.
43. The correct answer is C. Breakpoints are invoked only when the pro-
ject’s configuration is in Debug mode. Answer A is not correct because
397
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Answer
. . . . .Key
. . for
. .Sample
. . . . Test
. . .#1.
the Exceptions dialog box is used to configure the breakpoint only in
case of an exception. Answer B is not correct because when you place a
breakpoint, it is enabled by default. Answer D is not correct because
the project’s configuration should be Debug instead of Release for
debugging to occur (breakpoints to be executed).
44. The correct answer is D. A conditional breakpoint lets you pause your
code only when a particular condition is true. In this case, you can use
that capability to break into the code when the variable has the value of
117. Answers A, B, and C are not correct because they do not work
conditionally.
45. The correct answer is A. The Task List window helps you identify and
locate problems, which are detected automatically as you edit or compile code. Answer B is not correct because it mixes other messages
along with the error messages generated by the compiler. Answer C is
not correct because the Find Results window displays matches for text
searches that were performed in the Find in Files dialog box. Answer
D is not correct because the Immediate window is used for debugging
purposes, such as evaluating expressions, executing statements, printing
variable values, and so forth.
46. The correct answer is C. In the PInvoke calls, you should use the
StringBuilder object instead of the String object to hold the return
value. Answer B is not correct because all identified with some name in
the network. Answers A and D are wrong because the
GetComputerName API expects a string buffer rather than sending
reference parameters.
47. The correct answers are A and E. If you want multiple applications to
use an assembly, you need to sign the assembly with a strong name and
place the assembly in the Global Assembly Cache. Answer B is not correct because the COM application is not using the assembly. Answer C
is not correct because assemblies cannot be deployed in the Global
Assembly Cache with the XCOPY command. Answers D and F are not
correct because shared assemblies must be installed in the Global
Assembly Cache instead of the Windows system directory.
48. The correct answer is A. To enable remote debugging on a computer,
the Machine Debug Manager (mdm.exe) must be installed. You can
install this software by installing Visual Studio .NET on the remote
machine or by installing Remote Components Setup on the remote
machine. Answer B is not correct because Visual Studio .NET does
support cross-domain debugging, provided that there is a two-way
trust relationship between the domains. Answer C is not correct
398 Chapter 17
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
because how the remote process was compiled does not matter for
debugging. Answer D is not correct because no switch needs to be
added in the application’s configuration file for remote debugging.
49. The correct answer is C. The applications always bind to the assem-
blies with which they are compiled. If you want to execute a new version of the assembly, the applications should be recompiled with the
new version of the assembly or you should modify the application configuration file to redirect an application to a new version of the assembly. Therefore answers A, B, and D are not correct.
50. The correct answer is D. Merge Module projects enable you to create
reusable setup components by packaging all the required files,
resources, Registry entries, and setup logic necessary to install a component. Answer A is not correct because the Cab project creates a cabinet file for downloading from a Web browser. Answer B is not correct
because the Setup project creates an installer for a standalone
Windows-based application. Answer C is not correct because the Web
Setup project creates an installer for a standalone Web application.
51. The correct answers are A and D. Full installation of Windows XP
Service Pack 1 includes the installation of the .NET Framework;
therefore, you can safely choose to exclude the deployment of the
.NET Framework from the setup package. This will reduce the size of
the setup package to a good extent. To further reduce the size, you can
choose to optimize the setup package for size. Answer B is not correct
because setting the Exclude property to false will include the .NET
Framework and increase the size of the setup package. Answer C is not
correct because changing the packaging to cabinet files will not reduce
the size of the setup package.
52. The correct answer is A. You need to change the Author property of
the deployment project because the Author property specifies the name
of the author of an application. Answer B is not correct because the
Description property is usually used to describe the application instead
of specifying the name of the publisher. Answers C and D are not correct because they are intended to specify the phone number and the
URL of the manufacturer instead of the name.
53. The correct answer is A. You can use the Custom Actions Editor to
take custom actions such as install a database during application setup.
If you have an installer class or a program that needs to create a database, you must override the Install method of the base class and add
the installer program to the Install node of the Custom Actions editor.
Answer B is not correct because you need to add the component to the
399
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Answer
. . . . .Key
. . for
. .Sample
. . . . Test
. . .#1.
Install node instead of the Commit node. Answer C is not correct
because copying the InstData.sql file will not help; you also need to
execute this file on SQL Server and create a custom installation component for the same. Answer D is not correct because the Launch
Conditions Editor is used to specify the prerequisite conditions that
must be met to successfully run an installation; it cannot be used to
execute custom actions.
54. The correct answer is A. The enterprise security policy affects every
computer and user on the network. Answer B is not correct because
this option requires modifying the machine security policy for each
machine in the company. Answer C is not correct because the user
security policy applies to only a single logon account. Answer D is not
correct because security policy at the application domain level cannot
be administered.
55. The correct answer is D. The name of the application configuration
file is X.config, where X is the name of the application (including file
extension). An application will read the settings from the application
configuration file only if both the files are present in the same directory. Answers A and B are not correct because the name of the configuration file is not correct. Answer C is not correct because the deployment
directory of the application configuration file is not correct.
56. The correct answer is B. SecurityAction.RequestOptional is used to
request additional permissions that are optional. Answer A is not correct because SecurityAction.RequestMinimum requests the minimum
permissions required for code to run. Answer C is not correct because
SecurityAction.Demand requires all callers higher in the call stack to
have been granted the permission specified by the current permission
object. Answer D is not correct because SecurityAction.RequestRefuse
is used to refuse those requests that might be misused.
57. The correct answer is C. You should use the
Process.CloseMainWindow method to shut down applications that
have a user interface. This method gives the application a chance to
clean up resources. Answer A is not correct because although the
Process.Kill method also shuts down the application, it does not perform any normal cleanup processing. Answer B is not correct because
instead of killing the process, the Process.WaitForExit method waits
indefinitely for the associated process to exit. Answer D is not correct
because instead of killing the process, the Process.WaitForInputIdle
method waits for the associated process to enter an idle state.
400 Chapter 17
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58. The correct answer is B. For BooleanSwitch, a value of 0 corresponds
to Off (false), and any nonzero value corresponds to On (true). For
TraceSwitch any number greater than 4 is treated as Verbose. From the
given values in the configuration file, the booleanSwitch object will
have its Enabled property set to true, and the traceSwitch object will
have its Level property set to TraceLevel.Verbose. Answers A, C, and
D are not correct because the booleanSwitch.Enabled property should
be true instead of false.
59. The correct answers are A, C, and D. When you add a listener to the
Trace.Listeners collection, it listens to the messages generated by both
the Trace and Debug classes. When the new listener is added, it is
added to the Listeners collection. It already has a DefaultTraceListener
object that sends messages to the output window, and it is still active
and listening to the messages. Therefore, you have messages in
TraceLog.txt as well as in the output window. Answer B is not correct
because listener objects listen to messages generated by both Debug
and Trace classes.
60. The correct answer is B. The TraceSwitch class provides a multilevel
switch that enables you to control tracing and debug output of a
Windows application without recompiling the code. The changes in
behavior can be instrumented by just changing the application’s configuration file. Answer A is not correct because TraceListener is used to
redirect the output of the trace messages. Answers C and D are not
correct because Trace and Debug classes can print messages but cannot
provide any control mechanism for which messages will be printed and
which messages will not be printed.
18
Sample Test #2
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
402 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Practice Test
Question 1
You develop a customer contact-management application using Visual Studio
.NET. You use the methods of the Trace and Debug classes to log serious error
messages encountered during program execution. You want to record all such
errors in the Windows event log. You do not want any duplicate entries for error
messages in the event log. In what two ways can you add a listener to the
Windows event log?
❍ A.
EventLogTraceListener traceListener =
new EventLogTraceListener(“CustomEventLog”);
Trace.Listeners.Add(traceListener);
❍ B.
EventLogTraceListener traceListener =
new EventLogTraceListener(“CustomEventLog”);
Trace.Listeners.Add(traceListener);
Debug.Listeners.Add(traceListener);
❍ C.
EventLogTraceListener traceListener =
new EventLogTraceListener(“CustomEventLog”);
D. ❍
EventLogTraceListener traceListener =
new EventLogTraceListener(“CustomEventLog”);
Debug.Listeners.Add(traceListener);
403
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 2
You develop a supplier-evaluation system using Visual Studio .NET. While testing the program, you notice that the value of TotalShipments variable sometimes becomes 0 and causes an exception in the CalculateAvgShipDelay
method. You want your program to check the value of the TotalShipments variable and display an error message when the value of TotalShipments is 0. You
want the program to display this error message regardless of how you compile
the program. Which of the following code segments should you write before
making a call to the CalculateAvgShipDelay method?
❍ A.
Trace.Assert(TotalShipment == 0, “TotalShipments is zero”);
❍ B.
Trace.Assert(TotalShipment != 0, “TotalShipments is zero”);
❍ C.
Debug.Assert(TotalShipment == 0, “TotalShipments is zero”);
❍ D.
Debug.Assert(TotalShipment != 0, “TotalShipments is zero”);
Question 3
Your application includes a DataSet object that contains a DataTable object
named Suppliers. This DataTable object contains all rows from the Suppliers
table in your database. You want to bind an object to a DataGrid control on a
form so that the DataGrid control displays only the suppliers from Michigan.
You want a quick solution. What should you do?
❍ A. Create a filtered array by calling the DataTable.Select method on the
Suppliers data table and bind the array to the DataGrid control.
❍ B. Create a new SqlCommand object to retrieve only suppliers from
Michigan. Use a new SqlDataAdapter object to fill a new DataSet object
with these suppliers. Bind the new DataSet object to the DataGrid control.
❍ C. Use a foreach loop to move through the entire Suppliers data table.
Each time you find a DataRow object that represents a supplier from
Michigan, bind that DataRow object to the DataGrid control.
❍ D. Create a filtered DataView object from the Suppliers data table and
bind the DataView object to the DataGrid control.
404 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 4
You develop a Windows-based application that displays supplier data in a
DataGrid control. The supplier data is stored in a table named Suppliers within
the dsSuppliers DataSet object. The primary key for the Suppliers table is the
SupplierID column. You need to display the supplier data in the DataGrid control in ascending order of the primary key. You write the following code segment
to accomplish this task:
DataView dvSuppliers =
new DataView(dsSuppliers.Tables[“Suppliers”]);
dvSuppliers.Sort = “ASC”;
dvSuppliers.ApplyDefaultSort = true;
dataGrid1.DataSource = dvSuppliers;
However, when you run the program, the results are not as expected. How
should you change the code segment to get the intended results?
❍ A. Set the Sort property of the DataView object to an empty string.
❍ B. Set the ApplyDefaultSort property of the DataView object to false.
❍ C. Set the RowFilter property of the DataView object to SupplierID.
❍ D. The code segment is correct. You need to ensure that the data in the
Suppliers table is already sorted on the primary key.
405
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 5
You are developing a Windows-based application using Visual C# .NET. Your
application’s configuration files have the following code:
<system.diagnostics>
<switches>
<add name=”TraceLevelSwitch” value=”3” />
</switches>
</system.diagnostics>
You have written the following tracing code in your program:
static TraceSwitch traceSwitch = new TraceSwitch(
“TraceLevelSwitch”, “Trace the application”);
[Conditional(“DEBUG”)]
private void Method1()
{
Trace.WriteLineIf(
traceSwitch.TraceError, “Message 1”, “Message 2”);
}
[Conditional(“TRACE”)]
private void Method2()
{
Trace.WriteLine(“Message 3”);
}
private void btnCalculate_Click(object sender, System.
➥EventArgs e)
{
if(traceSwitch.TraceWarning){
Trace.WriteLine(“Message 10”);
Method1();
}
else{
Trace.WriteLineIf(traceSwitch.TraceInfo,
➥“Message 20”);
Method2();
}
if (traceSwitch.TraceError)
Trace.WriteLineIf(traceSwitch.TraceInfo,
➥“Message 30”);
Trace.WriteLineIf(traceSwitch.TraceVerbose,
➥“Message 40”);
}
Which tracing output will be generated when you run your program in Debug
mode and click the btnCalculate button?
❍ A.
Message
Message
Message
Message
10
1
2
30
406 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
B.
Message 10
Message 2: Message 1
Message 30
C.
Message
Message
Message
Message
10
2
30
40
D.
Message
Message
Message
Message
20
3
30
40
Question 6
You use Visual C# .NET to create an assembly named Tracker.dll. Tracker.dll contains classes for tracking a shipment and is used by several applications, including both managed applications and unmanaged COM applications. The COM
applications are already compiled and use late binding to invoke methods from
the assembly. What actions should you take to ensure that the assembly is properly deployed on the target machine? (Select all that apply.)
❑ A. Create a strong name for the assembly by using the Strong Name tool
(sn.exe).
❑ B. Register the assembly using the Assembly Registration tool
(regasm.exe).
❑ C. Create a type library for the application using the Type Library Exporter
tool (tlbexp.exe).
❑ D. Import the COM type library definition into an assembly by using the
Type Library Importer tool (tlbimp.exe).
❑ E. Deploy the assembly to the Global Assembly Cache (GAC).
❑ F. Deploy the assembly to the application’s installation directory.
❑ G. Deploy the assembly to the Windows system directory.
407
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 7
You use Visual C# .NET to develop an assembly that enables developers to create pie charts in their applications. You name an assembly as PieChart.dll and
package it as Version 1.0.0 for distribution over the Internet. After two months,
you discover that there is a bug in the assembly. You fix the bug by releasing a
new Version 1.0.1 of the assembly. You do not want other developers to recompile the applications that they built using Version 1.0.0 of PieChart.dll. You want
to make sure that when Version 1.0.1 of PieChart.dll is deployed, all existing
applications that use Version 1.0.0 start making use of Version 1.0.1 of the
assembly. You want to minimize efforts in deploying the new version of the
assembly. Which of the following steps should you take to deploy Version 1.0.1
of PieChart.dll?
❍ A. Modify the application configuration files of all the applications that
use Version 1.0.0 of the PieChart.dll assembly to now use Version
1.0.1 of the PieChart.dll assembly.
❍ B. Modify the machine configuration files to redirect the references for
Version 1.0.0 of the PieChart.dll assembly to Version 1.0.1 of the
PieChart.dll assembly.
❍ C. Deploy a publisher policy file to redirect the references for Version
1.0.0 of the PieChart.dll assembly to Version 1.0.1 of the PieChart.dll
assembly.
❍ D. Remove Version 1.0.0 of the PieChart.dll assembly and then deploy
Version 1.0.1 of the PieChart.dll assembly.
Question 8
You develop desktop applications for a large university. Your new project is to
write a Visual C# .NET application that enables professors to maintain the test
scores of students. You place a DataGrid control on the Windows form and bind
the data grid to a DataView object. You allow professors to make changes in the
data grid by adding new rows, by modifying existing rows, and by deleting existing rows. You now want to place a command button that allows professors to
view the deleted rows from the original data. How should you program the Click
event of the command button?
❍ A. In the event handler for the Click event, set the RowFilter property of
the DataView object to DataViewRowState.Deleted.
❍ B. In the event handler for the Click event, set the RowFilter property of
the DataView object to DataViewRowState.OriginalRows.
❍ C. In the event handler for the Click event, set the RowStateFilter property
of the DataView object to DataViewRowState.Deleted.
❍ D. In the event handler for the Click event, set the RowStateFilter property
of the DataView object to DataViewRowState.OriginalRows.
408 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 9
You need to debug a Windows application by using Visual Studio .NET installed
on your local machine. The Windows application is deployed on a remote server. When you attempt to debug the application, you get a DCOM configuration
error. Which of the following steps should you take to resolve this problem?
❍ A. Add your account to the Power Users group on the local computer.
❍ B. Add your account to the Power Users group on the remote computer.
❍ C. Add your account to the Debugger Users group on the local computer.
❍ D. Add your account to the Debugger Users group on the remote
computer.
Question 10
You develop a Windows forms application that displays a background image in
a form. Your application needs to comply with the Windows logo program. To
do so, you want your application to monitor for changes to the HighContrast
setting at runtime so that it can remove a background image from a form, if necessary. Which event must you trap?
❍ A. SystemEvents.UserPreferenceChanged
❍ B. Form.Paint
❍ C. SystemEvents.PaletteChanged
❍ D. Form.Load
Question 11
You develop a Windows form application using Visual C# .NET. A TextBox control on your Windows form should accept no more than three characters from
the user. However, your code might need to place the value Invalid in the
TextBox control. What value should you use for the MaxLength property of this
control?
❍ A. 3
❍ B. 4
❍ C. 7
❍ D. 8
409
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 12
You have created an array of Project objects named aProjects. Each Project
object has a Name property and a Number property. You want to display all of
the Name values in a ListBox control named lbProjects. Which code snippet
should you use for this purpose?
❍ A.
lbProjects.DataSource = aProjects;
lbProjects.ValueMember = Name;
❍ B.
lbProjects.DataSource = aProjects;
lbProjects.DisplayMember = Name;
❍ C.
lbProjects.DataSource = aProjects;
lbProjects.ValueMember = “Name”;
❍ D.
lbProjects.DataSource = aProjects;
lbProjects.DisplayMember = “Name”;
Question 13
You have created a custom component for your application that monitors a bidirectional parallel port for error messages. This component raises an event
named PortError whenever an error message is detected. At that point, you
must make the error code available to the control container. You want to use the
best coding practices. Which of the following options should you choose to
make the error code available to the container?
❍ A. Place the error code in a property of the component for the container
to retrieve it.
❍ B. Pass the error code as a parameter to the PortError event handler.
❍ C. Define a global variable in a separate class and place the value in that
variable.
❍ D. Define a custom PortErrorEventArgs class that inherits from the
EventArgs class to contain the error code, and pass an instance of the
class as a parameter of the PortError event.
410 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 14
You are developing a Windows form application that enables users to create network diagrams. You plan to use objects from the System.Drawing namespace
to draw shapes on a form at runtime. You have already determined that you will
draw these shapes during the form’s Paint event. You want to write minimum
code; how should you create the Graphics object required by the classes of the
System.Drawing namespace?
❍ A. Call the CreateGraphics method of the form.
❍ B. Retrieve the Graphics property of the PaintEventArgs object that is
passed to the event.
❍ C. Pass the handle of the form to the Graphics.FromHwnd method.
❍ D. Call the CreateGraphics method of the control that has the focus.
Question 15
You use Visual C# .NET to create a Windows forms application. You create a
form, Form1, and set its BackColor property to Red. You add a new form,
Form2, to the application by using visual inheritance to derive the new form
from Form1. You set Form2 to be the startup object for the application, and you
set its BackColor to Blue. After this, you change the BackColor of Form1 to
Yellow. When you run the application, what is the BackColor of Form2?
❍ A. Blue
❍ B. Red
❍ C. Yellow
❍ D. Control
411
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 16
You are creating a graphic application that will manipulate a variety of image formats. You have created an OpenFileDialog object in your program and have set
its Filter property as follows:
ofdPicture.Filter=”Image Files (BMP, GIF, JPEG, etc.)|”+
“*.bmp;*.gif;*.jpg;*.jpeg;*.png;*.tif;*.tiff|”+
“BMP Files (*.bmp)|*.bmp|”+
“GIF Files (*.gif)|*.gif|”+
“JPEG Files (*.jpg;*.jpeg)|*.jpg;*.jpeg|”+
“PNG Files (*.png)|*.png|”+
“TIF Files (*.tif;*.tiff)|*.tif;*.tiff|”+
“All Files (*.*)|*.*”;
You have created a Button with its text property set to “Open Image”. When you
click this button, you’ll display the OpenFileDialog to allow a selection. You want
BMP files to be the default choice in the dialog box. Which of the following values for FilterIndex property must you choose to achieve this in the event handler of Button control’s Click event?
❍ A. 0
❍ B. 1
❍ C. 2
❍ D. 3
412 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 17
Your Visual C# .NET application contains a Windows form that enables users to
delete multiple records from a database. You do not want the users to unintentionally delete the records. You develop a form named frmConfirm to get confirmation from the user. This form includes two Button controls, btnOK and
btnCancel. The DialogResult property of btnOK is set to OK, and the
DialogResult property of btnCancel is set to Cancel. Which code snippet should
you use to display frmConfirm and process the user’s choice?
❍ A.
frmConfirm frm = new frmConfirm();
frm.ShowDialog();
if(frm.DialogResult == DialogResult.OK)
{
// Delete the records
}
❍ B.
frmConfirm frm = new frmConfirm();
frm.Show();
if(frm.DialogResult == DialogResult.OK)
{
// Delete the records
}
❍ C.
frmConfirm frm = new frmConfirm();
frm.ShowDialog();
if(frm.btnOK.DialogResult == DialogResult.OK)
{
// Delete the records
}
❍ D.
frmConfirm frm = new frmConfirm();
frm.Show();
if(frm.btnOK.DialogResult == DialogResult.OK)
{
// Delete the records
}
413
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 18
You develop a Windows form application that enables users to generate shipping labels. The program needs to generate thousands of shipping labels each
day. You use the Trace object to monitor the application and log the results in
the Windows event log. You need to monitor errors, warnings, and other informational messages generated by the Trace object. You should have flexibility of
controlling the amount of information logged for your application, and you want
to do this with minimum administrative efforts. What should you do?
❍ A. Start the application using the /d:TRACE switch.
❍ B. Define an environment variable named TRACE and set its value to true
or false. In the program, check the value of the environment variable to
indicate the amount of information that you want for your application
to be logged.
❍ C. Declare a compilation constant named TRACE and set its value to
Error, Warning, or Info. In your program, use #if, #else, and #endif
directives to check the level of tracing that you want.
❍ D. Use the TraceSwitch class in your program, and use the
TraceSwitch.Level property to check whether you need to log the performance. Set the level of the TraceSwitch by using the application’s
configuration file.
Question 19
While you are debugging in Visual Studio .NET, you want to watch the value of
only those variables that are used in the current executing method. Which of the
following debugger windows is the easiest window to use to watch these variables?
❍ A. This
❍ B. Autos
❍ C. Locals
❍ D. Watch
414 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 20
You are performing final acceptance testing on your application before shipping
it. You have set a breakpoint inside the SelectedIndexChanged event handler for
a combo box. However, when you select a new value in this combo box, the
code in the event handler gets executed but does not stop at the breakpoint.
What could be the most likely problem?
❍ A. Selecting a value in a combo box does not fire the
SelectedIndexChanged event.
❍ B. You are executing the project using the default Release configuration.
❍ C. You have neglected to add the [Conditional(“DEBUG”)] attribute to the
event handler.
❍ D. You have neglected to add #const int DEBUGGING = 1 to the code.
Question 21
You are debugging a Windows form application that you wrote using Visual
Studio .NET. Your code uses the Trace class to produce the debugging output.
In which configuration(s) will this output be enabled?
❍ A. In the default Release configuration only.
❍ B. In the default Debug configuration only.
❍ C. In both the default Release configuration and the default Debug configuration.
❍ D. In neither the default Release configuration nor the default Debug configuration.
415
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 22
You need to develop a custom toolbar control that will be used by several
Windows applications to display application-specific tool buttons. You want this
control to be of same width as the form in which the control is hosted, and the
control should be displayed at the top of form. When the parent form is resized
or repositioned, the custom toolbar control should also be resized and repositioned accordingly. Which of the following answers should you choose to
accomplish this requirement?
❍ A. Create a property that enables the developers to set the Anchor property of the custom toolbar control and then set the default value of this
property to AnchorStyle.Top.
❍ B. Create a property that enables the developers to set the Dock property
of the custom toolbar control and then set the default value of this
property to DockStyle.Top.
❍ C. In UserControl_Load event handler, add the following code:
this.Anchor = AnchorStyle.Top;
❍ D. In UserControl_Load event handler, add the following code:
this.Dock = DockStyle.Top;
Question 23
You develop a Windows-based application using Visual C# .NET. The application
needs to display weather information for the ZIP code entered by the user. You
do not know how to determine the weather information yourself; therefore, you
choose to call a Web Service to provide this information in your application. You
know the URL of the asmx file published by the Web Service, but you do not
know any details of the Web Service’s interface. Which of the following action
should you take first to get information about the Web Service?
❍ A. Run the Web Service Discovery tool.
❍ B. Open the asmx file in a Web browser.
❍ C. Run the XML Schema Definition tool.
❍ D. Copy the .asmx file to your client project.
416 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 24
You create an ASP.NET Web Service project using Visual Studio .NET. The project includes a class named RefLibrary. The RefLibrary class contains this
method:
public String Version()
{
return “1.6”;
}
You note that you are able to instantiate the RefLibrary class from a Web Service
client project, but the Version method is not available. What could be the problem?
❍ A. Only properties can be part of the public interface of a Web service.
❍ B. You must mark the method with the WebService attribute.
❍ C. The methods of a Web Service can return only Object data.
❍ D. You must mark the method with the WebMethod attribute.
Question 25
The customer service representatives in your company often receive calls from
customers inquiring about the shipping status of their orders. You have been
assigned to create an application that assists the customer service representatives with easily finding the shipping status. You decide to create a Windowsbased application that calls the XML Web services provided by the shipping and
logistic company to retrieve the latest shipping status. When you test the application, the user of the application complains that the user interface of the application is very slow. You find that your program is waiting for the Web Service
call to execute. You need to design a solution that is most efficient. What should
you do to make your application responsive?
❍ A. Use the WaitHande.WaitAll method of the
IAsyncResult.AsyncWaitHandle object.
❍ B. Call the End method of the XML Web Service.
❍ C. Use the WaitHande.WaitAny method of the
IAsyncResult.AsyncWaitHandle object.
❍ D. Supply a callback delegate to the Begin method of the XML Web
Service. When the XML Web Service returns, a thread will invoke the
callback method from the thread pool.
417
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 26
Your company intends to ship a text-editing application to a variety of locales,
including the United States, France, Israel, China, and Japan. One of the features
of the application is searching for text within longer text passages. You have
been assigned to implement this feature using Visual C# .NET. What should you
use to perform this search?
❍ A. CultureInfo.CompareInfo
❍ B. Array.Sort
❍ C. String.IndexOf
❍ D. String.IndexOfAny
Question 27
You design a Windows service application using Visual Studio .NET. The service stores information related to computer uptime and page faults. Computers
in many countries will use this Windows service. When storing this information
for future analysis, which culture should you use?
❍ A. The Invariant culture
❍ B. The en-US culture
❍ C. The culture specified by Thread.CurrentThread.CurrentCulture
❍ D. A culture selected by the user
418 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 28
Your application contains the following resource files containing string
resources:
MyApp.resx
MyApp.fr.resx
MyApp.fr-FR.resx
MyApp.en.resx
MyApp.en-US.resx
The user executes the application on a computer running French (Canadian)
software, so the CurrentUICulture property is set to fr-CA. What will be the
result?
❍ A. The resources from MyApp.fr.resx will be used.
❍ B. The resources from MyApp.fr-FR.resx will be used.
❍ C. The resources from MyApp.en-US.resx will be used.
❍ D. An exception will be thrown.
Question 29
Your application performs various mathematical calculations. You are beginning
to sell this application in multiple countries. How should you ensure that the
correct numeric formatting is used in all cases?
❍ A. Allow the user to select a culture from a list. Create a CultureInfo
object based on the user’s selection, and assign it to the
Thread.CurrentThread.CurrentCulture property. Use the ToString
method to format numeric amounts.
❍ B. Accept the Thread.CurrentThread.CurrentCulture property, as it is set
when you run your application. Use the ToString method to format
numeric amounts.
❍ C. Prompt the user for a numeric format and store it in the Registry.
❍ D. Allow the user to select a numeric format from a list of supported formats.
419
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 30
You need to develop a graphics application using Visual C# .NET. Your application needs to draw images on the screen, and you are looking for a solution that
gives you the best performance. You have created several variations of a method
that draws an image. Which of the following methods would you choose for
your application?
❍ A.
public void DrawSampleImage(PaintEventArgs e)
{
Image newImage = Image.FromFile(“SampImag.jpg”);
Point ulCorner = new Point(100, 100);
e.Graphics.DrawImage(newImage, ulCorner);
}
❍ B.
public void DrawSampleImage(PaintEventArgs e)
{
Image newImage = Image.FromFile(“SampImag.jpg”);
int x = 100;
int y = 100;
e.Graphics.DrawImage(newImage, x, y);
}
❍ C.
public void DrawSampleImage(PaintEventArgs e)
{
Image newImage = Image.FromFile(“SampImag.jpg”);
Rectangle destRect = new Rectangle(100, 100, 450, 150);
e.Graphics.DrawImage(newImage, destRect);
}
❍ D.
public void DrawSampleImage(PaintEventArgs e)
{
Image newImage = Image.FromFile(“SampImag.jpg”);
float x = 100.0F;
float y = 100.0F;
e.Graphics.DrawImage(newImage, x, y);
}
420 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 31
Your application requires the capability to read and write to the Windows event
log to function properly. Which .NET security feature should you use to ensure
that your code has this capability?
❍ A. Role-based security
❍ B. Code access security
❍ C. Type safety
❍ D. Encryption
Question 32
Your Visual Studio .NET project contains the following API declaration:
[DllImport(“kernel32.dll”)]
public static extern int GetComputerName(String buffer,
ref uint size);
The project also contains code to use this API to display the computer name:
public static void ShowName()
{
String buf = “”;
UInt32 intLen=128;
Int32 intRet;
// Call the Win API method
intRet = GetComputerName(buf, ref intLen);
Console.WriteLine(“This computer is named “ +
buf.ToString());
}
Users report that no computer name is displayed. What should you do?
❍ A. Use the ref keyword with the variable buf in the call to the
GetComputerName function.
❍ B. Tell the user that the computers have no name set in their network
properties.
❍ C. Replace the use of the String object with a StringBuilder object in the
code.
❍ D. Use the out keyword with the variable buf in the call to the
GetComputerName function.
421
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 33
You are responsible for maintaining a COM component that numerous applications throughout your company use. You are not yet ready to migrate this COM
component to .NET–managed code, but you need to make it available to an
increasing number of other projects that are being developed under the .NET
Framework. You want to create the most efficient solution. What should you do?
❍ A. Set a direct reference to the existing COM component from each .NET
project.
❍ B. Use the Type Library Importer tool to create and sign an assembly that
will use the COM component. Place the COM component in the Global
Assembly Cache.
❍ C. Obtain a Primary Interop Assembly for the COM component.
❍ D. Set a direct reference from a single .NET project to the COM component. Include this project in each solution that must use the component.
Question 34
You are using the PrintDocument class to print a graphical banner that should
span multiple printed pages. However, only the first page of the banner prints.
What is the most likely cause of this problem?
❍ A. You have neglected to set PrintPageEventArgs.HasMorePages to true
when there are more pages to print.
❍ B. You have neglected to set a sufficiently large value for
PrintPageEventArgs.MarginBounds.Height.
❍ C. You have neglected to set a sufficiently large value for
PrintPageEventArgs.PageBounds.Height.
❍ D. You have called the Print method only once instead of once per page.
422 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 35
You are developing a Windows application that presents history lessons to the
students. If students who use this application have low vision, they will use the
application through a screen reader. You use a TextBox control to get the user’s
name. When the textbox control gets the focus, the screen reader must be able
to identify it and aid the user by speaking the word Name. Which property of the
control should you configure to fulfill this requirement?
❍ A. Name
❍ B. Text
❍ C. AccessibleName
❍ D. AccessibleRole
Question 36
You use Visual Studio .NET to develop a Windows application that queries data
from a SQL Server database. You use the SqlConnetion object to connect to the
database. As soon as the database operation is completed, you want to make
sure that any pending database transactions are rolled back and that connection
is returned to the connection pool. You need to reuse the same SqlConnection
object when your program needs to query the database again. Which of the following actions should you take?
❍ A. Call the Dispose method on the SqlConnection object.
❍ B. Call the destructor of the SqlConnection object.
❍ C. Call the Close method on the SqlConnection object.
❍ D. Set the SqlConnection object to null.
423
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 37
You use Visual Studio .NET to develop a Windows-based application. Your application is used to create and maintain product catalogs. You use a DataSet object
named dsCatalog to store the product data as users edit the information. When
the users save the catalog, you need to store the catalog in an XML file. The root
element of the resulting XML file should be <ProductInformation>. You intend
to use the DataSet.WriteXml method to save the catalog to an XML file. Which
of the following statements should you use to ensure that the correct XML root
element is written to the XML file?
❍ A.
dsCatalog.NameSpace = “ProductInformation”;
❍ B.
dsCatalog.Locale = “ProductInformation”;
❍ C.
dsCatalog.Prefix = “ProductInformation”;
❍ D.
dsCatalog.DataSetName = “ProductInformation”;
Question 38
You develop a Windows-based application that enables users to view and modify recently placed orders. Your application needs to display data from the
OrderHeader and OrderDetails data tables. Information from OrderHeader is displayed in a set of controls grouped in a GroupBox control; the information from
OrderDetails is displayed in a DataGrid. Your program must ensure that as soon
as a different order is selected in the GroupBox control, the DataGrid control displays the details corresponding to that order. Which of the following actions will
you take to implement this functionality?
❍ A. Define primary keys on the OrderHeader and OrderDetails tables.
❍ B. Create a foreign key constraint in the OrderDetails table.
❍ C. Add a DataRelation object to the Relations collection of the DataSet
object.
❍ D. Use the DataSet.Merge method.
424 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 39
You need to develop a Windows-based application named ProcessOrders. This
application receives XML data files from various customers, reads the files, and
stores them in a SQL Server database for further processing. The ProcessOrder
application uses an XML schema file to define the format and data types of the
XML data files. However, not all customers send the XML data file using the
same schema. Your application should parse the incoming data files to ensure
that they conform to the XML schema. Which of the following actions should
you take to accomplish this requirement?
❍ A. Implement an XmlDocument object to load the document. Pass the
schema file to this object to validate and parse the XML document.
❍ B. Implement an XmlValidatingReader object and program an event handler for the ValidationEventHandler event to parse the data file that
does not conform to the XML schema.
❍ C. Read the XML file into a DataSet object and set its EnforceConstraints
property to true.
❍ D. Read the XML file and schema into a DataSet object. Program the
DataSet.MergeFailed event handler to parse the data file that does not
conform to the XML schema.
Question 40
You are developing a Windows-based application to query product information
from a SQL Server database. The application specification requires that the
users of your application be able to search for a product by entering just the first
few characters. You store the characters entered by the user in a variable named
ProdName. Which of the following SQL statements should you use to retrieve
the data from the database?
❍ A.
sqlStatement = “SELECT Name, Description, Price FROM “ +
“Product WHERE Name IN ‘“ + ProdName + “%’”;
❍ B.
sqlStatement = “SELECT Name, Description, Price FROM “ +
“Product WHERE Name LIKE ‘“ + ProdName + “%’”;
❍ C.
sqlStatement = “SELECT Name, Description, Price FROM “ +
“Product WHERE Name IN ‘“ + ProdName + “*’”;
❍ D.
sqlStatement = “SELECT Name, Description, Price FROM “ +
“Product WHERE Name LIKE ‘“ + ProdName + “*’”;
425
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 41
Your Visual C# .NET application needs to read data from a SQL Server 6.5
database and write it to a flat file once every 12 hours. A legacy application
accesses this file to update its data. Because the data that you will read from
the database is huge, you want to retrieve the data with the least impact on the
server resources and optimize the performance as much as possible. Which
object should you use to load the data from the database?
❍ A. DataSet
❍ B. DataTable
❍ C. SqlDataReader
❍ D. OleDbDataReader
Question 42
Assembly CalculateTax is a member of the following code groups (and only the
following code groups):
Level
Code Group
Permission Set
Exclusive
LevelFinal
Property
Enterprise
All Code
Everything
No
No
Enterprise
Company Code
Internet
No
No
Machine
Restricted Code
LocalIntranet
No
Yes
User
Restricted
Components
Nothing
No
No
What permission does the CLR assign to Assembly CalculateTax?
❍ A. Everything
❍ B. Internet
❍ C. LocalIntranet
❍ D. Nothing
426 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 43
You allow users to edit product information on a DataGrid control that is bound
to a DataSet object. When the user clicks the Update button on the form, you
call the SqlDataAdapter.Update method to cause the changes from the DataSet
object to persist to the underlying database. Users report that new records and
updated rows are saved properly but that deleted rows are reappearing the next
time they run the application. What could be the problem?
❍ A. The users do not have permission to update the underlying table.
❍ B. The Update method does not delete rows.
❍ C. Someone is restoring an old version of the database between the two
executions of the program.
❍ D. You have failed to set the DeleteCommand property of the
SqlDataAdapter object.
Question 44
Your Visual C# .NET application reads an XML file from disk into an
XmlDocument object, and then it modifies some of the nodes in the document.
You need to write minimum code. Which object should you use to write the
modified XmlDocument object back to disk?
❍ A. XmlTextWriter
❍ B. XmlWriter
❍ C. StreamWriter
❍ D. BinaryWriter
❍ E. TextWriter
427
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 45
Your SQL Server database contains a table named Sales, with these columns:
SalesID (int, identity)
StoreNumber (int)
Sales (int)
You want to create a stored procedure that accepts as inputs the store number
and sales, inserts a new row in the table with this information, and returns the
new identity value. Which SQL statement should you use?
❍ A.
CREATE PROCEDURE procInsertSales
@StoreNumber int,
@Sales int,
@SalesID int
AS
INSERT INTO Sales (StoreNumber, Sales)
VALUES (@StoreNumber, @Sales)
SELECT @SalesID = @@IDENTITY
❍ B.
CREATE PROCEDURE procInsertSales
@StoreNumber int,
@Sales int,
@SalesID int OUTPUT
AS
INSERT INTO Sales (SalesID, StoreNumber, Sales)
VALUES (@SalesID, @StoreNumber, @Sales)
❍ C.
CREATE PROCEDURE procInsertSales
@StoreNumber int,
@Sales int,
@SalesID int OUTPUT
AS
INSERT INTO Sales (SalesID, StoreNumber, Sales)
VALUES (0, @StoreNumber, @Sales)
SELECT @SalesID = @@IDENTITY
❍ D.
CREATE PROCEDURE procInsertSales
@StoreNumber int,
@Sales int,
@SalesID int OUTPUT
AS
INSERT INTO Sales (StoreNumber, Sales)
VALUES (@StoreNumber, @Sales)
SELECT @SalesID = @@IDENTITY
428 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 46
Your application has two FileStream objects. The fsIn object is open for reading,
and the fsOut object is open for writing. Which code snippet would copy the
contents of fsIn to fsOut using a 2KB buffer?
❍ A.
Int32[] buf = new Int32[2048];
Int32 intBytesRead;
while((intBytesRead = fsIn.Read(buf, 0, 2048)) > 0)
{
fsOut.Write(buf, 0, intBytesRead);
}
//Clean up
fsOut.Flush();
fsOut.Close();
fsIn.Close();
❍ B.
Int32[] buf = new Int32[2048];
Int32 intBytesRead;
while((intBytesRead = fsIn.Read(buf, 0, 2048)) > 1)
{
fsOut.Write(buf, 0, intBytesRead);
}
//Clean up
fsOut.Flush();
fsOut.Close();
fsIn.Close();
❍ C.
Byte[] buf = new Byte[2048];
Int32 intBytesRead;
while((intBytesRead = fsIn.Read(buf, 0, 2048)) > 0)
{
fsOut.Write(buf, 0, intBytesRead);
}
//Clean up
fsOut.Flush();
fsOut.Close();
fsIn.Close();
❍ D.
Byte[] buf = new Byte[2048];
Int32 intBytesRead;
while((intBytesRead = fsIn.Read(buf, 0, 2048)) > 1)
{
fsOut.Write(buf, 0, intBytesRead);
}
//Clean up
fsOut.Flush();
fsOut.Close();
fsIn.Close();
429
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 47
You have designed a Windows application that will help users plan, manage, and
file their income taxes. Because this market is competitive, you want to list the
application in the Microsoft Windows catalog. Which of the following requirements must the application satisfy to be listed in the Windows catalog? (Select
all that apply.)
❑ A. Install to Program Files by default.
❑ B. Properly support Add/Remove Programs.
❑ C. Support AutoPlay for CDs and DVDs.
❑ D. Fix all known bugs in the software.
Question 48
You write a Windows-based application to search customer information from an
XML file. Your application recursively calls the FirstChild and NextChild methods
of XmlNode objects to visit every node in an XML file. When you find a node that
includes customer name information, you display the information on the form.
The application is not returning all the customer names from the file. What could
be the problem?
❍ A. The XML file is not well formed.
❍ B. The XML file has more than one root node.
❍ C. The customer name information is stored in XML attributes.
❍ D. The HasChildNodes property is not properly set on all nodes.
430 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 49
You are developing a Windows-based application for the purchasing department
of your company. The department needs to view, add, edit, and update the supplier information that is stored in a SQL Server database. You must make sure
that when the user updates a supplier record, the information is successfully
written to the database. Which of the following pairs of method calls should you
choose to update the database?
❍ A.
SqlDataTable.AcceptChanges();
SqlDataAdapter.Update(DataTable);
❍ B.
SqlDataAdapter.Update(DataTable);
SqlDataTable.AcceptChanges();
❍ C.
SqlDataTable.Reset();
SqlDataAdapter.Update(DataTable);
❍ D.
SqlDataAdapter.Update(DataTable);
SqlDataTable.Reset();
Question 50
You are developing a Windows-based application that retrieves data from a SQL
Server database to perform analysis of sales history. A large number of users
will use your application. The size of the sales history data is huge, and your
application needs to retrieve this data very quickly. Which of the following techniques would you use to get the maximum performance when retrieving data
from the SQL Server database in your Visual C# .NET application?
❍ A. Use the classes from the System.Data.OleDb namespace.
❍ B. Use the classes from the System.Data.SqlClient namespace.
❍ C. Use the XML Web Services to connect with the SQL Server database.
❍ D. Use COM components to retrieve the data from the SQL Server database.
431
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 51
You develop a Windows application named OrderManager that enables users to
enter new orders and make changes to the existing orders. The application
involves a DataTable named OrdersTable. The column OrderNumber defines a
primary key for the OrdersTable table. Which of the following segments of code
should you use to define a primary key for the OrdersTable in your Visual C#
.NET program?
❍ A.
DataColumn[] c = new DataColumn[1];
c[0] = t.Columns[“OrderNumber”];
OrdersTable.PrimaryKey = c;
❍ B.
OrdersTable.PrimaryKey = “OrdersNumber”;
❍ C.
OrdersTable.PrimaryKey.Add(t.Columns[“OrderNumber”]);
❍ D.
OrdersTable.PrimaryKey = t.Columns[“OrderNumber”];
Question 52
You develop a component using Visual C# .NET. Other applications will call this
component from the Internet. You want to minimize the chances of unintentional
damage that the component can do to the local computer. As a result, you want
to ensure that your code is not granted File I/O permissions. Which
SecurityAction action should you use with the FileIOPermissionAttribute declaration?
❍ A. SecurityAction.RequestMinimum
❍ B. SecurityAction.RequestOptional
❍ C. SecurityAction.Demand
❍ D. SecurityAction.RequestRefuse
432 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 53
You design a Visual C# .NET application that uses the following code to check
for membership in the Developers group:
private void frmSecure_Load(object sender, System.EventArgs
➥e)
{
// Get the current principal object
Windows Principal prin = Thread.CurrentPricipal;
// Determine whether the user is a developer
Boolean developer = prin.IsInRole(“Developers”);
// Display the results on the UI
if(developer)
lblMembership.Text = “You are in the Developers
➥group”;
else
lblMembership.Text = “You are not in the Developers
➥group”;
}
Users complain that the code erroneously reports that they are not in the
Developers group. What must you do to fix this problem?
❍ A. Use imperative security to make sure that your code has access to the
Windows environment variables.
❍ B. Create a WindowsIdentity object by using the
WindowsIdentity.GetCurrent method, and then use this object to construct the WindowsPrincipal object.
❍ C. Use the WindowsPrincipal.Name property to retrieve the user’s name,
and use that name to call the IsInRole method.
❍ D. Call AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.
WindowsPrincipal) to specify the authentication mode.
433
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 54
You are using code access security to verify that your application has permission to perform file I/O operations. As part of your testing procedure, you have
created a permission set that denies file I/O permissions. You have also created
a code group that uses a hash code membership condition to select your application’s executable assembly and assign the permission set to this code group.
You have set this code group to be an exclusive code group, and you have verified that your program cannot obtain file I/O permissions.
To continue development, you change the code group to use the Everything permission set and continue adding new code to your application. When you’re
ready to test the security features, you change back to the permission set without file I/O permissions. However, you find that your application cannot access
files, even though you have not changed the declarative security within the
application.
Why is your code capable of performing file I/O even though the code group
denies file I/O permissions?
❍ A. Changing code within your application changes its hash code, so it is
no longer a member of the code group.
❍ B. After you’ve assigned the Everything permission set to a code group,
the code group ignores attempts to set more restrictive permissions.
❍ C. The Exclusive property on a code group applies only when the code
group is first created.
❍ D. You must reboot your development computer to update the membership records of the code group.
Question 55
You have converted your application’s assembly files to native images using the
Native Image Generation tool (ngen.exe). Which of the following statement
holds true for your assemblies? (Select all that apply.)
❑ A. An application that uses a native assembly will run faster for the initial
run.
❑ B. An application using a native assembly will have consistently faster
performance compared to a JIT-compiled assembly.
❑ C. The native assemblies are portable. You should be able to use them on
any machine that has the CLR installed on it.
❑ D. The native assemblies can be used in debugging scenarios.
434 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 56
One of your colleagues is designing a Changed event for his control. He complains to you that his code behaves quite abnormally; it runs fine sometimes and
generates exceptions at other times. Part of his event-handling code is listed
here (line numbers are for reference purpose only):
01: public delegate void ChangedEventHandler(
object sender, ColorMixerEventArgs args);
02: public event ChangedEventHandler Changed;
03: protected virtual void OnChanged(
ColorMixerEventArgs e)
04: {
05:
//notify the object
06:
Changed(this, e);
07:}
Which of the following suggestions will solve his problem?
❍ A. The code in Line 6 should be replaced with the following:
if (ChangedEventHandler != null)
{
//notify that object
ChangedEventHandler(this, e);
}
❍ B. The code in Line 6 should be replaced with the following:
if (ChangedEventHandler != null)
{
//notify that object
Changed(this, e);
}
❍ C. The code in Line 6 should be replaced with the following:
if (Changed != null)
{
//notify that object
ChangedEventHandler(this, e);
}
❍ D. The code in Line 6 should be replaced with the following:
if (Changed != null)
{
//notify that object
Changed(this, e);
}
435
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Sample
. . . . Test
. . .#2.
Question 57
You are a programmer for a popular gaming software publishing company. The
company has recently designed a series of games using the .NET Framework.
All these new game applications share some components. Some of these components are shipped in the box with the application, and others are deployed
over the Internet. Which of the following commands will you use for these components before packaging them for deployment?
❍ A. Use sn.exe to sign the components.
❍ B. Use signcode.exe to sign the components.
❍ C. Use sn.exe followed by signcode.exe to sign your components
❍ D. Use signcode.exe followed by sn.exe to sign your components.
Question 58
When you install a Windows application on a target machine, you want to store
the Readme.txt file in the directory selected by the user to install the application.
You also want to create a shortcut for the Readme.txt file on the desktop of the
target machine. While creating a Setup project, which of the following actions
will you take in the File System Editor to achieve this? (Select all that apply.)
❑ A. Move the shortcut to the Readme.txt file from the application folder to
the user’s desktop in the file system on the target machine.
❑ B. Add the Readme.txt file to the Application Folder node of the file system on the target machine.
❑ C. Create a shortcut to the Readme.txt file in the Application Folder node
of the file system on the target machine.
❑ D. Add the Readme.txt file to the user’s desktop in the file system on the
target machine.
❑ E. Move the shortcut to the Readme.txt file from the user’s desktop to the
application folder in the file system on the target machine.
436 Chapter 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Question 59
You have developed a Windows application that assists users in maintaining
their timesheets. After successfully testing the application, you decide to deploy
the application on the users’ computers. You ask four users to install the application on their computers and provide feedback. Three users report that they are
able to create timesheets and are happy with the application’s performance.
However, the fourth user reports that she is getting an error message similar to
“The dynamic link library mscoree.dll could not be found.” Which of the following steps should you suggest that the user take to resolve this error message?
❍ A. Ask the user to copy all assemblies from the \bin folder to the Global
Assembly Cache.
❍ B. Ask the user to install the application after installing Internet Explorer
6.0.
❍ C. Ask the user to install the application after installing MDAC 2.7.
❍ D. Ask the user to install the application after installing the .NET
Framework.
Question 60
You use Visual C# .NET to develop a component named
ReplicateWarehouseData. This component replicates the data used by the
Warehousing application that is developed by the Warehouse Development team
of your company. The Warehouse Development team needs to deploy the
Warehousing application to its first three customers. How should it deploy the
application?
❍ A. The team should create a Merge module for the
ReplicateWarehouseData component.
❍ B. The team should create a Setup project to deploy the application and
should include the Merge module containing the component in the
Setup project.
❍ C. The team should copy the ReplicateWarehouseData component into
the directory of the Warehousing application.
❍ D. The team should create a Setup project to deploy the application that
contains the code for the component.
19
Answer Key for Sample
Test #2
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
438 Chapter 19
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Answer
Key
19. C
40. B
20. B
41. D
21. C
42. C
1. A and D
22. D
43. D
2. B
23. A
44. A
3. D
24. D
45. D
4. A
25. D
46. C
5. B
26. A
47. A, B, and C
6. A, B, and E
27. A
48. C
7. C
28. A
49. B
8. C
29. A
50. B
9. D
30. C
51. A
10. A
31. B
52. D
11. A
32. C
53. D
12. D
33. B
54. A
13. D
34. A
55. A and D
14. B
35. C
56. D
15. A
36. C
57. C
16. C
37. D
58. A, B, and C
17. A
38. C
59. D
18. D
39. B
60. C and D
Detailed Answers
1. The correct answers are A and D. The Debug and Trace classes share
the same Listeners collection. Therefore, you should add a listener
object either to the Trace.Listeners collection or to the
Debug.Listeners collection. Answer B is not correct because this solution will generate double entries in the event log. Answer C is not correct because the newly created listener object is not attached to the
Listeners collection of the Trace and Debug classes.
439
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Answer
. . . . .Key
. . for
. .Sample
. . . . Test
. . .#2.
2. The correct answer is B. The Assert method checks for the given con-
dition and generates an error when the condition evaluates to false.
Answer A is not correct because this code segment will generate an
error only when the value of TotalShipments is not equal to 0. Answers
C and D are not correct because the Debug.Assert method is invoked
only when the program is compiled using the Debug configuration.
3. The correct answer is D. You need to first create a filtered DataView
object from the Suppliers table and bind the DataView object to the
DataGrid. Answers A and C are not correct because they do not give
you objects that can be bound to the DataGrid control. Answer B is
not correct because although the solution works, retrieving the data
from the database for the second time is slower than filtering it from
the existing DataTable object.
4. The correct answer is A. The ApplyDefaultSort property is used to
automatically create a sort order, in ascending order, based on the primary key of the table. The ApplyDefaultSort property applies only
when the table has a primary key defined and the Sort property is a
null reference or an empty string. Answer B is not correct because you
want to sort using the primary key, and for that you should set the
ApplyDefaultSort property to true. Answer C is not correct because
you need to sort the data instead of filtering the data. Answer D is not
correct because the given code segment is incorrect; you must specify
the name of a column in the Sort property along with ASC (ascending)
or DESC (descending).
5. The correct answer is B. The XML file has the value for the
TraceLevelSwitch as 3, which sets the Level property as
TraceLevel.Info. Answers A, C, and D are incorrect because setting the
Level property as TraceLevel.Info will cause TraceError,
TraceWarning, and TraceInfo properties of the traceSwitch to be true.
Only the TraceVerbose property will evaluate to false. Also, the third
parameter to the WriteLineIf method is used to categorize the output
by placing its value after a colon (:) and then the trace message.
6. The correct answers are A, B, and E. Because multiple applications are
using this assembly, you need to install the assembly in the Global
Assembly Cache (GAC). To install the assembly into the GAC, you
also need to sign the assembly with a strong name. Finally, to enable
COM applications to use the assembly, you need to register the assembly in the Windows Registry. Answer C is not correct because the
COM applications need not be compiled. Answer D is not correct
because you do not need to use a COM DLL in a .NET application.
440 Chapter 19
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Answers F and G are not correct because shared assemblies should be
deployed in the GAC. When an assembly is registered in the Windows
Registry, COM applications can locate shared assemblies from the
GAC.
7. The correct answer is C. When you release a bug-fix type upgrade of
an assembly and you want calls to a particular version of an assembly to
be redirected to another version of the assembly, you should deploy a
publisher policy file with appropriate redirection information. Answer
A is not correct because configuring all existing application configuration files in each machine requires a lot of work. Answer B is not correct because modifying the machine configuration file for each
machine also requires a significant amount of effort. Answer D is not
correct because if you delete Version 1.0.0 of PieChart.dll, all the existing applications that refer to that DLL will fail to execute.
8. The correct answer is C. Setting the RowStateFilter property of the
DataView object to DataViewRowState.Deleted specifies that you want
to view the deleted rows from the original data. Answers A and B are
not correct because the RowFilter property is used to filter rows based
on an expression rather than their state. Answer D is not correct
because setting the RowStateFilter property to
DataViewRowState.OriginalRows displays the original data of all the
rows, including deleted rows.
9. The correct answer is D. If you get a DCOM configuration error
while debugging, you might not be a member of the Debugger Users
group on the remote machine. To resolve this, add your account on the
remote machine to the Debugger Users group. Answers A, B, and C
are not correct because to debug a program remotely using Visual
Studio .NET, you should be a member of the Debugger Users group
rather than the Power Users group on the remote computer, not the
local computer.
10. The correct answer is A. The UserPreferenceChanged event is raised
whenever the user changes display properties. You can check the
SystemInformation.HighContrast property in this event to determine
whether the user has selected High Contrast mode. Answer B is not
correct because the Paint event is fired whenever the form is redrawn.
Answer C is not correct because the SystemEvents.PaletteChanged
event occurs when the user switches to an application that uses a different palette. Answer D is not correct because the user might change the
display settings after loading the form.
441
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Answer
. . . . .Key
. . for
. .Sample
. . . . Test
. . .#2.
11. The correct answer is A. The MaxLength property has an effect only
on user input. It is not checked when you programmatically set the
value of a control. Answers B, C, and D are not correct because these
values allow users to enter more than three characters in the textbox.
12. The correct answer is D. To display values from an array in a ListBox
or a ComboBox, you set the DisplayMember property of the control to
a string containing the name of the field. Answers A and C are not correct because they use the ValueMember property instead of the
DisplayMember property. The ValueMember property is used to set
the value associated with the items in the ListBox or a ComboBox, but
this property is not displayed in the control. Answer B is not correct
because the property name of the data source must be specified as a
string.
13. The correct answer is D. Using a class derived from EventArgs to pass
event parameters is preferable to using individual arguments because
it’s more readily extended in case you need to pass additional parameters in the future. Answers A and C are not correct because eventrelated data should be passed as an argument to the event handler.
Answer B is not correct because, by convention, event handlers accept
only two arguments. The first event handler is the object that received
the event, and the second event handler is the object that contains the
event argument. According to good programming practices, classes for
event data should derive from the EventArgs class and should have
names ending with the suffix EventArgs.
14. The correct answer is B. Because the Graphics object is so frequently
needed during the Paint event, it is automatically passed to that event’s
handler. Therefore, the easiest way to retrieve a Graphics object from
the Paint event handler is through the Graphics property of the
PaintEventArgs argument. Answers A, C, and D are not correct
because you already have a Graphics object available through the Paint
event handler. Therefore, you need not write any additional code to
create another Graphics object.
15. The correct answer is A. When you run the application, the BackColor
of Form2 will be Blue. Answer B is not correct because when you
assign a value directly to the BackColor property of Form2, it overrides the inheritance from Form1. Answer C is not correct because
changes to the same property on Form1 do not have any effect on
Form2. Answer D is not correct because you have already modified the
BackColor property, and the default values of a form are no longer
applicable.
442 Chapter 19
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16. The correct answer is C. The filters in OpenFileDialog are numbered
starting at 1, rather than 0. Answers A and B are not correct because
setting the FilterIndex property to 0 or 1 will select the first filter from
the Filter property; therefore, it will set all image files as the default
setting. Answer D is not correct because this setting will set GIF files
as the default setting.
17. The correct answer is A. Answer B is not correct because to pause the
rest of the application while the user makes a choice, you should use
the ShowDialog method rather than the Show method to display the
form. Answers C and D are not correct because when the user clicks a
button on the form, the value of the DialogResult property of that button is assigned to the DialogResult property of the form. Therefore,
you should use the DialogResult property of the form to retrieve the
user’s choice.
18. The correct answer is D. The TraceSwitch class provides a multilevel
switch to control tracing output without recompiling your code.
Answer A is not correct because the /d:TRACE option just enables the
tracing; it does not allow multilevel control over tracing output.
Answer B is not correct because modifying environmental variables
requires much more administrative efforts when compared to a configuration file. Answer C is not correct because this option requires the
program to be recompiled each time the value of TRACE is modified.
19. The correct answer is C. The Locals window gives you the most con-
venient access because it automatically displays the names and values of
all the variables local to the current method under execution. Answer A
is not correct because the This window enables you to examine the
members associated with the current object. Answer B is not correct
because the Autos window displays only names and values of all variables in the current statement and the previous statement rather than
the current method. Answer D is not correct because you need to add
variables explicitly to the Watch window.
20. The correct answer is B. Breakpoints and other debugging features are
not enabled in the default Release configuration. Answer A is not correct because selecting a value from the combo box does fire the
SelectedIndexChanged event. Answer C is not correct because the
Conditional attribute will include or exclude the method from compilation but as stated in the question, the method does get executed.
Answer D is not correct because no data type needs to be specified
with the #const declaration to enable debugging.
443
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Answer
. . . . .Key
. . for
. .Sample
. . . . Test
. . .#2.
21. The correct answer is C. Answers A, B, and D are incorrect because
the TRACE symbol is defined in both the default Debug configuration
and the default Release configuration. Only the DEBUG symbol is
defined in the default Debug configuration.
22. The correct answer is D. When a control is docked to an edge of its
container, it is always repositioned against that edge when the container is resized. Answers A and C are not correct because anchoring the
control will not resize the toolbar and reposition it to the top edge of
the form. Answer B is not correct because the question does not
require other developers to set the Dock property.
23. The correct answer is A. The Web Service Discovery tool uses the
information in the asmx file to locate the other important files for the
Web Service, including the WSDL file that specifies the Web Service’s
interface. Answer B is not correct because opening the file in the Web
browser enables you only to test the Web Service providing information about simple data types. The Web browser cannot provide the full
interface of the Web service. Answer C is not correct because the XML
Schema Definition tool is used to generate schema or classes from the
XML and XSD files. Therefore, this tool is of no help for the .asmx
file. Answer D is not correct because you need to know the interface of
the Web Service to call its Web methods; copying the .asmx file to
your client project will not be of any help.
24. The correct answer is D. Adding the WebMethod attribute to a public
method makes it callable from remote Web clients. Answer A is not
correct because methods can be part of the public interface of a Web
Service. Answer B is not correct because the WebService attribute is
applied to the Web Service class, not Web methods. Answer C is not
correct because Web Service methods can return any data type.
25. The correct answer is D. Using the callback is the most efficient way
to manage use of your threads because the callback methods do not
block threads while waiting for the response. Answers A and C are not
correct because the WaitHandle.WaitAll or WaitAny methods will
block the thread until the Web service calls have completed. Answer B
is not correct because the End method will not return until the asynchronous operation is complete because this method uses the
IAsyncResult.AsyncWaitHandle to check for Web Service completion.
26. The correct answer is A. Only the CompareInfo object will correctly
handle the search in all character sets, including those that use 2 bytes
per character. Answer B is not correct because Array.Sort does not
locate substrings. Answers C and D are not correct because the
444 Chapter 19
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
String.IndexOf and String.IndexOfAny methods can find substrings
but are not culture-aware.
27. The correct answer is A. The Invariant culture provides a culture-neu-
tral storage format for information that will not be directly displayed to
an end user but that might need to be used in many different locales.
Answers B, C, and D are not correct because these answers are specific
to a particular culture.
28. The correct answer is A. The application will use resources from the
MyApp.fr.resx file. Answers B and C are not correct because the application specifically searches for the fr-CA culture instead of the fr-FR or
en-US cultures. Answer D is not correct because if resources from a
specific culture are not found, the .NET Framework will fall back to
using resources from the appropriate neutral culture—in this case, the
fr culture.
29. The correct answer is A. You should allow the user to select a culture
from a list. Answer B is not correct; allowing the user to choose a culture is better than accepting the existing culture of the application
because the user might be running on a version of Windows that’s not
appropriate for his culture. Answers C and D are not correct because
there’s no need to prompt for or store a numeric format when all necessary formats are stored in the .NET Framework.
30. The correct answer is C. Answer C gives the best performance because
it specifies the destination size of the image, thereby avoiding any
autoscaling of the image. Answers A, B, and D are not correct because,
in the absence of information about the destination size of the image,
the DrawImage method needs to perform extra processing; therefore,
the image is drawn slowly.
31. The correct answer is B. When you want to check whether a code has
a particular privilege, you need to perform code access security. Answer
A is not correct because the application requires access to the event log
regardless of who is using the application. Answers C and D are not
correct because type safety and encryption do not relate to the event
log.
32. The correct answer is C. In the PInvoke calls, you should use a
StringBuilder object instead of the String object to hold the return
value. Answers A and D are not correct because the declaration of the
method does not include the ref or out keywords. Answer B is not correct because all computers are identified by a name on the network.
445
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Answer
. . . . .Key
. . for
. .Sample
. . . . Test
. . .#2.
33. The correct answer is B. Using the Type Library Importer tool enables
you to place the RCW assembly in the GAC so that all projects on the
computer can share it. Answers A and D are not correct because the
component is being used by multiple projects and, therefore, should be
placed in the GAC. Answer C is not correct because a Primary Interop
Assembly is used for code from other vendors, not for your own code.
34. The correct answer is A. You need to set
PrintPageEventArgs.HasMorePages to true in the PrintPage event
when there are more pages to be printed in the current print job.
Answers B and C are not correct because if this had been the case, all
printed pages would have been affected instead of only the first page.
Answer D is not correct because there is no need to call a separate
Print method to print every page of the document.
35. The correct answer is C. The AccessibleName property is used to set
the name that is used by accessibility applications such as a screen
reader. Answers A and B are not correct because they are not used by
the accessibility applications. Answer D is not correct because the
AccessibleRole property is used to specify a role for an accessible
object instead of the name.
36. The correct answer is C. When you use the Close method of a
SqlConnection object, the connection is closed, all pending database
transactions are rolled back, and the connection is returned back to the
connection pool. Answer A is not correct because reusing an instance
after you have called the Dispose method can result in undesirable
effects. In general, you should use Close rather than Dispose if you
might want to reuse the connection instance. Answer B is not correct
because you should generally call the destructor only when you need to
release unmanaged resources. Answer D is not correct because setting
the SqlConnection object to null will not actually close the connection;
the object will continue to exist in memory, waiting for garbage collection.
37. The correct answer is D. The DataSetName property of a DataSet
object sets the name of the DataSet. The value of this property is rendered as the root element of the XML file. Answer A is not correct
because the Namespace property specifies the namespace of the
DataSet object. Answer B is not correct because the Locale property
specifies the culture information to be used for string comparison within the tables. Answer C is not correct because the Prefix property specifies an XML prefix that is used as an alias for the namespace of the
DataSet object.
446 Chapter 19
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38. The correct answer is C. A DataRelation is used to relate two
DataTable objects to each other. Answers A and B are not correct
because just defining primary keys or foreign keys on the table will not
relate the tables. Answer D is not correct because the DataSet.Merge
method is used to merge two DataSet objects, which is not a requirement in this case.
39. The correct answer is B. The XmlValidatingReader object enables you
to validate an XML document. You use its ValidationEventHandler
event to set an event handler for receiving information about the
schema validation errors. Answer A is not correct because the
XmlDocument object cannot validate the XML document on its own.
Answer C is not correct because the EnforeceConstraints property of
the DataSet is used to specify whether the database constraint rules are
followed when attempting any update operation. Answer D is not correct because the DataSet.MergeFailed event occurs only when a target
and source DataRow have the same primary key value, and
EnforceConstraints is set to true.
40. The correct answer is B. The LIKE clause determines whether a given
character string matches a specified pattern. You use the % character
to work as the wildcard character. Answer A is not correct because you
need to use the LIKE clause instead of the IN clause for pattern
searching. Answers C and D are not correct because you need to use %
as the wildcard character for matching instead of the * character.
41. The correct answer is D. OleDbDataReader enables you to read the
data one row at a time in a forward-only fashion; therefore, it occupies
less memory and improves performance of your application. The question requires you to read the data in a sequential fashion and write it to
the flat file; the OldDbDataReader object is the best option. Answer A
is not correct because a DataSet object loads all of the retrieved data in
the memory. Answer B is not correct because you cannot retrieve the
data directly in a DataTable object. Answer C is not correct because
the SqlDataReader object is optimized to work with SQL Server 7.0
and later versions.
42. The correct answer is C. Within the Enterprise level, the permission
set granted to the CalculateTax assembly is the union of all the permission sets of code groups on the Enterprise level to which it belongs—
that is, the All Code and Company Code groups. Therefore,
CalculateTax receives the Everything permission at the Enterprise
level. At the Machine level, the assembly is a member of only the
Restricted Code group and thus receives the LocalIntranet permission.
447
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Answer
. . . . .Key
. . for
. .Sample
. . . . Test
. . .#2.
Because the code group on the Machine level is marked with the
LevelFinal property, the code group on the User level is not taken into
account when determining the permission set for this assembly. Now
to determine the permission set granted to the CalculateTax assembly,
you need to determine the intersection of all the permission sets of the
levels applicable to the assembly. Therefore, the assembly is granted
LocalIntranet permission, the intersection of Everything and
LocalIntranet permissions. Answer A is not correct because Everything
is the permission set for only the Enterprise level. Answer B is not correct because Inter is the permission set for the code originating from
the Internet. Answer D is not correct because the User level is not
taken into account because the LevelFinal property is Yes for the
Machine level.
43. The correct answer is D. Because other operations on the database,
such as add and update, are working fine, chances are good that the
DeleteCommand property is not set. The DeleteCommand property
should be set to a command that deletes rows from the database.
Answers A and C are not correct because if that was the case, none of
the changes would be saved. Answer B is not correct because the
Update method updates the underlying database with the changes
made to the DataSet.
44. The correct answer is A. The XmlTextWriter object is specially
designed to write XML files. Answer B is not correct because the
XmlWriter is an abstract class and must be implemented before you
call methods from it. Answers C, D, and E are not correct because
when you use these objects, you have to write additional code for the
XML structure.
45. The correct answer is D. Answer A is not correct because it does not
indicate that @SalesID is an output parameter. Answers B and C are
not correct because they attempt to insert values into the identity column rather than let SQL Server assign the new value.
46. The correct answer is C. The Read method returns the number of
bytes read, so answers B and D fail when there is 1 byte in the file. The
Read method reads to a byte array, so answers A and B fail because the
buffer has the wrong data type.
47. The correct answers are A, B, and C. To be listed in the Windows cat-
alog, an application must meet the requirements mentioned in the
specifications of the Windows logo program. Answer D is not correct
because you are not required to fix all known bugs to be listed in the
Windows catalog.
448 Chapter 19
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48. The correct answer is C. By default, XML attributes do not appear as
part of the XmlNodes collections that are traversed by the FirstChild
and NextChild methods. Answers A and B are not correct because if
that was the case, you would not be able to load the file into an
XmlDocument object. Answer D is incorrect because HasChildNodes
is automatically set by the .NET Framework.
49. The correct answer is B. When an application calls the Update
method, the SqlDataAdapter object examines the RowState property
and executes the required InsertCommand, UpdateCommand, or
DeleteCommand statements iteratively for each row of the data. After
the changes are written to the database, you need to call the
DataTable.AcceptChanges method to remove the deleted rows and set
the RowState property of the added and modified rows to Unchanged.
Answer A is not correct because if you first call the AcceptChanges
method, the RowState for all the added and modified rows will be
marked Unchanged and all the deleted rows will be removed. Later,
when you call the Update method, the SqlDataAdapter object will not
be capable of updating the database because the RowState property of
the rows will be Unchanged. Answers C and D are not correct because
the Reset method restores the DataTable to its original state and the
updates made to the table are lost in the DataTable object.
50. The correct answer is B. The classes in the System.Data.SqlClient
namespace provide the best performance when working with SQL
Server data because these classes can communicate with the SQL
Server database directly using the SQL Server tabular data stream
(TDS) packets. Answer A is not correct because the classes in the
System.Data.OleDb namespace call a set of COM components (an
OLE DB provider), which constructs the TDS packets to communicate with the SQL Server. Answer C is not correct because XML Web
Services will have a lot of additional overhead when compared to a
direct connection to the SQL Server database. Answer D is not correct
because calling COM components involves an extra COM-Interop
layer and slows down the operation.
51. The correct answer is A. The PrimaryKey property of the DataTable
object specifies an array of column(s) that function as primary keys for
the data table. Answer B is not correct because the data type of the
PrimaryKey property is not String. Answer C is not correct because
the PrimaryKey property does not provide an Add method. Answer D
is not correct because even if the PrimaryKey is a single column, an
array of DataColumn must be used with the PrimaryKey property.
449
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Answer
. . . . .Key
. . for
. .Sample
. . . . Test
. . .#2.
52. The correct answer is D. SecurityAction.RequestRefuse ensures that
permissions that might be misused will not be granted to the calling
code. Answers A, B, and C are not correct because these settings are
used to request permissions instead of refuse permissions.
53. The correct answer is D. You must tell the CLR how users are authen-
ticated, even when you are using a Windows application that automatically employs Windows authentication. Answers A, B, and C are not
correct because they do not specify the authentication mode.
54. The correct answer is A. The hash codes are calculated from the MSIL
code of an assembly, so changing the assembly’s content changes its
hash code. Answers B, C, and D are simply incorrect.
55. The correct answers are A and D. The native assemblies will load
faster for the first time because the ngen.exe has already done the work
that the JIT compiler will do when executing the application for the
first time. The ngen.exe tool also provides a /debug switch that can be
used to generate native assemblies for debugging scenarios. Answer B
is not correct because, for subsequent execution, the native assemblies
would show the same performance as the JIT-compiled equivalent.
Answer C is not correct because the natively generated assemblies are
processor specific and are not portable across different processor architectures.
56. The correct answer is D. The OnChange method invokes the Changed
event to notify all registered objects about the event. If the Changed
object is null, no delegate objects have been registered with this event.
On the other hand, if the Changed object is not null, the call to
Changed event will invoke the registered event handlers. Answers A, B,
and C are not correct because the name of the event is Changed rather
than ChangedEventHandler.
57. The correct answer is C. Because the components are being used
among several games published by your company, they are good candidates to be placed in the Global Assembly Cache of the target
machine. Before a component can be placed in the GAC, however, it
must be signed using a Strong Name tool (sn.exe). Your company is
also deploying software over the Internet; in this case, it is a good idea
to digitally sign your code with a software publisher’s certificate
obtained by a respected certification authority. When you obtain the
certificate, you can use signcode.exe to sign your component. When
you are using both sn.exe and signcode.exe with your assembly, you
should always use sn.exe before using signcode.exe. Answers A and B
are not correct because you need to use both of the tools instead of just
450 Chapter 19
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
one of them. Answer D is not correct because sn.exe should be used
before signcode.exe.
58. The correct answers are A, B, and C. To copy the Readme.txt file to
the installation directory selected by the user at install time, you would
add it to the application folder in the file system on the target machine.
To create a shortcut, you first create a shortcut to the Readme.txt file
stored in the application folder in the file system on the target
machine. Then you move this shortcut from the application folder to
the user’s desktop in the file system on the target machine. Answer D is
not correct because you need to place a shortcut on the user’s desktop
instead of the file itself. Answer E is not correct because the
Readme.txt file is originally present in the application folder instead of
the user’s desktop.
59. The correct answer is D. The mscoree.dll file is the core file of the
Common Language Runtime. If the user is getting the specified error
message, the most likely reason is that the .NET Framework is not
installed or is not properly installed on the user’s computer. Answer A
is not correct because a similar installation is working on other computers. Answers B and C are not correct because mscoree.dll is not a
part of Internet Explorer 6.0 or MDAC 2.7, and reinstalling those
applications will not resolve the problem.
60. The correct answers are C and D. The Warehousing application is the
only application using the component. Therefore, you should copy the
component to the Warehousing application. You can now create a
Setup project to deploy the application and component. Answers A and
B are not correct because the Merge Module projects are used to create reusable setup components.
A
Microsoft Certification
Exams
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Taking an exam is not something that most people anticipate eagerly, no
matter how well prepared they might be. In most cases, familiarity helps offset test anxiety. In plain English, this means that you probably won’t be as
nervous when you take your fourth or fifth Microsoft certification exam as
you’ll be when you take your first one.
Whether it’s your first exam or your tenth, understanding the details of taking the new exam (how much time to spend on questions, the environment
you’ll be in, and so on) and the new exam software will help you concentrate
on the material rather than on the setting. Likewise, mastering a few basic
exam-taking skills should help you recognize (and perhaps even outfox) some
of the tricks and snares you’re bound to find in some exam questions.
This chapter explains the exam environment and software, and describes
some proven exam-taking strategies that you can use to your advantage.
Assessing Exam-Readiness
I strongly recommend that you read through and take the Self-Assessment
included with this book (it appears after the introduction in this book). This
will help you compare your knowledge base to the requirements for obtaining a Microsoft Certified Application Developer (MCAD) or Microsoft
Certified Solution Developer (MCSD) for Microsoft .NET certification,
and it will also help you identify parts of your background or experience that
need improvement, enhancement, or further learning. If you get the right set
of basics under your belt, obtaining Microsoft certification will be that much
easier.
452 Appendix A
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
After you’ve gone through the Self-Assessment, you can remedy topical areas
in which your background or experience is lacking. You can also tackle subject matter for individual tests at the same time, so you can continue making
progress while you’re catching up in some areas.
After you’ve worked through an Exam Cram, have read the supplementary
materials, and have taken the practice test, you’ll have a pretty clear idea of
when you should be ready to take the real exam. Although I strongly recommend that you keep practicing until your scores top the 75% mark, 80% is a
better goal because it gives some margin for error when you are in an actual, stressful exam situation. Keep taking practice tests and studying the materials until you attain that score. You’ll find more pointers on how to study
and prepare in the Self-Assessment. But now, on to the exam itself.
What to Expect at the Testing
Center
When you arrive at the testing center where you scheduled your exam, you
must sign in with an exam coordinator and show two forms of identification,
one of which must be a photo ID. When your time slot arrives, you’ll be
asked to deposit any books, bags, cell phones, and other items you brought
with you. Then you’ll be escorted into a closed room.
All exams are completely closed-book. Although you are not permitted to
take anything with you into the testing area, you are furnished with a few
blank sheets of paper and a pen (in some cases, an erasable plastic sheet and
a marker). Immediately before entering the testing center, try to memorize
as much of the important material as you can so that you can write that
information on the blank sheet as soon as you are seated in front of the computer. You can refer to this piece of paper during the test, but you’ll have to
surrender the sheet when you leave the room. Because your timer does not
start until you begin the testing process, it is best to do this first while the
information is still fresh in your mind.
You will have some time to compose your thoughts and write down
information on the paper you’re given. When you are ready, the exam coordinator will load the appropriate Microsoft certification exam (such as, Exam
70-316), and you’ll be permitted to start.
All Microsoft certification exams allow a certain maximum amount of time in
which to complete your work (this time is indicated on the exam by an
onscreen counter/clock, so you can check the time remaining whenever you
453
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Microsoft
. . . . . .Certification
. . . . . . Exams
. . . .
like). All Microsoft certification exams are computer-generated. In addition
to multiple-choice questions, you may encounter select–and-place (dragand-drop), create-a-tree (categorization and prioritization), drag-andconnect, and build-list-and-reorder (list-prioritization) questions on many
exams. The questions are constructed to check your development skills using
Microsoft Visual C# .NET and Visual Studio .NET. Often you’ll be asked to
give more than one answer to a question. You also might be asked to select
the best or most effective solution to a problem from a range of choices, all
of which are technically correct.
Exam Layout and Design: New Case
Study Format
The format of Microsoft exams can vary. For example, many exams consist
of a series of case studies, with six types of questions regarding each presented case. Other exams might have the same six types of questions but no complex multiquestion case studies.
For the Design exams, each case study presents a detailed problem that you
must read and analyze. Figure A.1 shows an example of what a case study
looks like. You must select the different tabs in the case study to view the
entire case.
Figure A.1 This is a typical case study.
Following each case study is a set of questions related to the case study.
These questions can be one of six types (which are discussed next). Careful
attention to details provided in the case study is the key to success. Be prepared to toggle frequently between the case study and the questions as you
work. Some of the case studies also include diagrams (called exhibits) that
you’ll need to examine closely to understand how to answer the questions.
454 Appendix A
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
After you complete a case study, you can review all of the questions and your
answers. However, when you move on to the next case study, you cannot
return to the previous case study or make any changes.
Following are the six types of question formats:
➤ Multiple choices, single answer
➤ Multiple choices, multiple answers
➤ Build, list, and reorder (list prioritization)
➤ Create a tree
➤ Drag and connect
➤ Select and place (drag and drop)
Exam formats could vary by test center location. You might want to call the test center to see if you can find out which type of test you’ll encounter. Some exams are
offered in both forms on a random basis, which cannot be predetermined.
Multiple-Choice Question Format
Some exam questions require you to select a single answer, whereas others
ask you to select multiple correct answers. The following multiple-choice
question requires you to select a single correct answer. Following the question is a brief summary of each potential answer and why it is either right or
wrong.
Question 1
You have three domains connected to an empty root domain under one contiguous domain name: tutu.com. This organization is formed into a forest
arrangement with a secondary domain called frog.com. How many Schema
Masters exist for this arrangement?
❍ A. 1
❍ B. 2
❍ C. 3
❍ D. 4
Answer A is correct. Only one Schema Master is necessary for a forest
arrangement. The other answers (B, C, and D) are misleading because you
455
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Microsoft
. . . . . .Certification
. . . . . . Exams
. . . .
are led to believe that Schema Masters may be in each domain or that you
should have one for each contiguous domain namespace.
This sample question format corresponds closely to the Microsoft
Certification Exam format (of course, questions are not followed by answer
keys on the exam). To select an answer, you position the cursor over the radio
button next to the answer and click the mouse button to select the answer.
Let’s examine a question in which one or more answers are possible. This
type of question provides check boxes rather than radio buttons (circles) for
marking all appropriate selections.
Question 2
How can you seize FSMO roles? (Check all correct answers.)
❑ A. The ntdsutil.exe utility
❑ B. The Replication Monitor
❑ C. The secedit.exe utility
❑ D. Active Directory domains and trusts
Answers A and B are correct. You can seize FSMO roles from a server that is
still running through the Replication Monitor, or, in the case of a server failure, you can seize roles with the ntdsutil.exe utility. The secedit.exe utility is
used to force Group Policies into play; therefore, answer C is incorrect.
Active Directory domains and trusts are a combination of truth and fiction;
therefore, answer D is incorrect.
For this particular question, two answers are required. Microsoft sometimes
gives partial credit for partially correct answers. For question 2, you have to
check the boxes next to answers A and B to obtain credit for a correct answer.
Notice that picking the right answers also means knowing why the other
answers are wrong.
Build-List-and-Reorder Question Format
Questions in the build-list-and-reorder format present two lists of items: one
on the left and one on the right. To answer the question, you must move
items from the list on the right to the list on the left. The final list must then
be reordered into a specific order.
These questions are usually in the form, “From the following list of choices,
pick the choices that answer the question. Arrange the list in a certain order.”
456 Appendix A
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
To give you practice with this type of question, some questions of this type
are included in this study guide. Here’s an example of how they appear in this
book; for a sample of how they appear on the test, see Figure A.2.
Figure A.2 This is how build-list-and-reorder questions appear.
Question 3
From the following list of famous people, pick those that have been elected
President of the United States. Arrange the list in the order in which they served.
Thomas Jefferson
Ben Franklin
Abe Lincoln
George Washington
Andrew Jackson
Paul Revere
The correct answer is:
George Washington
Thomas Jefferson
Andrew Jackson
Abe Lincoln
457
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Microsoft
. . . . . .Certification
. . . . . . Exams
. . . .
On an actual exam, the entire list of famous people would initially appear in
the list on the right. You would move the four correct answers to the list on
the left and then reorder the list on the left. Notice that the answer to the
question did not include all items from the initial list. However, this might
not always be the case.
To move an item from the right list to the left list, first select the item by
clicking it and then clicking the Add button (left arrow). After you move an
item from one list to the other, you can move the item back by first selecting
the item and then clicking the appropriate button (either the Add button or
the Remove button). After items have been moved to the left list, you can
reorder the list by selecting an item and clicking the up or down button.
Create-a-Tree Question Format
Questions in the create-a-tree format also present two lists: one on the left
and one on the right. The list on the right consists of individual items, and
the list on the left consists of nodes in a tree. To answer the question, you
must move items from the list on the right to the appropriate node in the
tree.
These questions are basically a matching exercise. Items from the list on the
right are placed under the appropriate category in the list on the left. Here’s
an example of how they appear in this book; for a sample of how they appear
on the test, see Figure A.3.
Question 4
The calendar year is divided into four seasons:
Winter
Spring
Summer
Fall
Identify the season when each of the following holidays occurs:
Christmas
Fourth of July
Labor Day
Flag Day
Memorial Day
Washington’s Birthday
Thanksgiving
Easter
458 Appendix A
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The correct answer is:
Winter
Christmas
Washington’s Birthday
Spring
Flag Day
Memorial Day
Easter
Summer
Fourth of July
Labor Day
Fall
Thanksgiving
In this case, all of the items in the list were used. However, this might not
always be the case.
To move an item from the right list to its appropriate location in the tree,
you must first select the appropriate tree node by clicking it. Then you select
the item to be moved and click the Add button. If one or more items have
been added to a tree node, the node is displayed with a + icon to the left of
the node name. You can click this icon to expand the node and view whatever was added. If any item has been added to the wrong tree node, you can
remove it by selecting it and clicking the Remove button (see Figure A.3).
Drag-and-Connect Question Format
Questions in the drag-and-connect format present a group of objects and a
list of “connections.” To answer the question, you must move the appropriate connections between the objects.
This type of question is best described using graphics. Here’s an example.
459
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Microsoft
. . . . . .Certification
. . . . . . Exams
. . . .
Figure A.3 This is how create-a-tree questions appear.
Question 5
The following objects represent the different states of water:
Ice
Water Vapor
Water
Steam
Use items from the following list to connect the objects so that they are scientifically correct.
Sublimates to form
Freezes to form
Evaporates to form
Boils to form
Condenses to form
Melts to form
The correct answer is:
460 Appendix A
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
For this type of question, it’s not necessary to use every object, but each connection can be used multiple times by dragging the answer to multiple locations. Dragging an answer away from its position removes it.
Select-and-Place Question Format
Questions in the select-and-place (drag-and-drop) format present a diagram
with blank boxes and a list of labels that must be dragged to fill in the blank
boxes. To answer the question, you must move the labels to their appropriate positions on the diagram.
This type of question is best described using graphics. Here’s an example.
Question 6
Place the items in their proper order, by number, on the following flowchart.
Some items may be used more than once, and some items may not be used at
all.
1. [Place here]
5. All requirements are met;
a dial-up connection is
allowed for the client.
Yes
No
Access Denied
Deny
Allow
2. [Place here]
Deny
3. [Place here]
Allow
Policy Conditions
Account Conditions
Policy Permissions
Account Profile
Account Permissions
Policy Profile
The correct answer is:
4. [Place here]
461
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Microsoft
. . . . . .Certification
. . . . . . Exams
. . . .
Microsoft’s Testing Formats
Currently, Microsoft uses four different testing formats:
➤ Case study
➤ Fixed length
➤ Adaptive
➤ Short form
As mentioned earlier, the case study approach is used with many of the newer
Microsoft exams. These exams consist of a set of case studies that you must
first analyze to answer questions related to the case studies. Such exams
include one or more case studies (tabbed topic areas), each of which is followed by 4 to 10 questions. The question types for exams will be: multiple
choice; build, list, and reorder; create a tree; drag and connect; and select and
place. Depending on the test topic, some exams are totally case-based,
whereas others are not.
Other Microsoft exams employ advanced testing capabilities that might not
be immediately apparent. Although the questions that appear are primarily
multiple-choice, the logic in fixed-length tests, which use a fixed sequence
of questions, is more complex than that in older Microsoft tests. Some
questions employ a sophisticated user interface (which Microsoft calls a
simulation) to test your knowledge of particular software and systems in a
simulated “live” environment that behaves just like the original. The Testing
Innovations
article
at
www.microsoft.com/TRAINCERT/mcpexams/faq/
innovations.asp includes a downloadable series of demonstrations and
samples.
462 Appendix A
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
For some exams, Microsoft has turned to a well-known technique, called
adaptive testing, to establish a test-taker’s level of knowledge and product
competence. Adaptive exams look the same as fixed-length exams, but they
determine the level of difficulty at which an individual test-taker can correctly answer questions. Test-takers with differing levels of knowledge or
ability see different sets of questions; individuals with high levels of knowledge or ability are presented with a smaller set of more difficult questions,
whereas individuals with lower levels of knowledge are presented with a larger set of easier questions. Two individuals may answer the same percentage
of questions correctly, but the test-taker with a higher knowledge or ability
level scores higher because his or her questions are weighted more heavily.
Also, lower-level test-takers might answer more questions than more knowledgeable colleagues. This explains why adaptive tests use ranges of values to
define the number of questions and the amount of time needed to complete
the tests.
Adaptive tests work by evaluating the test-taker’s most recent answer. A correct answer leads to a more difficult question (also raising the test software’s
estimate of the test-taker’s knowledge and ability level). An incorrect answer
leads to a less difficult question (also lowering the test software’s estimate of
the test-taker’s knowledge and ability level). This process continues until the
test targets the test-taker’s true ability level. The exam ends when the testtaker’s level of accuracy meets a statistically acceptable value (in other words,
when his or her performance demonstrates an acceptable level of knowledge
and ability) or when the maximum number of items has been presented (in
which case, the test-taker is almost certain to fail).
Microsoft also introduced a short-form test for its most popular tests. This
test consists of 25 to 30 questions, with a time limit of exactly 60 minutes.
This type of exam is similar to a fixed-length test because it allows readers to
jump ahead or return to earlier questions and to cycle through the questions
until the test is done. Microsoft does not use adaptive logic in this test; it
claims that statistical analysis of the question pool is such that the 25 to 30
questions delivered during a short-form exam conclusively measure a testtaker’s knowledge of the subject matter in much the same way as an adaptive
test. The short-form test is like a “greatest hits exam” version (that is, the
most important questions are covered) of an adaptive exam on the same
topic.
Some of the Microsoft exams might contain a combination of adaptive and fixedlength questions.
463
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Microsoft
. . . . . .Certification
. . . . . . Exams
. . . .
Because you won’t know in which form the Microsoft exam will be, you
should be prepared for an adaptive exam instead of a fixed-length or a shortform exam. The penalties for answering incorrectly are built into the test
itself on an adaptive exam, whereas the layout remains the same for a fixedlength or short-form test, no matter how many questions you answer incorrectly.
The biggest difference between adaptive tests and fixed-length or short-form tests
is that you can mark and revisit questions on fixed-length or short-form tests after
you’ve read them. On an adaptive test, you must answer the question when it is presented and cannot go back to that question later.
Strategies for Different Testing
Formats
Before you choose a test-taking strategy, you must determine what type of
test it is: case study, fixed length, short form, or adaptive.
➤ Case-study tests consist of a tabbed window that allows you to navigate
easily through the sections of the case.
➤ Fixed-length tests consist of 50 to 70 questions with a check box. You
can return to these questions if you want.
➤ Short-form tests have 25 to 30 questions with a check box. You can
return to these questions if you want.
➤ Adaptive tests are identified in the introductory material of the test.
They have no check box and can be visited (and answered) only once.
Some tests contain a variety of testing formats. For example, a test might
start with a set of adaptive questions, followed by fixed-length questions.
You’ll be able to tell for sure whether you are taking an adaptive, fixed-length, or
short-form test by the first question. Fixed-length or short-form tests include a
check box that allows you to mark the question for later review. Adaptive test questions include no such check box and can be visited (and answered) only once.
Case Study Exam Strategy
Most test-takers find that the case study type of exam is the most difficult to
master. When it comes to studying for a case study test, your best bet is to
464 Appendix A
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
approach each case study as a standalone test. The biggest challenge you’ll
encounter is that you’ll feel that you won’t have enough time to get through
all of the cases that are presented.
Each case provides a lot of material that you’ll need to read and study before you
can effectively answer the questions that follow. The trick to taking a case study
exam is to first scan the case study to get the highlights. Make sure you read the
overview section of the case so that you understand the context of the problem at
hand. Then quickly move on and scan the questions.
As you are scanning the questions, make mental notes to yourself or notes on your
paper so that you’ll remember which sections of the case study you should focus
on. Some case studies might provide a fair amount of extra information that you
don’t really need to answer the questions. The goal with this scanning approach is
to avoid having to study and analyze material that is not completely relevant.
When studying a case, read the tabbed information carefully. It is important
to answer each and every question. You will be able to toggle back and forth
from case to questions, and from question to question within a case testlet.
However, after you leave the case and move on, you might not be able to
return to it. I suggest that you take notes while reading useful information to
help you when you tackle the test questions. It’s hard to go wrong with this
strategy when taking any kind of Microsoft certification test.
Fixed-Length and Short-Form Exam
Strategy
A well-known principle when taking fixed-length or short-form exams is first
to read through the entire exam from start to finish. Answer only those questions that you feel absolutely sure you know. On subsequent passes, you can
dive into more complex questions more deeply, knowing how many such
questions you have left and the amount of time remaining.
There’s at least one potential benefit to reading the exam completely before answering the trickier questions: Sometimes information supplied in later questions sheds
more light on earlier questions. At other times, information that you read in later
questions jogs your memory about facts, figures, or behavior that helps you answer
earlier questions. Either way, you’ll come out ahead if you answer only those questions on the first pass that you’re absolutely confident about.
Fortunately, the Microsoft exam software for fixed-length and short-form
tests makes the multiple-visit approach easy to implement. At the top-left
corner of each question is a check box that permits you to mark that question for a later visit.
465
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Microsoft
. . . . . .Certification
. . . . . . Exams
. . . .
Here are some question-handling strategies that apply to fixed-length and
short-form tests. Use them if you have the chance:
➤ When returning to a question after your initial read-through, read every
word again; otherwise, your mind can miss important details. Sometimes
revisiting a question after turning your attention elsewhere lets you see
something you missed, but the strong tendency is to see what you’ve
seen before. Try to avoid that tendency at all costs.
➤ If you return to a question more than twice, try to articulate to yourself
what you don’t understand about the question, why answers don’t appear
to make sense, or what appears to be missing. If you chew on the subject
awhile, your subconscious might provide the missing details, or you
might notice a “trick” that points to the right answer.
As you work your way through the exam, another counter that Microsoft
provides comes in handy—the number of questions completed and questions
outstanding. For fixed-length and short-form tests, it’s wise to budget your
time by making sure that you’ve completed roughly one quarter of the questions one quarter of the way through the exam period, and three quarters of
the questions three quarters of the way through.
If you’re not finished when only five minutes remain, use that time to guess
your way through any remaining questions. Remember, guessing is potentially more valuable than not answering. Blank answers are always wrong, but
a guess might turn out to be right. If you don’t have a clue about any of the
remaining questions, pick answers at random or choose all A’s, B’s, and so on.
Questions left unanswered are counted as answered incorrectly, so a guess is
better than nothing at all.
At the very end of your exam period, you’re better off guessing than leaving questions unanswered.
Adaptive Exam Strategy
If there’s one principle that applies to taking an adaptive test, it’s “Get it right
the first time.” You cannot elect to skip a question and move on to the next
one when taking an adaptive test because the testing software uses your
answer to the current question to select whatever question to present next.
You also cannot return to a question because the software gives you only one
chance to answer the question. You can, however, take notes as you work
466 Appendix A
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
through the test. Sometimes information supplied in earlier questions might
help you answer later questions.
Also, when you answer a question correctly, you are presented with a more
difficult question next, to help the software gauge your level of skill and ability. When you answer a question incorrectly, you are presented with a less
difficult question, and the software lowers its current estimate of your skill
and ability. This continues until the program settles into a reasonably accurate estimate of what you know and can do.
The good news is that if you know the material, you’ll probably finish most
adaptive tests in 30 minutes or so. The bad news is that you must really know
the material well to do your best on an adaptive test. That’s because some
questions are so convoluted, complex, or hard to follow that you’re bound to
miss one or two, at a minimum. Therefore, the more you know, the better
you’ll do on an adaptive test, even accounting for the occasionally strange or
unfathomable questions that appear on these exams.
Because you can’t always tell in advance if a test is fixed length, short form, adaptive, or a combination, you should prepare for the exam as if it were adaptive. That
way, you will be prepared to pass, no matter what kind of test you take. If the test
turns out to be fixed length or short form, remember the tips from the preceding
section, which will help you improve on what you could do on an adaptive test.
If you encounter a question on an adaptive test that you can’t answer, you
must guess an answer quickly. (However, you might suffer for your guess on
the next question if you guess correctly because the software will give you a
more difficult question next!)
Question-Handling Strategies
For questions that have only one right answer, usually two or three of the
answers will be obviously incorrect, and two of the answers will be plausible.
Unless the answer leaps out at you (if it does, reread the question to look for
a trick—sometimes those are the ones you’re most likely to get wrong), begin
the process of answering by eliminating those answers that are most obviously wrong.
At least one answer out of the possible choices for a question can usually be
eliminated immediately because it matches one of these conditions:
➤ The answer does not apply to the situation.
➤ The answer describes a nonexistent issue, an invalid option, or an imagi-
nary state.
467
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Microsoft
. . . . . .Certification
. . . . . . Exams
. . . .
After you eliminate all answers that are obviously wrong, you can apply your
retained knowledge to eliminate further answers. Look for items that sound
correct but refer to actions, commands, or features that are not present or
not available in the situation that the question describes.
If you’re still faced with a blind guess among two or more potentially correct
answers, reread the question. Try to picture how each of the possible remaining answers would alter the situation. Be especially sensitive to terminology;
sometimes the choice of words (remove instead of disable) can make the difference between a right answer and a wrong one.
You should guess at an answer only after you’ve exhausted your ability to
eliminate answers and are still unclear about which of the remaining possibilities is correct. An unanswered question offers you no points, but guessing
gives you at least some chance of getting a question right; just don’t be too
hasty when making a blind guess.
If you’re taking a fixed-length or a short-form test, you can wait until the last round of
reviewing marked questions (just as you’re about to run out of time or unanswered
questions) before you start making guesses. You will usually have the same option
within each case study testlet (but when you leave a testlet, you might not be allowed
to return to it). If you’re taking an adaptive test, you’ll have to guess to move on to the
next question if you can’t figure out an answer some other way. Either way, guessing
should be your technique of last resort!
Numerous questions assume that the default behavior of a particular utility
is in effect. If you know the defaults and understand what they mean, this
knowledge will help you cut through many Gordian knots. Simple “final”
actions might be critical as well. If a utility must be restarted before proposed
changes take effect, a correct answer might require this step as well.
Mastering the Inner Game
In the final analysis, knowledge gives confidence, and confidence breeds success. If you study the materials in this book carefully and review all of the
practice questions at the end of each chapter, you should become aware of
those areas in which additional learning and study are required.
After you’ve worked your way through the book, take the practice exam in
the back of the book. Taking this test provides a reality check and helps you
identify areas to study further. Make sure you follow up and review materials related to the questions you miss on the practice exam before scheduling
a real exam. Don’t schedule your exam appointment until after you’ve thoroughly studied the material and feel comfortable with the whole scope of the
468 Appendix A
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
practice exam. You should score 80% or better on the practice exam before
proceeding to the real thing (otherwise, obtain some additional practice tests
so you can keep trying until you hit this magic number).
Armed with the information in this book and with the determination to augment your knowledge, you should be able to pass the certification exam.
However, you need to work at it, or you’ll spend the exam fee more than
once before you finally pass. If you prepare seriously, you should do well.
The next section covers other sources you can use to prepare for the
Microsoft Certification Exams.
Additional Resources
A good source of information about Microsoft Certification Exams comes
from Microsoft itself. Because its products and technologies—and the exams
that go with them—change frequently, the best place to go for exam-related
information is online.
If you haven’t already visited the Microsoft Certified Professional site, do so
right now. The MCP home page resides at www.microsoft.com/traincert (see
Figure A.4).
Figure A.4 The Microsoft Certified Professional Training and Certification home page.
469
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Microsoft
. . . . . .Certification
. . . . . . Exams
. . . .
Coping with Change on the Web
Sooner or later, all of the information I’ve shared with you about the Microsoft Certified
Professional pages and the other Web-based resources mentioned throughout the rest of this
book will go stale or be replaced by newer information. In some cases, the URLs you find here
might lead you to their replacements; in other cases, the URLs will go nowhere, leaving you
with the dreaded “404 File not found” error message. When that happens, don’t give up.
There’s always a way to find what you want on the Web if you’re willing to invest some time
and energy. Most large or complex Web sites (such as the Microsoft site) offer a search facility. On all of Microsoft’s Web pages, a Search button appears along the top edge of the page.
You can also use search engines such as www.google.com to quickly find the information
that you are looking for. In fact, Google has a special page (www.google.com/
microsoft) that enables you to search Microsoft-related resources on the Web.
B
What’s on the CD-ROM
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
472 Appendix B
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
This appendix is a brief rundown of what you’ll find on the CD-ROM that
comes with this book. For a more detailed description of the PrepLogic
Practice Tests, Preview Edition exam simulation software, see Appendix C,
“Using the PrepLogic Practice Tests, Preview Edition Software.” In addition to
the PrepLogic Practice Tests, Preview Edition, the CD-ROM includes the electronic version of the book in Portable Document Format (PDF), several utility and application programs, and a complete listing of test objectives and
where they are covered in the book. Finally, a pointer list to online pointers
and references are added to this CD. You will need a computer with Internet
access and a relatively recent browser installed to use this feature.
PrepLogic Practice Tests, Preview Edition
PrepLogic is a leading provider of certification training tools. Trusted by
certification students worldwide, we believe PrepLogic is the best practice
exam software available. In addition to providing a means of evaluating your
knowledge of the Exam Cram material, PrepLogic Practice Tests, Preview
Edition features several innovations that help you to improve your mastery of
the subject matter.
For example, the practice tests allow you to check your score by exam area
or domain to determine which topics you need to study more. Another feature allows you to obtain immediate feedback on your responses in the form
of explanations for the correct and incorrect answers.
PrepLogic Practice Tests, Preview Edition exhibits most of the full functionality
of the Premium Edition but offers only a fraction of the total questions. To get
the complete set of practice questions and exam functionality, visit
PrepLogic.com and order the Premium Edition for this and other challenging
exam titles.
Again, for a more detailed description of the PrepLogic Practice Tests, Preview
Edition features, see Appendix C.
Exclusive Electronic Version of Text
The CD-ROM also contains the electronic version of this book in Portable
Document Format (PDF). The electronic version comes complete with all
figures as they appear in the book. You will find that the search capabilities
of the reader comes in handy for study and review purposes.
473
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .What’s
. . . .on. the
. . CD-ROM
. . . . .
Easy Access to Online Pointers and
References
The Suggested Reading section at the end of each chapter in this Exam
Cram contains numerous pointers to Web sites, newsgroups, mailing lists,
and other online resources. To make this material as easy to use as possible,
we include all this information in an HTML document entitled “Online
Pointers” on the CD. Open this document in your favorite Web browser to
find links you can follow through any Internet connection to access these
resources directly.
C
Using the PrepLogic
Practice Tests,
Preview Edition Software
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
476 Appendix C
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
This Exam Cram includes a special version of PrepLogic Practice Tests—a
revolutionary test engine designed to give you the best in certification exam
preparation. PrepLogic offers sample and practice exams for many of today’s
most in-demand and challenging technical certifications. This special
Preview Edition is included with this book as a tool to use in assessing your
knowledge of the Exam Cram material, while also providing you with the
experience of taking an electronic exam.
This appendix describes in detail what PrepLogic Practice Tests, Preview Edition
is, how it works, and what it can do to help you prepare for the exam. Note
that although the Preview Edition includes all the test simulation functions of
the complete, retail version, it contains only a single practice test. The
Premium Edition, available at PrepLogic.com, contains the complete set of challenging practice exams designed to optimize your learning experience.
Exam Simulation
One of the main functions of PrepLogic Practice Tests, Preview Edition is exam
simulation. To prepare you to take the actual vendor certification exam,
PrepLogic is designed to offer the most effective exam simulation available.
Question Quality
The questions provided in the PrepLogic Practice Tests, Preview Edition are
written to the highest standards of technical accuracy. The questions tap the
content of the Exam Cram chapters and help you to review and assess your
knowledge before you take the actual exam.
Interface Design
The PrepLogic Practice Tests, Preview Edition exam simulation interface provides you with the experience of taking an electronic exam. This enables you
to effectively prepare yourself for taking the actual exam by making the test
experience a familiar one. Using this test simulation can help to eliminate the
sense of surprise or anxiety you might experience in the testing center
because you will already be acquainted with computerized testing.
Effective Learning Environment
The PrepLogic Practice Tests, Preview Edition interface provides a learning
environment that not only tests you through the computer, but also teaches
the material you need to know to pass the certification exam. Each question
477
. . . . . . . . . . . . . . . .Using
. . . the
. . PrepLogic
. . . . . .Practice
. . . . Tests,
. . . .Preview
. . . . Edition
. . . . Software
. . . . .
comes with a detailed explanation of the correct answer and often provides
reasons the other options are incorrect. This information helps to reinforce
the knowledge you already have and also provides practical information you
can use on the job.
Software Requirements
PrepLogic Practice Tests requires a computer with the following:
➤ Microsoft Windows 98, Windows Me, Windows NT 4.0, Windows 2000,
or Windows XP
➤ A 166MHz or faster processor is recommended
➤ A minimum of 32MB of RAM
➤ As with any Windows application, the more memory, the better your per-
formance
➤ 10MB of hard drive space
Installing PrepLogic Practice Tests,
Preview Edition
Install PrepLogic Practice Tests, Preview Edition by running the setup program
on the PrepLogic Practice Tests, Preview Edition CD. Follow these instructions
to install the software on your computer:
1. Insert the CD into your CD-ROM drive. The Autorun feature of
Windows should launch the software. If you have Autorun disabled,
click the Start button and select Run. Go to the root directory of the CD
and select setup.exe. Click Open, and then click OK.
2. The Installation Wizard copies the PrepLogic Practice Tests, Preview
Edition files to your hard drive; adds PrepLogic Practice Tests, Preview
Edition to your Desktop and Program menu; and installs test engine
components to the appropriate system folders.
Removing PrepLogic Practice Tests,
Preview Edition from Your Computer
If you elect to remove the PrepLogic Practice Tests, Preview Edition product
from your computer, an uninstall process has been included to ensure that it
478 Appendix C
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
is removed from your system safely and completely. Follow these instructions to remove PrepLogic Practice Tests, Preview Edition from your
computer:
1. Select Start, Settings, Control Panel.
2. Double-click the Add/Remove Programs icon.
3. You are presented with a list of software currently installed on your com-
puter. Select the appropriate PrepLogic Practice Tests, Preview Edition title
you wish to remove. Click the Add/Remove button. The software is then
removed from you computer.
Using PrepLogic Practice Tests, Preview
Edition
PrepLogic is designed to be user friendly and intuitive. Because the software
has a smooth learning curve, your time is maximized, as you will start practicing almost immediately. PrepLogic Practice Tests, Preview Edition has two
major modes of study: Practice Test and Flash Review.
Using Practice Test mode, you can develop your test-taking abilities, as well
as your knowledge through the use of the Show Answer option. While you
are taking the test, you can reveal the answers along with a detailed explanation of why the given answers are right or wrong. This gives you the ability
to better understand the material presented.
Flash Review is designed to reinforce exam topics rather than quiz you. In
this mode, you will be shown a series of questions, but no answer choices.
Instead, you will be given a button that reveals the correct answer to the
question and a full explanation for that answer.
Starting a Practice Test Mode Session
Practice Test mode enables you to control the exam experience in ways that
actual certification exams do not allow:
➤ Enable Show Answer Button—Activates the Show Answer button, allowing
you to view the correct answer(s) and a full explanation for each question
during the exam. When not enabled, you must wait until after your exam
has been graded to view the correct answer(s) and explanation(s).
479
. . . . . . . . . . . . . . . .Using
. . . the
. . PrepLogic
. . . . . .Practice
. . . . Tests,
. . . .Preview
. . . . Edition
. . . . Software
. . . . .
➤ Enable Item Review Button—Activates the Item Review button, allowing
you to view your answer choices, marked questions, and facilitating navigation between questions.
➤ Randomize Choices—Randomize answer choices from one exam session to
the next; makes memorizing question choices more difficult, therefore
keeping questions fresh and challenging longer.
To begin studying in Practice Test mode, click the Practice Test radio button
from the main exam customization screen. This will enable the options
detailed above.
To your left, you are presented with the options of selecting the pre-configured
Practice Test or creating your own Custom Test. The pre-configured test has
a fixed time limit and number of questions. Custom Tests allow you to configure the time limit and the number of questions in your exam.
The Preview Edition included with this book includes a single pre-configured
Practice Test. Get the compete set of challenging PrepLogic Practice Tests
at PrepLogic.com and make certain you’re ready for the big exam.
Click the Begin Exam button to begin your exam.
Starting a Flash Review Mode Session
Flash Review mode provides you with an easy way to reinforce topics covered in the practice questions. To begin studying in Flash Review mode, click
the Flash Review radio button from the main exam customization screen.
Select either the pre-configured Practice Test or create your own Custom
Test.
Click the Best Exam button to begin your Flash Review of the exam questions.
Standard PrepLogic Practice Tests, Preview
Edition Options
The following list describes the function of each of the buttons you see.
Depending on the options, some of the buttons will be grayed out and inaccessible or missing completely. Buttons that are accessible are active. The
buttons are as follows:
480 Appendix C
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
➤ Exhibit—This button is visible if an exhibit is provided to support the
question. An exhibit is an image that provides supplemental information
necessary to answer the question.
➤ Item Review—This button leaves the question window and opens the Item
Review screen. From this screen you will see all questions, your answers,
and your marked items. You will also see correct answers listed here when
appropriate.
➤ Show Answer—This option displays the correct answer with an explana-
tion of why it is correct. If you select this option, the current question is
not scored.
➤ Mark Item—Check this box to tag a question you need to review further.
You can view and navigate your Marked Items by clicking the Item Review
button (if enabled). When grading your exam, you will be notified if you
have marked items remaining.
➤ Previous Item—This option allows you to view the previous question.
➤ Next Item—This option allows you to view the next question.
➤ Grade Exam—When you have completed your exam, click this button to
end your exam and view your detailed score report. If you have unanswered or marked items remaining you will be asked if you would like to
continue taking your exam or view your exam report.
Time Remaining
If the test is timed, the time remaining is displayed on the upper right corner of the application screen. It counts down the minutes and seconds
remaining to complete the test. If you run out of time, you will be asked if
you want to continue taking the test or if you want to end your exam.
Your Examination Score Report
The Examination Score Report screen appears when the Practice Test mode
ends—as the result of time expiration, completion of all questions, or your
decision to terminate early.
This screen provides you with a graphical display of your test score with a
breakdown of scores by topic domain. The graphical display at the top of the
screen compares your overall score with the PrepLogic Exam Competency
Score.
481
. . . . . . . . . . . . . . . .Using
. . . the
. . PrepLogic
. . . . . .Practice
. . . . Tests,
. . . .Preview
. . . . Edition
. . . . Software
. . . . .
The PrepLogic Exam Competency Score reflects the level of subject competency required to pass this vendor’s exam. While this score does not directly translate to a passing score, consistently matching or exceeding this score
does suggest you possess the knowledge to pass the actual vendor exam.
Review Your Exam
From Your Score Report screen, you can review the exam that you just completed by clicking on the View Items button. Navigate through the items
viewing the questions, your answers, the correct answers, and the explanations for those answers. You can return to your score report by clicking the
View Items button.
Get More Exams
Each PrepLogic Practice Tests, Preview Edition that accompanies your Exam
Cram contains a single PrepLogic Practice Test. Certification students
worldwide trust PrepLogic Practice Tests to help them pass their IT certification exams the first time. Purchase the Premium Edition of PrepLogic
Practice Tests and get the entire set of all new challenging Practice Tests for
this exam. PrepLogic Practice Tests—Because You Want to Pass the First
Time.
Contacting PrepLogic
If you would like to contact PrepLogic for any reason, including information
about our extensive line of certification practice tests, we invite you to do so.
Please contact us online at http://www.preplogic.com.
Customer Service
If you have a damaged product and need a replacement or refund, please call
the following phone number:
800-858-7674
Product Suggestions and Comments
We value your input! Please email your suggestions and comments to the following address:
feedback@preplogic.com
482 Appendix C
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
License Agreement
YOU MUST AGREE TO THE TERMS AND CONDITIONS OUTLINED IN THE END USER LICENSE AGREEMENT (“EULA”)
PRESENTED TO YOU DURING THE INSTALLATION PROCESS.
IF YOU DO NOT AGREE TO THESE TERMS DO NOT INSTALL
THE SOFTWARE.
Glossary
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
access control The process of
restricting access to functionality
based on role or assigned permissions.
accessibility Coding that makes
your application usable by those
with disabling conditions.
ActiveX controls Components
developed using earlier Microsoft
development languages such as
Visual Basic and Visual C++,
designed to run in the Web browser and in desktop applications.
ad-hoc query An SQL query
that is executed immediately.
ADO.NET A set of classes,
which are part of the .NET
Framework, for integrating .NET
applications and Web services with
relational databases and other data
sources.
Anchor property A control
property used to link the control to
a position on its form.
Application class A class that
provides static methods and properties for managing an application.
assembly A logical grouping of
files sharing a single Assembly
Manifest.
Assembly Manifest File that
includes the metadata for an
assembly.
Authenticode A type of digital
signature supported by a thirdparty certificate authority (CA)
such as VeriSign or Thawte.
Autos One of the program state
windows used during debugging to
provide information on the variables within the current and previous statements.
aximp.exe The Windows Forms
ActiveX Control Importer
(aximp.exe), a command-line utility
that can be used to encapsulate
ActiveX components within objects
of the AxHost wrapper class.
484 backing store
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
backing store A place where you
can store a file.
BeginPrint event Occurs before
the first page of a print job is printed by invoking the Print method of
the PrintDocument.
BinaryReader class A class from
the System.IO namespace that
reads primitive data types as binary
values, using a specified encoding.
BinaryWriter class A class within the System.IO namespace that
allows writing the primitive data
types to the output stream in binary format.
bootstrapper An element that
can be used to preinstall the
Windows Installer utility before
installing a deployed .msi package.
bottom-up testing A testing
approach that begins testing at the
unit level and then tests increasing
levels of integration.
breakpoint Causes code execution to pause when encountered.
Brush class A class used with the
Fill methods of the Graphics class
to specify the pattern or color used
to fill the shapes.
CAB (cabinet files) A redistributable file that can be used to
deploy an application. An application can be broken into several
cabinet files to limit the maximum
size per file, allowing distribution
using small-capacity media such as
floppy disks.
Call Stack window One of the
program state windows used during
debugging to display the path
through which program execution
reached the current point within
the code.
catch block Block used to provide error-handling capability over
the defined region of code within a
try block. catch blocks are evaluated until a matching condition is
reached. Unhandled exceptions fire
an UnhandledException event.
CausesValidation property
When set to false, this property
allows a control to act without firing the Validating and Validated
event of the control that currently
has focus, so that user assistance
controls can act to provide information without requiring the user
to leave the control that currently
has the focus.
character encodings A set of
characters and their associated
numerical values.
CheckBox control A control
that allows basic selection of on/off
(two-state) or on/off/indeterminate
(three-state) status.
CheckedListBox control An
extension of the ListBox and
CheckBox controls, allowing selection to be performed using check
boxes for each item.
class A construct that has associated attributes and methods.
485
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CurrentCulture
. . . . . . . . property
. . . . .
CloseMainWindow method
Method that can be used with
applications that have a user interface, equivalent to clicking the
Close button.
component An object that
encapsulates both data and code,
and provides a well-specified set of
publicly available services.
code group A set of assemblies
that share a security context.
container Can contain other
objects, such as controls or components.
code-access security Manages
the security of .NET source code
itself, ensuring that permissions are
verified before the code executes.
Code-access security involves permissions for code group access.
control A reusable object that
provides visual interface. Each type
of control has its own set of properties, methods, and events that
make it suitable for a particular
purpose.
ColorDialog dialog box A dialog box that displays a list of colors
and returns a property containing
the selected color.
CreateEventSource method
Method that creates an event
source for an application, creating
the log if it does not yet exist.
COM/COM+ components
Technologies used in earlier
Microsoft development languages
to allow components to communicate with one another.
CLR (Common Language
Runtime) A program that executes all managed code and provides code with various services at
runtime, such as automatic memory management, cross-language
integration, code access security,
and debugging and profiling support.
ComboBox control A control
that allows selection of a single
value from a provided list, as well
as the input of a new value, if
allowed.
Common Language Runtime
(CLR) See CLR.
complex data binding The
process of connecting a user interface control to an entire collection
of data rather than to a single data
item. For example, binding a
DataGrid or ListBox object with a
DataTable object.
culture Specifies local settings,
including language, alphabet, sort
order, direction of information
presentation, and other localespecific details.
CultureInfo class Class that
provides various items of information about a particular culture.
CurrentCulture property
Property that dictates the format
used for dates, times, currency,
numbers, and string comparison
and casing rules.
486 CurrentUICulture property
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
CurrentUICulture property
Property that specifies the culture
to use when selecting resources for
the user interface.
Custom Actions Editor A
deployment editor used to run
DLL, EXE, assemblies, or script
files that will be called during the
install, commit, rollback, or uninstall phases of package installation.
data binding The creation of a
link between the data model and
the user interface.
Data Form Wizard A utility
within Visual Studio .NET that is
used to automate many databinding tasks.
data provider An object used to
access and manage data stored
within DataSet objects.
DataAdapter A two-way transfer
conduit between data provider and
DataSet objects.
DataColumn A single element
(field) of data values within a
DataTable.
DataReader A read-only conduit
through which a result set can be
rapidly read, but which is accessible
only in sequence from first to last.
DataRelation A relationship
object in a DataSet object that represents a relationship between the
key values stored in two DataTable
objects.
DataRow A single line (record)
of data within a DataTable.
DataSet A server-independent
store that can hold multiple tables
and their relationships.
DataTable object An
ADO.NET object that represents
one table of in-memory data.
DataView A filtered view of data
derived from one or more related
DataTable objects within a DataSet
object.
DateTimePicker control A
control that allows selection of date
and time values using a variety of
formats.
Debug mode The default compilation mode when using Visual
Studio .NET. This mode includes
both the TRACE and DEBUG
symbol sets.
DEBUG symbol One of the
symbol sets used to instrument a
program for tracing, included only
when an application is compiled in
Debug mode.
delay signing A process used
during application testing in which
a strong name is created by signing
the assembly using the public key
rather than the private key (which
is later used for final signing before
distribution).
delegate A reference type that
stores references to a method that
has a specific signature. A delegate
object can be used to dynamically
invoke a method at runtime.
487
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .FCL
. . (Framework
. . . . . . .Class
. . .Library)
. . . .
DELETE statement The TSQL statement used to delete one
or more records from a table within a database.
dialog boxes Boxes used to
prompt user input within an application. Default dialog boxes
include the ColorDialog,
FontDialog, OpenFileDialog,
PageSetupDialog, PrintDialog,
PrintPreviewDialog, and
SaveFileDialog dialog boxes.
disco.exe The Web Services
Discovery tool (disco.exe), a command-line tool used to discover a
Web service.
Disco A Microsoft standard for
the creation of Web Service discovery documentation that contains
paths and URLs for the documentation and WSDL file describing
the service.
Dock property Specifies the
edge of the parent container to
which a control is docked.
DomainUpDown control A
control that returns a string value
selected from an indexed list of values, navigated using up and down
buttons on the control.
Draw method A method that
can be used to draw graphics on a
form.
dynamic properties Properties
managed at runtime by the
System.Configuration.AppSettings
Reader class.
element A single data value
within a record, also called a field.
EndPrint event Event that fires
once after the last page of the job
has printed.
ErrorProvider component
Component that allows the display
of a small icon that provides a
mouseover ToolTip detailing a
validation error’s details.
event handler A method that
executes in response to an event.
event handling The act of
responding to an event by executing event handlers. See also event
handler.
EventLog class Class that provides the capability to read from or
write to a Windows event log.
exception An unexpected problem that occurs during the normal
execution of a program such as a
missing file, invalid data, or operations. Exceptions must be handled
in an application’s code to prevent
the application’s default behavior,
which is termination.
Extensible Markup Language
(XML) See XML.
FCL (Framework Class Library)
A library of classes, interfaces, and
value types that are included in the
Microsoft .NET Framework. This
library provides access to the system functionality and is designed
to be the foundation on which the
.NET Framework applications,
components, and controls are built.
488 field
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
field A single data value within a
record, also called an element.
File System Editor A deployment editor used to customize the
system configuration that will be
used during package installation.
File Types Editor A deployment
editor used to specify file type
associations that will be created
during installation.
FileStream class A class within
the System.IO namespace that
treats data as a stream of bytes.
filtering The presentation of
only a useful or target subset of
data from the data model.
finally block Block used in conjunction with try block of code. It
executes whether or not an exception is raised.
FontDialog dialog box A dialog
box that enables the user to select a
font and its properties.
Form class A container class
within the System.Windows.Forms
namespace that can be used to create an application that provides a
visual user interface.
Framework Class Library The
shared class library that allows code
developed using .NET languages
to inherit class types transparently.
Global Assembly Cache A code
cache of assemblies that are supposed to be shared by multiple
applications in a computer.
globalization The phase in the
localization process in which all
localizable resources are identified
separately from the fixed-code portions of an application.
GroupBox control A container
control that includes a caption.
HelpProvider component A
component that can be used to link
an application with its HTML
Help files or pop-up help text.
high-contrast mode Mode used
to support users who have visually
disabling conditions who require a
greater level of contrast than the
normal Windows default settings.
HScrollBar control A control
that provides horizontal scrolling
capability.
HTML Help Multipaned
HTML Help files that can be
cross-linked using hyperlinks. This
is the standard Windows form of
help file.
IDE (integrated development
environment) A set of
Windows-based tools for building,
testing, debugging and deploying
an application using a single integrated environment.
Immediate window One of the
program state windows used during
debugging for real-time evaluation
of variables and expressions within
the Command window.
inheritance The capability of
one class to inherit the members of
its parent class or classes.
489
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . logo
. . .programs
. . . . .
INSERT statement The TSQL statement used to insert one
or more records into a table within
a database.
Integrated development
environment See IDE.
internal modifier A class member with an internal modifier is
accessible to all classes within the
current project.
Invalidate method A method
used to invalidate a specified region
and trigger a Paint event.
Invariant culture A special culture that can be used to interact
directly with system services.
IsInRole method Method that
enables you to test the role membership of the current user.
KeyPress event Event that can
be used to intercept user keyboard
input characters for validation testing.
Kill method Method that terminates a local process immediately
without saving data or performing
resource cleanup.
Label control A control that displays read-only data to the user.
Launch Conditions Editor A
deployment editor used to specify
conditions that must be met before
package installation can begin.
LinkLabel control A control
that provides read-only data with a
hyperlink capability.
ListBox control A control used
to allow selection of one or multiple values from a list of options.
listener Classes derived from the
TraceListener class that handle the
reporting of data provided by the
Trace and Debug classes.
ListView control A control that
provides navigation through a
series of values, including icons,
names, and associated text.
localizability The phase in the
localization process in which
checks are made to ensure that
localization will not require design
changes for different cultures.
localization The process of customizing an application to support
different locales through culturespecific settings.
Locals window One of the program state windows used during
debugging to show all of the variables that are local to the current
method being executed.
Location property A control
property used to specify the
absolute location of the upper-left
corner of a control.
logo programs Program in
which Microsoft allows developers
to include a logo reflecting the
degree to which a new application
conforms to the guidelines for
Windows development if all of the
requirements for the particular
program are met.
490 Lookup
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Lookup A view used to transform data into a human-readable
form, often by providing a translation between a stored numerical
key value and its human-readable
text equivalent.
one-way data binding Binding
form in which changes to the
underlying data are reflected in the
user interface, but changes to data
within the user interface are not
propagated back to the data model.
Merge Module A package used
to deploy redistributable packages
that include shared components
and assemblies.
OpenFileDialog dialog box A
dialog box used to browse for a
particular file.
mirroring Changing control layout and text input direction to
accommodate cultures that read
and write from right to left.
MonthCalendar control A control that allows selection of a date
using a calendar-formatted display.
namespace A logical naming
scheme for grouping related classes. The .NET Framework uses a
hierarchical naming scheme for
grouping classes into logical categories of related functionality, for
example System.Windows is a
namespace for grouping classes
related to Windows-based applications and System.Data is a
namespace for grouping data
manipulation classes.
.NET Framework A platform
for building, deploying, and running XML Web services and applications. The .NET Framework
consists of three main parts: the
CLR, the FCLs, and a set of
language compilers.
NumericUpDown control
A control that returns a numeric
value, navigated using up and down
buttons on the control.
PageSettings class Class used to
manipulate settings that involve the
size and layout of a printed page.
PageSetupDialog dialog box A
dialog box that allows a user to
select page layout settings.
panel control A container control that includes basic scrolling
capability.
Pen class A class used with the
Draw method to draw lines and
curves.
PerformanceCounter class
Class that provides access to
performance data about running
processes, as well as the publication
of performance data over a network.
permission sets Contain one or
more permissions that are assigned
as a unit.
permissions Grant or deny
access to a resource.
PictureBox control A control
used to display graphical images,
including icon (.ico), bitmap
(.bmp), metafile (.wmf),
JPEG/JPG, PNG, and GIF files.
491
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . RadioButton
. . . . . . . control
. . . .
PInvoke (Platform Invoke)
Platform Invocation, used to call
functions from unmanaged
Windows API libraries.
Platform Invoke
See PInvoke.
pop-up help Help that enables a
user to click the Help button and
then a target control to display
help information for that control.
PrincipalPermission class Class
that can be used to determine the
group membership of the current
user.
Print method Method of a
PrintDocument object that fires its
PrintPage event, sending data output to the target device.
PrintDialog dialog box A dialog
box used to select print options and
submit a print job to the selected
printer.
PrintDocument class Class that
provides support for printed output.
preview a document within the
application before printing.
PrintPreviewDialog dialog box
A dialog box that allows viewing of
printed output before it submits
the job to the printer.
private member A class member
accessible only to its containing
type.
Process class Class that provides
information about processes running on a system, local or remote,
and that also allows control over
starting and stopping processes on
the local system.
ProgressBar control A control
used to display progress across a
scaled bar.
protected member A class
member accessible to the containing type and all classes derived
from the containing type.
public member A globally accessible member of a class.
PrinterSettngs class Class used
to access and manipulate properties
of the target printer.
Publisher The class that informs
the occurrence of an event to its
subscribers.
PrintPage event An event that
fires once for each page to be
printed.
QueryPageSettings event
Occurs immediately before each
PrintPage event of a print job.
PrintPageEventArgs class Class
used to expose properties of the
printed page, such as its margins.
RadioButton control An extension of the CheckBox control,
allowing a group of check boxes to
be used to select a single value
from the group of check boxes.
PrintPreviewControl control A
control that includes the basic
functionality to enable a user to
492 record
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
record A single line of data within a table, containing one or more
elements (or fields).
Registry Editor A deployment
editor used to specify Registry
keys, subkeys, and values that will
be registered to the target computer’s Registry during package installation.
regression testing Retesting
using all previous tests after a
change or addition to existing
code.
relational database Database
that stores related data grouped
into tables, related by primary
key/foreign key relationships.
resource file A storage location
for culture-specific localized
resources, such as strings and
bitmap images.
RichTextBox control A control
that allows single-line or multiline
textual input, including support for
Rich Text Format (.rtf) input.
role-based security Security
that manages the logon account’s
access rather than the application
code itself, allowing control of
application access based on user or
group membership.
sampling The process of reading
the value of a performance counter.
satellite assembly Assembly
used to include resource files within an assembly, such as those used
for a particular localized culture.
SaveFileDialog dialog box A
dialog box that enables the user to
browse for the location and specify
the name to be used when saving a
file.
SELECT INTO statement A
special form of the SELECT statement used to create a new table
from the data resulting from the
SELECT statement.
SELECT statement The TSQL statement used to retrieve
data from one or more tables within a database.
Show method A method used to
display a Graphics object.
simple data binding The connection of a single data value to a
single property of a control.
SOAP (Simple Object Access
Protocol) SOAP is an XMLcompliant protocol for exchanging
structured and type information via
the Internet, typically over HTTP.
SOAP is the primary protocol used
for communication between Web
services and Web service clients.
stored procedure A precompiled collection of Transact-SQL
statements stored under a name
and processed as a unit. SQL
Server supplies stored procedures
for managing SQL Server and displaying information about databases and users.
stream
A flow of raw data.
493
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .this
. .window
. . . .
StreamReader class A class
within the System.IO namespace
that implements a TextReader for
reading characters from a byte
stream in a particular encoding.
StreamWriter class A class
within the System.IO namespace
that implements a TextWriter for
writing characters into a byte
stream in a particular encoding.
string indexing Parsing an input
string character by character for
validation, taking into account the
fact that some characters are 16-bit
and others are 32-bit.
strong name A name that consists of an assembly’s identity—its
name, version, and culture, as well
as a unique digital signature generated over the assembly. Assemblies
with the same strong name are
expected to be identical.
stub A replacement code segment that automatically returns the
correct response when called by
the module being tested. Stubs are
mostly used in the case when the
actual code is not yet available.
Subscriber A class that receives
notification about an event from an
event publisher class.
System.Drawing namespace
Namespace that includes classes
used in creating graphical elements.
System.IO namespace
Namespace used to access filebased data storage.
System.Xml namespace
Namespace used to access and
manipulate XML data files.
TabControl control A container
control that allows the grouping of
controls within tabbed pages for
rapid navigation.
TabIndex The order in which a
control receives focus when a user
tabs through the controls on a
form.
table of contents Element supported by HTML Help that helps
users rapidly identify and navigate
to a desired topic.
TabStop property A control
property used to specify whether
the control can receive focus as a
user tabs through controls on a
form.
testing Application testing must
be performed to ensure that an
application is capable of proper
function, even if presented with
invalid or conflicting data, and as a
simple measure of base functionality within the expected operational
environment.
TextBox control A control that
allows single-line or multiline textual input, including the capability
to mask passwords using a default
character such as the asterisk (*).
this window One of the program
state windows used during debugging to show all of the members
associated with the current object.
494 Throw method
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Throw method Method used to
explicitly raise an exception, allowing the use of custom errorhandling code.
Timer control A control used to
fire an event after a specific interval
of time.
tlbimp.exe The Type Library
Importer (tlbimp.exe), a commandline utility used to import the
metadata of a COM component for
use within a .NET application.
toolbar A component used to
provide access to clickable tool
buttons, typically docked along the
top edge of an application.
ToolTip A component that
extends the properties of other
controls on a form to allow the display of mouseover ToolTip text.
top-down testing A testing
approach that involves testing
overall functionality using code
stubs for modules not yet developed. After root-level functionality
is verified, testing extends down to
the unit level.
topic files HTML Help files
that are designed to assist the user
in a particular situation. Each situation has its own topic file.
trace One of the symbol sets
used during diagnostics, included
when an application is compiled in
Debug or Release modes.
TrackBar control A control used
to select a value from a range by
sliding the scrollbar across a displayed scale.
Transact-SQL
See T-SQL.
transforming Translating
machine-stored information within
the data model to a more humanreadable form.
TreeView control A control that
allows navigation and selection
within a hierarchical node structure.
Try block Block that is used in
conjunction with one or more
Catch blocks for error handling
within the defined region of code.
T-SQL Microsoft’s implementation of the Structured Query
Language (SQL standard), also
referred to as Transact-SQL.
two-way data binding Binding
form in which changes to the data
in the data model are reflected in
the user interface, and changes to
data within the user interface are
reflected back to the data model.
Type Library Importer
tlbimp.exe.
See
UDDI (Universal Description,
Discovery, and Integration)
Provides a method for locating
Web services through the use of a
central searchable directory.
umbrella testing A testing
approach that focuses on testing
user interface modules prior to the
business logic modules.
Unicode The default encoding
used by .NET applications that
uses a 2-byte (16-bit) character
set to handle roughly 65,000
495
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Windows
. . . . . API
. .
characters from the world’s most
common languages.
Universal Description,
Discovery, and Integration
(UDDI) See UDDI.
UPDATE statement The TSQL statement used to update the
values of one or more records of a
table within a database.
URL remoting A zero-touch
deployment method that allows the
installation of an application simply
by navigating to the proper URL
for the application’s executable
(.exe) file within Internet Explorer.
user assistance The process
of providing help within an application.
User Interface Editor A deployment editor used to specify dialog
boxes that will be displayed during
the start, progress, and end stages
of an installation.
UserControl control Composite
controls derived from the
UserControl class, which can
include one or more standard user
interface controls as well as defined
business logic.
validation The process of ensuring that input values are valid and
that all required values are present
before performing a procedure on
the input data.
view A filtered set of data derived
from one or more tables within a
database.
visual inheritance The process
of inheriting visual user interface
members from a parent class.
VscrollBar control A control
that provides vertical scrolling
capability.
Watch window One of the program state windows used during
debugging to monitor the value of
a particular associated variable.
WebMethod attribute The
attribute used in an .asmx file to
expose a method provided by a
Web service.
WebService attribute The
attribute used in an .asmx file to
describe and specify a namespace
for a Web service.
Web Services Allow objects to
interact even when located on systems in widely distributed networks
connected only by the Internet.
Web Services Description
Language (WSDL) See WSDL.
Web Services Description
Language tool (wsdl.exe) A
command-line tool that can use a
WSDL file to create a proxy class
that can be used to access the web
service.
Web Services Discovery Tool
A command-line tool used to discover and make available a Web
service.
Windows API Can be used to
access inherent functionality
provided by the Windows
environment.
496 Windows Forms ActiveX Control Importer
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Windows Forms ActiveX
Control Importer See
aximp.exe.
WindowsIdentity object Object
that represents the current user
running the code and includes
information such as the username
and authentication method.
WindowsPrincipal object
Object that adds functionality to
the WindowsIdentity object, representing the entire security context
of the user running the code,
including the roles to which that
user belongs.
wrapper A software container
component that encapsulates legacy components to provide a translation interface between the .NET
Framework and the component’s
requirements for an interface.
WriteEntry method Method
that writes an entry to an event log.
WSDL Provides details on the
SOAP messages that a Web service
can send and receive.
XCOPY A Windows commandline utility that can be used to copy
files from one location to another.
XML A text-based humanreadable format that provides a
uniform method for describing and
exchanging structured data that is
independent of applications or
vendors. Also referred to as the
Extensible Markup Language.
Z-order A property that specifies
the relative positioning of a control
in a stack of overlapping controls.
Each control has a unique z-order
position.
Index
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Symbols
& (ampersand), 38, 244
’ (apostrophe), 163
* (asterisk), 41, 143, 294
+= code, 15
= code, 15
-= code, 15
/? command-line option (wsdl.exe), 179
&& (double ampersand), 38
… (ellipsis) button, 36, 327
= (equals sign), 144
/? option (Type Library Importer Tool), 222
+ (plus sign), 7, 158, 327
# (pound sign), 158
‘’ (single quotes), 157
[ ] (square brackets), 144, 157
- (substract sign), 7
@ symbol, 148
% (wildcards), 144, 158
A
AcceptChanges method, 156
AcceptsReturn property, TextBox class, 41
access modifiers, classes, 3
access. See data access
accessibility, 242-244
AccessibleDescription property, 243
AccessibleName property, 243
AccessibleRole property, 243
accessing
backing stores, 151
controls, 39
event logs, 314
relational databases, 156
resources, 330
streams, 151
accessors, properties, 12
actions, controls, 43
Activation property, ListView class, 51
ActiveLinkColor property, LinkLabel class,
41
ActiveMdiChild property, 61
ActiveX controls, 214-219
ActiveX Properties hyperlink, 218
ad-hoc queries, 146-148
adaptive exams, 461-462
fixed-length exams, compared, 463
short-form exams, compared, 463
strategies, 463-466
Add a Child Code Group link, 335
Add Existing Item command (File menu),
179
Add Inherited Control command (Add
menu), 104
Add Inherited Form command (Add menu),
13
Add menu commands
Add Inherited Control, 104
Add Inherited Form, 13
Add New Item, 95
Add Property, 100
Add method, parameters, 162
Add New Item command (Add menu), 95
Add New Item dialog box, 13, 95
Add Property command (Add menu), 100
Add Reference button, 176
498 Add Reference dialog box
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Add Reference dialog box, 96, 215, 222
Add Web References dialog box, 176
Add/Remove Programs Wizard, 296
Added value (DataViewRowState), 158
AddNew method, 123, 159
administrative installation (deployment
method), 299
ADO.NET Object Model
data provider objects, 153-155
DataSet object, 156, 161-162
DataColumn object, 160
DataRelation object, 158
DataRow object, 160
DataTable object, 157-158
DataView object, 159
AfterCheck event, TreeView class, 51
AfterCollapse event, TreeView class, 51
AfterExpand event, TreeView class, 51
AfterSelect event, TreeView class, 51
agents, code-based, 270
aggregate functions, 144, 158
al.exe (Assembly Generation tool), 107, 110
Alignment property, 22
StatusBarPanel class, 59
TabControl class, 55
All Code code group, 335
AllowDbNull * property, 160
AllowDelete property, 159
AllowEdit property, 159
AllowMargins property, PageSetupDialog
component, 258
AllowNew property, 159
AllowOrientation property,
PageSetupDialog component, 258
AllowPaper property, PageSetupDialog
component, 259
AllowPrinter property, PageSetupDialog
component, 259
alphabetic characters, changing case, 81
Alt property, 82
AlternatingBackColor property, 128
American National Standards Institute
(ANSI), 142
ampersand (&), 38, 244
ampersand, double (&&), 38
Anchor, control property, 35
AND keyword, 158
animation files, 235
ANSI (American National Standard
Institute), 142
AntiAlias member (SmoothingMode
property), 23
antialiasing, 22
APIs, SetProcessDefaultLayout Windows,
203
apostrophe (’), 163
app.config file, 327
AppDomain class, 79
Application class, 9
Application directory code group, 334
Application event log, 313
Application folder, 292
application settings, managing, 329
application testing, 270-272
ApplicationException, 72
applications
CloseMainWindow method, 308-312
compiling, 272
data-bound, creating, 130
deploying, 288
.NET Framework, 291
Setup Projects, 289-293
international, testing, 272
Kill method, 308-312
MDI (multiple-document interface)
applications, 60-61
.NET, 147
process information, 312
single-document interface applications,
60-61
Start method, 308-312
states, debugging, 279
troubleshooting, 288
Windows
event logs, 313-314
Process class, 308
<appname>.exe.config file, 327-328
architecture, data binding, 122-124
arguments
DrawString() method, 20
event handlers, 14, 102
IsInRole method, 338-339
PaintEventArgs, 18
ArithmeticException catch block, 74
Array.Sort method, 205
ASCIIEncoding subclass, 202
/asmversion:versionNumber option (Type
Library Importer Tool), 221
.asmx extension, 180
assemblies
Authenticode, 295
code groups, 333
delay, 294
immediate, 293-294
machine-wise configured, managing, 329
. . . . . . . . . . . . . . . . . . . . . . . . . . . . btnCloseAllCalculators
. . . . . . . . . . . . Button
. . . . control
. . . .
.NET, 105-110
shared, 293-296
Assembly Cache Viewer Shell Extension
(shfusion.dll), 295
Assembly Generation tool (al.exe), 107, 110
Assembly Manifest, 105-107
assembly resource files, 201
AssemblyKeyFile attributes, 294
AssemblyVersion attribute, 294
Assert method, 272
AssociateIndex value, 240
asterisk (*), 41, 143, 294
asynchronous calls, queued components
(COM+ components), 223
Attach button, 278
attributes
AssemblyKeyFile, 294
AssemblyVersion, 294
browsable (custom properties), 12
category (custom properties), 12
Conditional, 275
custom properties, 12
description (custom properties), 12
editorbrowsable (custom properties), 12
PrincipalPermisssionAttribute, 339
WebMethod, 180
WebService, 180
audio. See sound
authentication, 337
Authenticode Signature option, 292
Authenticode signing, shared assemblies,
295
authorization, role-based security, 337-339
Auto window, 279
AutoCheck property, 44
AutoFlush property, 272
AutoFormat, 127
AutoIncrement property, 160
automated alpha-phase testing, 270
AutomaticDelay property, 241
AutoPopDelay property, 241
AutoScroll property, Panel class, 39
AutoSize property, StatusBarPanel class, 59
AutoZoom property, PrintPreviewControl
control, 261
Avg aggregate function, 158
Avg function, 144
AxHost class, Windows Forms ActiveX
Control Importer (aximp.exe), 215
aximp.exe (Windows Forms ActiveX
Control Importer), 215-217
az-AZ-Cyrl (culture code), 194
B
BackColor property, 10, 128, 243
Background Color property, 128
BackgroundImage property, 10, 243
backing stores, 151-153
base classes, 3, 16-17
base functionality, 270
BeginEdit method, 160
BeginPrint event, 252
BeginTransaction method, 154
BinaryReader class, 151-153
BinaryWriter class, 151-153
binding controls, 120
Binding class, 120
Binding objects, 120
binding. See data binding
BindingContext
class, 122-124
object, 122
property, 127
BindingManagerBase class, 122-123
Bindings property, 123
blank forms, creating, 6
BlinkRate property, 84
BlinkStyle property, 84
blocks
catch, 74-76
finally, 76-77
try, 73-74, 77
try-catch, code, 75
body, SOAP (Simple Object Access
Protocols) messages, 175
Boolean values
Enabled property, 35
Visible property, 38
BooleanSwitch object, 274
Bootstrapper option, 292
BorderStyle property, 59, 128
bottom-up integration testing, 271
Bounds property, PageSettings class, 255
boxes, Label, 37. See also check boxes; dialog
boxes
Breakpoint Condition dialog box, 277
Breakpoint Hit Count dialog box, 277
breakpoints, conditional, creating, 277
Breakpoints window, 277
browsable attribute (custom properties), 12
browsing disk files, 150-151
Brush class, 24
Brush objects, 23-24
Brush property, 22
btnCloseAllCalculators Button control, 310
How can we make this index more useful? Email us at indexes@quepublishing.com
499
500 btnCloseRecentCalculator Button control
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
btnCloseRecentCalculator Button control,
310
btnGetInfo Button control, 194
btnLaunchCalculator Button control, 310
btnOpenForm Button control, 199
btnPageSetup button control, 258
btnPreview button control, 259
btnPrinter button control, 261
buffers, string, 223
Build Type of a Project’s Properties as
Content option, 109
Build Type to Embedded Resource option,
109
build-list-and-reorder questions, exam
format, 455-457
Button class, 44
Button control, 43-44, 199
Button controls
btnCloseAllCalculators, 310
btnCloseRecentCalculator, 310
btnGetInfo, 194
btnLaunchCalculator, 310
btnPageSetup, 258
btnPreview, 259
btnPrinter, 261
Button property, 16, 59
ButtonBase control, 43
ButtonClick event, ToolBar class, 59
buttons
Add References, 176
Attach, 278
Close, 6
Close All Calculators, 311
Close Most Recent, 311
Condition, 277
ellipsis (…), 36, 327
Help, displaying, 241
Hit Count, 277
Import, 335
Invoke, 182
Launch, 311
New Project, 6
Open, 104
Options, 238-239
Page Setup, 258
Preview, 259-260
Printer, 261
Search, 469
Show All files, 105
View Compiled File, 239
C
C#, 2
C# Property Wizard, 100
Cab Projects, 289
.cab (cabinet) files, 289, 298
CalendarDimensions property,
MonthCalendar class, 49
Call Stack window, 279
calls, asynchronous (COM+ components),
223
Cancel property, 83, 255
CancelCurrentEdit method, 123
CancelEdit method, 160
CancelEventArgs object, 83
CanDuplex property, PrinterSettings class,
256
CanRead property, 152
CanSeek property, 152
CanWrite property, 152
CaptionBackColor property, 128
CaptionFont property, 128
CaptionText property, 128
CaptionVisible property, 128
case, alphabetic characters, 81
case studies, 461-462
layout, 453-454
strategies, 463-464
catch blocks, 74-76
catching exceptions, CLS (Common
Language Specification), 75
category attribute (custom properties), 12
CategoryName property, 315
CausesValdiation property, 83
cboCulture ComboBox control, 199
cboSelectCulture ComboBox control, 196
certification, logo, 299
certification exams
adaptive exams, strategies, 465-466
build-list-and-reorder questions,
455-457
case studies, 453-454, 463-464
create-a-tree questions, 457-459
drag-and-connect questions, 458-460
fixed-length, strategies, 464-465
formats, 461-463
multiple-choice questions, 454-455
practice exams, taking, 467-468
question handling, strategies, 466-467
readiness, assessing, 451-452
resources, 468
select-and-place questions, 460
501
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . classes
. . . .
short-form, strategies, 464-465
testing centers, 452
Certified for Windows, 299
Changed event, 103
channels, remoting, 329
character encodings, 201
CharacterCasing property, 41, 81
CharacterRange structure (System.Drawing
namespace), 19
characters, alphabetic, 81
check boxes
ShowInTaskbar, 327
Text, 327
CheckBox class, 44
CheckBox control, 43-44, 80
CheckBoxes property, 51-52
CheckeChanged event, CheckBox class, 44
checked keywords, 76
Checked property, 44, 58
CheckedChanged event, RadioButton class,
44
CheckedIndices property, 46, 52
CheckedItems property, 46, 52
CheckedListBox class, 46
CheckedListBox control, 44-46
CheckState property, CheckBox class, 44
child table columns, 158
child windows, 60
ChildColumns property, 159
ChildKeyConstraint property, 159
ChildRelations property, 157
ChildTable property, 159
.chm files, 240
Choose a Project Type screen, 289
Choose Files to Include screen, 290
Choose Project Outputs to Include screen,
289
class
AppDomain, 79
BindingContext, 122
PrintDocument, 252-256
Class Library template, 95
Class View command (View menu), 100
classes
access modifiers, 3
Application class, 9
AxHost, Windows Forms ActiveX
Control Importer (aximp.exe), 215
base classes, 3
BinaryReader, 151-153
BinaryWriter, 151-153
Binding, 120
BindingContext, 124
BindingManagerBase, 122-123
Brush object, 24
Brush, 24
Button, 44
C#, 2
CheckBox, 44
CheckedListbox, 46
ColorMixer, 100
ComboBox, 47
CommonDialog, 57
Component class, .NET components,
94-97
ContainerControl, 34, 94
ContextMenu, 57
Control class, .NET components, 94,
98-99
CultureInfo, 194-195
CurrencyManager, 122-123
custom properties, 11-12
DateTimePicker, 50
Debug, 272-273
DefaultTraceListener, 273
derived classes, 3
DomainUpDown, 48
Encoding, 201
ErrorProvider, 84
EventLog, 80, 313-314
EventLogTraceListener, 273
exceptions, 72-73
FileStream, 151
Form class, 10-11
Graphics, 18, 253
grouping, 4
HatchBrush, 24
Help, 240
inheritance, 3
Installer, methods, 296
KeyEventArgs, properties, 82
KeyPressEventArgs, properties, 81
Label, properties, 40
LinearGradientBrush, 24
LinkLabel, 41
Listbox, 45
ListControl, 44-46
ListView, 51-52
MainMenu, 57
MenuItem, 57-58
MonthCalendar, 49-50
namespaces, 4
.NET Framework, 2
NumericUpDown, 48
How can we make this index more useful? Email us at indexes@quepublishing.com
502 classes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
OpenFileDialog, 150
overriding (event handling), 16-17
PageSettings, properties, 255
Pen object, 22
PerformanceCounter, 315-316
PictureBox, 43
PrincipalPermission, 339
PrinterSettings, properties, 256
PrintPageEventArgs, properties, 255
Process
CloseMainWindow method, 308-312
events, 309-310
Kill method, 308-312
methods, 309-310
process information, 312
properties, 309-312
Start method, 308-312
ProgressBar, properties, 54
ProjectInstaller, 296
properties, 3
proxy, 176-178
publishers, 102
RadioButton, 44
ResourceManager, 110, 200
ResourceReader, 110
resources, 110
ResourceWriter, 110
ResXResourceWriter, 110
ResXResoureReader, 110
RichTextBox, properties, 42
ScrollBar, 55
SolidBrush, 24
SqlException, 165
static members, 3
StatusBarPanel, properties, 59
StreamReader, 151
StreamWriter, 151
StringInfo, 204
subclasses, 202
subscribers, 102
Switch, 274
System.Configuration.AppSettingsReader, 326
System.IO namespace, 151
System.Windows.Forms.UpDownBase
class, inheritance, 47
SystemBrushes, 24
SystemPens, 22
TabControl, 55
TextBox, 41-42
TextBoxBase, 41
TextureBrush, 24
TextWriterTraceListener, 273
Timer, 53
ToolBar, 59-60
trace listeners, 273
Trace, 272-273
TraceLevel, enumeration, 274
TraceListener, 273
TraceSwitch, properties, 274
TrackBar, 54
TreeView, 51
UnhandledExceptionEventArgs,
properties, 79
unit testing, 271
UserControl, 98-101
visual inheritance, 13
Visual Studio .NET, 2
XmlDataDocument, 164-165
XmlDocument, 163-164
clauses
FROM, 143
GROUP BY, aggregate functions, 144
HAVING, 144
WHERE, 144, 157
Clear method, 156-157
Click event, 260
Button class, 44
MenuItem class, 58
PictureBox class, 43
Clicks property, 16
client-side filtering, 132
client-side user interfaces, 94
ClientSize property, 10
Close All Calculators button, 311
Close button, 6
Close method, 152-154, 272-273, 315
Close Most Recent button, 311
Close() method, 11
CloseMainWindow method, 308-312
CLR (Common Language Runtime), 2,
105, 196, 219, 336
CLS (Common Language Specification),
exception catching, 75
code. See also legacy code
+=, 15
-=, 15
=, 15
breakpoints, 277
developing, .NET Framework, 2
ErrorProvider component, 84-85
finally blocks, 76
forms, adding controls, 63-64
managed, 219
step-by-step execution (debugging), 276
try blocks, 73-74
503
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . components
. . . . . . .
try-catch blocks, 75
unmanaged. See legacy code
code access permissions, 330
code access security, 329
code groups, 333-334
final permissions, 336
granting permissions, 334-336
minimum permissions, 332-333
permission sets, 334
permissions, 330-332
code block, 7
code groups, 333-335
Code Groups node, 335
code modules, 336
Code view, 6-8, 98, 221
code-based agents, automated alpha-phase
testing, 270
collapsing code blocks, 7
Collate property, PrinterSettings class, 256
color, accessibility, 242
Color property, 22, 255
Color structure (System.Drawing namespace), 19
ColorDialog dialog box, 56
ColorMixer class, 100
ColorMixer control, 102-103
ColorMixerEventArgs control, 103
ColorMixerWithEvents1 control, 103
ColumnChanged event, 157
ColumnChanging event, 157
ColumnHeadersVisible property, 128
ColumnName property, 160
columns, tables, 158
Columns property, 157, 261
ColumnWidth property, ListBox class, 45
COM (Component Object Model), 174
components, 219-222
tab, 215, 222
COM Components tab, 217
COM+ components, 222
ComboBox class, 47
ComboBox control, 46-47, 80, 124
cboCulture, 199
cboSelectCulture, 196
Command object, 154-155
command prompts, Visual Studio .NET,
178
command-line options, wsdl.exe, 179
command-line utilities, OSQL, 146
commands
Add menu
Add Inherited Control, 104
Add Inherited Form, 13
Add New Item, 95
Add Property, 100
Debug menu
Start, 6
Step Into, 276
Step Out, 276
Step Over, 276
Windows, 279
Windows, Breakpoints, 277
Edit menu
Insert Keyword, 238
Insert Topic, 238
File menu
Add Existing Item, 179
Compile, 239
New, HTML File, 236
New, Index, 238
New, Project, 6, 236
New, Table of Contents, 237
MSIEXEC, 299
Tools menu, Debug Processes, 278
View menu, Class View, 100
CommandText property, 154
CommandType property, 154
Commit method, 296
Common Files folder, 292
Common Language Runtime (CLR), 2,
105, 196, 219, 336
Common Language Specification (CLS),
exception catching, 75
CommonDialog class, 57
CompanyName static property, 9
comparing data, 205
compilation, conditional, 275
Compile command (File menu), 239
compiling
applications, 272
forms, 8
HTML Help files, 239
complex data binding, user interfaces
controls, 124-127
DataGrid control, 127-128
Component class, .NET components, 94-97
Component Object Model. See COM
components
COM, 219-222
COM+, 222
ErrorProvider, 83-85
HelpProvider, 240-241
installation, 296-297
.NET
Component class, creating, 94-97
Control class, creating, 94, 98-99
How can we make this index more useful? Email us at indexes@quepublishing.com
504 components
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
creating, 94-95
UserControl class, creating, 94,
99-105
PageSetupDialog, 258-259
PrintDialog, 261
PrintPreviewDialog, 259-260
queued, asynchronous calls (COM+
components), 223
RandomNumberGenerator, 97
Timer, 95
toolbox, adding, 97
ToolTip, 241
troubleshooting, 288
user assistance, 239
Windows Forms dialog components. See
dialog boxes
Compression option, 292
Condition buttons, 277
Condition property, 293
Conditional attribute, 275
conditional breakpoints, creating, 277
conditional compilation, 275
Configuration tool, 298
configurations
dynamic runtime configurations,
326-329
role-based security, authorization, 337
PrincipalPermission class, 339
security
code access security, 329-336
role-based security, 330
WindowsIdentity object, 337-339
WindowsPrincipal object, 337-339
UpdateCommand property, 165-166
Connection object, 154
Connection property, 155
connections, data (Server Explorer), 130
ConnectionString property, 154
consistency, accessibility, 242
constraints, 148
Constraints property, 157
ContainerControl class, 34, 94
ContainerControl property, 84
Contains method, 124
contents files, 235
ContextMenu class, 57
Control class, .NET components, 94, 98-99
control properties, accessibility, 243-244
Control property, 82
control-access restriction, user input, 81
control-based validation, user input, 80
ControlBox property, 10
ControlObject.Property, 34
controls. See also TextBox controls
accessing, 39
actions, initiating, 43
ActiveX, 214-219
binding, 120
ButtonBase, 43
CheckBox, 43-44, 80
CheckedListBox, 44-46
ColorMixer, 102-103
ColorMixerEventArgs, 103
ColorMixerWithEvents1, 103
ComboBox, 46-47, 80, 124
cboCulture, 199
cboSelectCulture, 196
complex data binding, 124-127
custom, event responses, adding,
101-103
DataGrid, 127
data, filtering, 131-132
properties, 128
DateTimePicker, 49-50
dialog boxes
ColorDialog, 56
displaying, 57
FontDialog, 56
modal, 57
modeless, 57
OpenFileDialog, 56
PageSetupDialog, 56
PrintDialog, 56
PrintPreviewDialog, 56
SaveFileDialog, 56
displaying, 244
DomainUpDown, 47-48
forms, adding, 61
Windows Forms Designer, 61-64
GroupBox, 38-40, 103
grouping, 38-39
HScrollBar, 54-55
Label, 40-41, 310
LinkLabel, 40-41
ListBox, 44-46, 80, 124, 194
ListView, 50-52
MDI (multiple-document interface)
applications, 60-61
menus, 57-60
MonthCalendar, 49-50
multiple data sources, complex data
binding, 125-127
NumericUpDown, 47-48
ordering, Z-order, 34
Panel, 38-40
Picturebox, 43, 54
505
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CustomFormat
. . . . . . . . property
. . . . .
printing, 257
PageSetupDialog component,
258-259
PrintDialog component, 261
PrintPreviewControl control,
260-261
PrintPreviewDialog component,
259-260
PrintPreviewControl, properties, 261
ProgressBar, 53-54
properties
Anchor, 35
Dock, 35
Enabled, 35
Font, 36
Height, 37
Location, 37
modifying, 34
Name, 37
Size, 37
TabIndex, 37
TabStop, 37
Text, 37
Visible, 38
Width, 37
RadioButton, 43-44, 80
RichTextBox, 41-42
satellite assemblies, 200
scrollbars, 39
single-document interface applications,
60-61
states, 43
SysInfo, 217
TabControl, 55
TextBox, 41-42, 194-196
Timer, 53-54
ToolTip, 56
TrackBar, 53-54
TreeView, 50-52
UserControl class, creating, 100-101
visual inheritance, extending, 103-105
VScrollBar, 54-55
Controls property, 39
CONVERT function, 158
converting character encodings, 201
Copies property, PrinterSettings class, 256
correctness, application testing, 271
Count aggregate function, 158
Count function, 144
Count property, 123, 159
CounterHelp property, 315
CounterName property, 315
counters, performance, 315-316
CounterType property, 315
Create a Compiled File dialog box, 239
Create a Setup for a Windows Application
option, 289
Create Code Group dialog box, 335
Create method, 316
Create New Category option, 317
Create Permission Set dialog box, 335
CREATE PROC statement, 148
create-a-tree questions, exam format,
457-459
CreateAttribute method, 164
CreateCommand method, 154
CreateElement method, 164
CreateEventSource method, 313-314
CreateGraphics() method, 18
CreateNode method, 164
CreateParameter method, 155
cross-product result-set, queries, 143
Cryptographic ash code group, 334
Crystal Services, 130
cues, visual, 244
culture codes, 194
culture-aware sorting, 205
CultureInfo class, 194-195
CultureInfo objects, 195
CultureInfo.CompareInfo object, 205
cultures
CultureInfo class, 194-195
CurrentCulture property, 196
Invariant, 196
localized information, displaying,
196-197
localized settings, storing, 200
CurrencyManager class, 122-123
CurrencyManager object, 122
Current property, 123
CurrentChanged event, 123
CurrentCulture property, 196
CurrentCulture static property, 9
CurrentInputLanguage static property, 9
CurrentRows value (DataViewRowState),
158
CurrentUICulture property, 196
Custom Actions Editor, 293, 296
custom authentication, 337
custom controls, event responses, 101-103
custom exceptions, creating, 78
custom properties, 11-12
custom symbol, 275
custom trace listeners, 273
CustomFormat property, DateTimePicker
class, 50
How can we make this index more useful? Email us at indexes@quepublishing.com
506 Customize Toolbox dialog box
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Customize Toolbox dialog box, 217
Customize Toolbox option, 97
customizing Setup Projects, 292-293
D
DashCap property, 22
DashPattern property, 22
DashStyle property, 22
data
comparing/sorting, 205
filtering, 129-132
metadata, COM components, 220
performance, 315-316
transforming, 129-132
XML, 162-165
data access
ADO.NET Object Model
data provider objects, 153-155
DataSet object, 156-162
disk files, 150-153
file-based data storage, 150
relational database storage, 150
XML data, 162-165
XML data files, 150
data binding
architecture, 122-124
complex, user interfaces, 124
controls, 124-127
Data Form Wizard, 129
DataGrid control, 127-128
entities, 121-122
one-way, user interfaces, 129
properties, 121-122
simple, user interfaces, 120
two-way, user interfaces, 129
user interfaces, 120
data connections, Server Explorer, 130
Data Connections node, 130-131, 147-149
data files, XML, 150
Data Form Wizard, 129
data models, data sources, 129
data provider objects, 153-154
data providers, 153
data sources, 125-129
data-bound applications, creating, 130
DataAdapter object, 155
databases
errors, 165-166
Northwind, 131
relational, 129, 156
values, modifying, 145
DataBinding property, 120
DataColumn object, 160
DataGrid control, 127
data, filtering, 131-132
properties, 128
DataReader object, 155
DataReader.Close method, 155
DataRelation object, 131, 158
DataRow object, 159-160
DataSet
creating, 131-132
synchronization, 164
DataSet object, 161-162
DataColumn object, 160
DataRelation object, 158
DataRow object, 160
DataTable object, 157-158
DataView object, 159
methods, 156
properties, 156
DataTable object, 131, 157-159
DataType property, 160
DataView, client-side filtering, 132
DataView object, 131, 159
DataViewRowState enumerated values, 158
date values, 49
DateChanged event, MonthCalendar class,
49
DateSelected event, MonthCalendar class,
49
DateTimePicker class, 50
DateTimePicker control, 49-50
DCOM (Distributed Component Object
Model), 174
de (culture code), 194
Debug class, 272-273
Debug menu commands
Start, 6
Step Into, 276
Step Out, 276
Step Over, 276
Windows, 279
Windows, Breakpoints, 277
Debug mode, 275-276
Debug Processes command (Tools menu),
278
DEBUG symbol, 275
Debugger Users group, 278
debugging
application states, 279
breakpoints, 277
code, step-by step execution, 276
errors, JIT (Just In Time), 329
remote, 279
507
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DOM
. . . (Document
. . . . . . .Object
. . . Model)
. . . .
running processes, 278-279
statements, 272
thrown exceptions, 278
declarations, XML, 163
declarative security, 336
Decrement method, 315
Default member (SmoothingMode property), 23
DefaultPageSettings property,
PrinterSettings class, 256
DefaultTraceListener class, 273
DefaultValue property, 160
#define directive, 275
/delaysign option (Type Library Importer
Tool), 221
delay signing, shared assemblies, 294
delegates, attaching, 14-16
Delete method, 159-160, 313
DELETE statement, 146
DeleteCommand property, 155
Deleted value (DataViewRowState), 158
DeleteEventSource method, 313
Delta property, 16
Demand value, 333
deploying
applications, 288
.NET Framework, 291
Setup Projects, 289-292
customizing, 289-293
installation components, 296-297
.NET assemblies, 107-108
deployment
ActiveX controls, 219
methods, 298-299
URL remoting, 297-298
deployment tools
Microsoft Windows Installer, 288, 291
XCOPY utility, 288
derived classes, 3
description attribute (custom properties), 12
description files, WSDL, 178
Description property, 274
Design view, 6, 98
Designed for Microsoft Windows XP, 299
DesktopLocation property, 10
DetectUrls property, RichTextBox class, 42
dialog boxes
Add New Item, 13, 95
Add Reference, 96, 215, 222
Add Web References, 176
Breakpoint Condition, 277
Breakpoint Hit Counter, 277
ColorDialog, 56
Create a Compiled File, 239
Create Code Group, 335
Create Permission Set, 335
Customize Toolbox, 217
displaying, 57
Dynamic Properties, 327
Exceptions, 278
File Open, 151, 165
FontDialog, 56
Inheritance Picker, 13, 104
Keyword, 238
modal, 57
modeless, 57
New Breakpoint, 277
Open With, 105
OpenFileDialog, 56
Page Setup, 258
PageSetupDialog, 56
PrintDialog, 56
PrintPreviewDialog, 56
Processes, 278
Property Pages, 291-292
SaveFileDialog, 56
diChildActivate property, 61
digital signatures, 292-294
directives, 275
DirectoryServicesPermission, 331
DisabledLinkColor property, LinkLabel
class, 41
Disco, 175
disco.exe utility, 178
discovery, Web Services, 176
disk files, 150-153
disks, accessibility, 242
displaying
controls, 244
dialog boxes, 57
forms, 6
Help, 240
Help buttons, 241
localized information, cultures, 196-197
DisplayName property, 274
Distributed Component Object Model
(DCOM), 174
DivideByZeroException, 74
.dll files, 293, 326
DnsPermission, 331
Dock, control property, 35
Document Object Model (DOM), 164
DocumentElement property, 164
DoEvents static method, 9
DOM (Document Object Model), 164
How can we make this index more useful? Email us at indexes@quepublishing.com
508 /domain:DomainName command-line option (wsdl.exe)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
/domain:DomainName command-line
option (wsdl.exe), 179
DomainUpDown class, 48
DomainUpDown control, 47-48
double ampersand (&&), 38
drag-and-connect questions, exam format,
458-460
Draw methods, 21-23
DrawArc method, 21
DrawBezier method, 21
DrawBeziers method, 21
DrawCloseCurve method, 21
DrawCurve method, 21
DrawEllipse method, 21
DrawIcon method, 21
DrawImage method, 21
drawing
shapes, forms, 21-23
text, forms, 19-21
DrawItem event, MenuItem class, 58
DrawLine method, 21
DrawLines method, 21
DrawMode property, ComboBox class, 47
DrawPath method, 21
DrawPie method, 21
DrawPolygon method, 21
DrawRectangle method, 21
DrawRectangles method, 21
DrawString method, 21, 253
DrawString() method, 19-20
DropDownStyle property, ComboBox class,
47
DropDownWidth property, ComboBox
class, 47
Duplex property, PrinterSettings class, 256
dynamic .NET assemblies, 107
dynamic properties, configuring, 326-328
Dynamic Properties dialog box, 327
dynamic runtime configuration
dynamic properties, 326-328
.NET Framework Configuration tool,
328-329
E
Edit menu commands
Insert Keyword, 238
Insert Topic, 238
editorbrowsable attribute (custom properties), 12
editors
Custom Actions Editor, 293, 296
File System Editor, 292
File Types, 292
Launch Conditions Editor, 293
Registry Editor, 292
User Interface Editor, 293
viewing, 293
Visual Studio .NET IDE, 292-293
elements, 129
#elif directive, 275
ellipsis (…) button, 36, 327
#else directive, 275
en-GB (culture code), 194
Enabled property, 10, 35
MenuItem class, 58
Timer class, 53
EnableRaisingEvents property, 309, 313
encoding, character, 201
Encoding class, 201
Encoding subclasses, 202
encryption, public key, 294
EndCap property, 22
EndCurrentEdit method, 123
EndEdit method, 160
#endif directive, 275
#endregion, code block, 7
#endregion directive, 275
entities, simple data binding, 121-122
Entries property, 313-314
EntryWritten event, 313-314
enumerated values
DataViewRowState, 158
EventLogEntryType, 314
enumeration, TraceLevel class, 274
envelopes, SOAP (Simple Object Access
Protocols), 175
EnvironmentPermission, 331
equal sign (=), 144
ErrorProvider class, 84
ErrorProvider component, 83-85
errors
ActiveX controls, 219
databases, 165-166
debugging, JIT (Just In Time), 329
forms, 9
Errors property, 165
event handling, 13, 102
arguments, 14
base classes, overriding protected methods, 16-17
delegates, attaching, 14-16
Paint, 20
Event Logs, 130
accessing, 314
Application, 313
509
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .exams
. . .
EntryWritten, 314
Security, 313
System, 313
Windows, 79
event responses, custom controls, 101-103
event sources, 314
event wiring, 14
EventLog class, 80, 313-314
EventLog object, 314
EventLogEntryCollection object, 314
EventLogEntryType enumerated values,
314
EventLogPermission, 331
EventLogTraceListener class, 273
events
AfterCheck, Treeview class, 51
AfterCollapse, Treeview class, 51
AfterExpand, Treeview class, 51
AfterSelect, Treeview class, 51
BeginPrint, 252
BindingManagerBase class, 123
Button class, 44
ButtonClick, ToolBar class, 59
Changed, 103
CheckBox class, 44
CheckedChanged, 44
CheckedListBox class, 46
Click, 260
Button class, 44
MenuItem class, 58
PictureBox class, 43
ColumnChanged, 157
ColumnChanging, 157
ComboBox class, 47
CurrentChanged, 123
DataTable objects, 157
DateChanged, MonthCalender class, 49
DateSelected, MonthCalender class, 49
DateTimePicker class, 50
DomainUpDown class, 48
DrawItem, MenuItem class, 58
EntryWritten, 313
EventLog class, 313-314
Exited, 309
FormatChanged, DateTimePicker class,
50
ItemActivate, ListView class, 52
ItemChanged, 123
ItemCheck
CheckedListBox class, 46
ListView class, 52
KeyDown, 82
KeyPress, 81-82
KeyUp, 81-82
LinkClicked, LinkLabel class, 41
LinkLabel class, 41
ListBox class, 45
ListView class, 51-52
Load, 223
logging, 79
MenuItem class, 58
MonthCalendar class, 49-50
MouseDown, 14
NumericUpDown class, 48
Paint, 98
PictureBox class, 43
Popup, MenuItem class, 58
PositionChanged, 123
PrintPage, 252
Process class, 309-310
QueryPageSettings, 252
RadioButton class, 44
Resize, 98
RowChanged, 157
RowChanging, 157
RowDeleted, 157
RowDeleting, 157
Scroll, ScrollBar class, 55
Scrollbar, TrackBar class, 54
ScrollBar class, 55
Select, MenuItem class, 58
SelectedIndexChanged, 45-47, 52, 55
SelectedItemChanged, 48
TabControl class, 55
TextBox class, 41-42
TextChanged, TextBox class, 42
Tick, Timer class, 53
Timer class, 53
ToolBar class, 59-60
TrackBar class, 54
TreeView class, 51
UnhandledException, 79
Validating, 83
ValueChanged, 48-50, 55
Events icon, 15
events logs, managing, 313
events models, publisher/subscriber (COM+
components), 223
Everything permission set, 334
ExamName property, 127
exams
adaptive exams, strategies, 465-466
build-list-and-reorder questions,
455-457
How can we make this index more useful? Email us at indexes@quepublishing.com
510 exams
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
case studies, 453-454, 463-464
create-a-tree questions, 457-459
drag-and-connect questions, 458-460
fixed-length exams, strategies, 464-465
formats, 461-463
multiple-choice questions, 454-455
practice exams, taking, 467-468
question handling, strategies, 466-467
readiness, assessing, 451-452
resources, 468
select-and-place questions, 460
short-form exams, strategies, 464-465
testing centers, 452
Exception catch block, 74
exception class, 72-73
ExceptionObject property, 79
exceptions, 72
ArithmeticException catch block, 74
catching, CLS (Common Language
Specification), 75
DivideByZeroException, 74
handling, 73-78
SystemException catch block, 74
throwing, 77
thrown, 278
user input, validating, 80-85
Exceptions dialog box, 278
.exe files, 293, 326
ExectueNonQuery method, 155
executable files, 326
Executable Path static property, 9
ExecuteNonQuery method, 149
ExecuteReader method, 155
ExecuteScalar method, 155
ExecuteXmlReader method, 155
Execution permission set, 334
exhibits, 453
Existing Files page, 236
Exists method, 313
Exit static method, 9
ExitCode property, 309
Exited event, 309
ExitThread static method, 9
ExitTime property, 309
expanding code blocks, 7
expressions
creating, 158
unhandled, 79-80
Extensible Markup Language. See XML
extensions, .asmx, 180
F
F5 key, 6
Fail method, 273
FCL (Framework Class Library), 2, 9, 72
field-level validation, user input, 82-85
fields, 129, 143
File menu commands
Add Existing Item, 179
Compile, 239
New, HTML File, 236
New, Index, 238
New, Project, 6, 236
New, Table of Contents, 237
File Open dialog box, 151, 165
File Signing tool (signcode.exe), 295
File System Editor, 292
File Transfer Protocol (FTP), 175
File Types Editor, 292
file-based data storage, 150
FileDialogPermission, 331
FileDialogPermissionAttribute request, 333
FileIOPermission, 331
files
animation, 235
app.config, 327
<appname>.exe.config, 327-328
.cab (cabinet), 289, 298
.chm, 240
contents, 235
data, XML, 150
description, WSDL, 178
disk files, 150-153
.dll, 293, 326
.exe, 293
executable, 326
flat. See disk files
graphics, 235
grouping. See assemblies
.hhc, 238
.hhp, 238
.htm, 238
HTML Help, 239
index, 235
multimedia, 235
project, Help, 235-236
resource, 194
assembly, 201
.NET assemblies, 109-110
runtime resources, 200-201
Visual Studio .NET IDE, 198, 200
511
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GAC
. . .(Global
. . . .Assembly
. . . . . Cache)
. . . .
rich-text, 293
.rtf, 293
Setup.exe, 291
sound, 235
topic, 235-237
Files tab, 239
FileStream class, 151
FileStream object, 152
Fill methods, 23-24, 155
FillClosedCurve method, 23
filled shapes, forms, 23-24
FillEllipse method, 23
FillPath method, 23
FillPie method, 23
FillPolygon method, 23
FillRectangle method, 23
FillRectangles method, 23
FillRegion method, 23
filtering
client-side, 132
cross-product result-set, queries, 143
data, 129-132
DataView object, 159
final permissions, 336
finally block, 76-77
Find method, 159
Find value, 240
FindRows method, 159
FindString method, ListBox class, 45
FindStringExact method, ListBox class, 45
FirstDayOfWeek property, MonthCalendar
class, 49
fixed-length exams, 461-465
flags, SecurityAction.RequestMinimum, 333
flat files. See disk files
FlatMode property, 128
flexibility, accessibility, 242
Flush method, 152, 273
Focus method, 83
folders
Application, 292
Common Files, 292
Program Files, 292
References, 176
Release, 291
Runtime Security Policy, 298
Startup, 292
System, 292
Font, control property, 36
Font dialog box, 36
Font objects, 36
Font property, 40, 128
Font-Size property, 243
FontDialog dialog box, 56
ForeColor property, 128, 243
foreign key values, 129
Form class, 10-11
Format property, DateTimePicker class, 50
FormatChanged event, DateTimePicker
class, 50
formats
adaptive exams, strategies, 465-466
case studies, strategies, 463-464
exams, 461-463
fixed-length exams, strategies, 464-465
short-form exams, strategies, 464-465
FormBorderStyle property, 10
forms
blank, creating, 6
closing, 83
compiling, 8
controls, adding, 61-64
customizations, storing, 8
displaying, 6
errors, 9
filled shapes, 23-24
methods, 10
multitable, creating, 129
properties, modifying, 6
shapes, drawing, 21-23
single-table, creating, 129
size, measuring, 19
text, drawing, 19-21
forms-based authentication, 337
Framework Class Library (FCL), 2, 9, 72
French translations, 199
FROM clause, 143
FromPage property, PrinterSettings class,
256
FTP (File Transfer Protocol), 175
FullTrust permission, 297, 334
functions
aggregate, 144, 158
Avg, 144
Group, 144
Max, 144
Min, 144
Sum, 144
G
GAC (Global Assembly Cache), 107, 222,
288, 293, 329
shared assemblies, adding, 295-296
viewing, 108-109
How can we make this index more useful? Email us at indexes@quepublishing.com
512 GacUtil.exe (Global Assembly Cache tool)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
GacUtil.exe (Global Assembly Cache tool),
296
GDI+ (Graphics Device Interface), namespaces, 17
General User Interface, 242
get accessors, 12
GetChanges method, 156
GetComputerName method, 223
GetCurrent method, 338
GetElementsByTagName method, 164
GetError method, 84
GetEventLogs method, 313
GetItemProperties method, 123
GetObject method, 200
GetProcessById method, 309
GetProcesses method, 309
GetProcessesByName method, 309
GetRandomNumber() method, 96
GetString method, 200
GetTextElementEnumerator() method, 204
GetXml method, 156
GetXmlSchema method, 156
Global Assembly Cache (GAC), 107, 222,
288, 293, 329
shared assemblies, adding, 295-296
viewing, 108-109
Global Assembly Cache tool (GacUtil.exe),
296
globalization, 110
character encodings, 201
localization, 192-194, 198
localization process, 192-193
user input, managing, 203-205
user interface mirroring, 202-203
granting permissions, code access security,
334-336
Graphics class
DrawString method, 253
Graphics object, 18
Graphics Device Interface (GDI+), namespaces, 17
graphics files, 235
Graphics object
retrieving, 18
System.Drawing namespace, 17-18
forms, drawing shapes, 21-23
forms, drawing text, 19-21
forms, filled shapes, 23-24
Graphics property, PrintPageEventArgs
class, 255
Graphics.FromHwnd() method, 18
Graphics.FromImage() method, 18
GridlineColor property, 128
GridlineStyle property, 128
GROUP BY clause, aggregate functions,
144
GroupBox class, properties, 39
GroupBox control, 38-40, 103
grouping
classes, 4
controls, 38-39
files. See assemblies
groups
code groups, 333-335
Debugger Users, 278
H
Handle property, 10
Handled properties, 81-82
handling exceptions, 73-78
HasExited property, 309
HasMorePages property,
PrintPageEventArgs class, 255
HatchBrush class, 24
HAVING clause, 144
HeaderBackColor property, 128
HeaderFont property, 128
HeaderForeColor property, 128
Height, control property, 37
Help
displaying, 240
pop-up help, 241
Robohelp, 235
Help buttons, displaying, 241
Help class, 240
/help option (Type Library Importer Tool),
221
Help project files, 235-236
Help topic files, 236-237
HelpButton property, 10, 241
HelpLink property, 73
HelpNamespace property, 240
HelpNavigator property, values, 240
HelpProvider component, 240-241
HelpString property, 241
.hhc file, 238
.hhp file, 238
Hide() method, 11
hierarchies, nodes, 50
High Contrast mode, 244
HighQuality member (SmoothingMode
property), 23
HighSpeed member (SmoothingMode
property), 23
Hit Count buttons, 277
513
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .interfaces
. . . . .
HScrollBar control, 54-55
.htm file, 238
HTML Help, 234
files, 239
HTML Help project files, 236
HTML Help topic files, 236-237
indexes, creating, 238
SDK (Software Development Kit), 235
solution, 235
table of contents, creating, 237
HTML Help ActiveX Control, 235
HTML Help Authoring Guide, 235
HTML Help Compiler, 235
HTML Help file (.hhp) project, 238
HTML Help Image Editor, 235
HTML Help Java Applet, 235
HTML Help Viewer, 235
HTML Help Workshop, 235-236
HTTP (Hypertext Transfer Protocol), 175
human-interaction testing, 270
hyperlinks
ActiveX Properties, 218
Help topic files, 237
Hypertext Transfer Protocol (HTTP), 175
I
IBindingList interface, 121
Icon property, 10, 59, 84
icons
Events, 15
Show All Files, 176
Id property, 309
IDE (integrated development environment),
2, 275
IDENTITY constraint, 148
identity permissions, 330
#if directive, 275
IIF function, 158
IList interface, 121
Image property, 40, 43-44
ImageList property
TabControl class, 55
ToolBar class, 60
TreeView class, 51
immediate signing, shared assemblies, 294
Immediate window, 279
imperative security, 336
implementing printing (PrintDocument
class), 252
Import button, 335
importing metadata, COM components,
220
IN keyword, 158
Increment method, 315
Increment property, NumericUpDown
class, 48
IncrementBy method, 316
Indent method, 273
IndentLevel property, 273
IndentSize property, 273
index files, 235
Index value, 240
indexes, 238-239
indexing string, 203-204
information, processes, 312
inheritance
.NET Framework, 3
System.Windows.Forms.UpDownBase
class, 47
visual, 13, 103-105
Visual Studio .NET, 3
Inheritance Picker dialog box, 13, 104
InitialDisplay property, 241
InitializeComponent method, 104
InitializeComponent() method, 8
InnerException property, 73
input
keyboards, accessibility, 243
methods, 242
mouse, accessibility, 243
user, managing, 203-205
Insert Keyword command (Edit menu), 238
INSERT statement, 145
Insert Topic command (Edit menu), 238
InsertCommand property, 156
Install method, 296
installations
administrative installation (deployment
method), 299
components, 296-297
rolling back, 288
InstalledPrinters property, PrinterSettings
class, 256
Installer class, methods, 296
Installer tool (InstallUtil.exe), 297
InstallUtil.exe (Installer tool), 297
InstanceName property, 316
integrated development environment (IDE),
2, 275
integration testing, 271-272
IntelliSense, 8
interfaces. See also UI (user interface)
General User Interface, 242
IBindingList, 121
IList, 121
How can we make this index more useful? Email us at indexes@quepublishing.com
514 interfaces
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ITypedList, 121
preview, 259
users, 94
complex data binding, 124-128
data binding, 120, 129
one-way data binding, 129
simple data binding, 120-124
two-way data binding, 129
internal access modifier, 4
international applications, testing, 272
Internet permission, 297, 334
Internet_Zone, 297
Interval property, Timer class, 53
Invalid member (SmoothingMode
property), 23
Invalidate() method, 20
Invariant culture, 196
Invoke button, 182
invoking Web Services, 178
IsDefaultPrinter property, PrinterSettings
class, 256
IsInRole method, arguments, 338-339
IsInRole(Integer) argument, 339
IsInRole(String) argument, 338
IsInRole(WindowsBuiltInRole) argument,
338
IsMdiContainer property, 61
ISNULL function, 158
IsNull method, 160
IsolatedStorageFilePermission, 331
IsolatedStoragePermission, 331
IsPlotter property, PrinterSettings class, 256
IsTerminating property, 79
IsValid property, PrinterSettings class, 256
Item property, 159
ItemActivate event, ListView class, 52
ItemChanged event, 123
ItemCheck event
CheckedListBox class, 46
ListView class, 52
ItemHeight property, ListBox class, 45
Items property, 124
ComboBox class, 47
DomainUpDown class, 48
ListBox class, 45
ListView class, 52
ITypedList interface, 121
J-K
JIT (Just In Time) debugging error, 329
JIT-Compiled (Just-In-Time) .NET
assemblies, 108
keyboard focus, accessibility, 242
keyboard input, accessibility, 243
keyboard shortcuts, Text property, 38
keyboards, On-Screen Keyboard, 242
KeyChar properties, 81
KeyCode property, 82
/keycontainer:containerName option (Type
Library Importer Tool), 221
KeyData property, 82
KeyDown event, 82
KeyEventArgs class, properties, 82
/keyfile:filename option (Type Library
Importer Tool), 221
KeyPress event, 81-82
KeyPressEventArgs class, properties, 81
keys
F5, 6
private, shared assemblies, 294
public, shared assemblies, 294
Tab, 37
keystroke-level validation, user input, 81-82
KeyUp event, 81-82
KeyValue property, 82
Keyword dialog box, 238
KeywordIndex value, 240
keywords
checked/unchecked, 76
expressions, creating, 158
LIKE, 144
searching, 239
Kill method, 308-312
L
Label box, 37
Label class, properties, 40
Label control, 40-41, 310
Landscape property, PageSettings class, 255
LandscapeAngle property, PrinterSettings
class, 256
/language:LanguageCode command-line
option (wsdl.exe), 179
languages. See also T-SQL (Transact-SQL)
C#, 2
WSDL (Web Services Description
Language), 175
LargeChange property, 54-55
LargeImageList property, ListView class, 52
Last one wins concurrency control, 165
Launch button, 311
Launch Conditions Editor, 293
layout, accessibility, 243
515
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MaximumPage
. . . . . . . . property
. . . . .
LayoutMdi property, 61
lbInfo ListBox control, 194
lblLiveCalculators Label control, 310
legacy code
ActiveX controls, 214-219
COM components, 219-222
COM+ components, 222
PInvoke (Platform Invoke), 223-224
LEN function, 158
Length property, 152
Level property, 274
LevelFinal property, 336
levels, final permissions, 336
libraries, MyCustomer, 222
LicenseProvider object, 326
LIKE keyword, 144, 158
#line directive, 275
LinearGradientBrush class, 24
LineJoin property, 22
LinkArea property, LinkLabel class, 41
LinkBehavior property, LinkLabel class, 41
LinkClicked event, LinkLabel class, 41
LinkColor property, 41, 128
linking Help topic files, 237
LinkLabel class, 41
LinkLabel control, 40-41
links
Add a Child Code Group, 335
method, 181
Links property, LinkLabel class, 41
List property, 123
ListBox class, 45
ListBox control, 44-46, 80, 124, 194
ListControl class, 44-46
listener objects, 273
listeners, trace, 273
Listeners property, 273
ListView class, 51-52
ListView control, 50-52
Load event, 223
Load method, 164
LoadXml method, 164
local systems
event logs, 314
processes, starting/stopping, 309
LocalIntranet permission, 297, 334
LocalIntranet_Zone, 297
localizability, 193
localization
localizability, 193
process, 192-193
thread-by-thread, 196
UI (user interface), 193
cultures, 194-197
resource files, 194, 198-201
localized information, cultures, 196-197
localized settings, cultures, 200
Locals window, 279
Location, control property, 37
Log property, 313
LogDisplayName property, 313
logging events, 79
logic, storing, 83
LogNameFromSourceName method, 313
logo certification, 299
logs, Event Logs, 130
accessing, 314
Application, 313
EntryWritten, 314
managing, 313
Security, 313
System, 313
Window, 79
M
machine-wide configured assemblies, managing, 329
MachineName property, 312-313, 316
Magnifier, 242
Main method, 204, 257
MainMenu class, 57
MainModule property, 312
MainWindowTitle property, 312
managed code, 219
managing, user input, 203-205
manifest, assemblies, 294
MarginBounds property,
PrintPageEventArgs class, 255
Margins property, PageSettings class, 255
Max aggregate function, 158
Max function, 144
MaxDate property, 49-50
MaxDropDownItems property, ComboBox
class, 47
MaximizeBox property, 10, 241
Maximum property
NumericUpDown class, 48
ProgressBar class, 54
ScrollBar class, 55
TrackBar class, 54
MaximumCopes property, PrinterSettings
class, 256
MaximumPage property, PrinterSettings
class, 256
How can we make this index more useful? Email us at indexes@quepublishing.com
516 MaximumSize property
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MaximumSize property, 10
MaxLength property, 47, 81, 160
MaxSelectionCount property,
MonthCalendar class, 49
MDI (multiple-document interface)
applications, 60-61
MdiChildren property, 61
MdiParent property, 61
measuring form size, 19
members
SmoothingMode property, 23
static, classes, 3
MenuItem class, 57-58
MenuItems property, MenuItem class, 58
menus, 57-60
Merge method, 156
Merge Module Projects, 289
Message property, 73
message queues, 130
MessageQueuePermission, 331
messages, SOAP (Simple Object Access
Protocols), 175
metadata
assemblies, 105
COM components, 220
method links, 181
methods
AcceptChanges, 156
Add, parameters, 162
AddNew, 123, 159
Array.Sort, 205
Assert, 272
BeginEdit, 160
BeginTransaction, 154
BindingManagerBase class, 123
CancelCurrentEdit, 123
CancelEdit, 160
Clear, 156-157
Close, 152-154, 272-273, 315
Close(), 11
CloseMainWindow, 308-312
Commit, 296
Contains, 124
Create, 316
CreateAttribute, 164
CreateCommand, 154
CreateElement, 164
CreateEventsource, 313-314
CreateGraphics(), 18
CreateNode, 164
CreateParameter, 155
DataReader.Close, 155
DataRow object, 160
DataSet object, 156
DataTable objects, 157
DataView object, 159
Debug methods, 272-273
Decrement, 315
Delete, 159-160, 313
DeleteEventSource, 313
deployment, 298-299
Draw, 21-23
DrawArc, 21
DrawBezier, 21
DrawBeziers, 21
DrawCloseCurve, 21
DrawCurve, 21
DrawEllipse, 21
DrawIcon, 21
DrawImage, 21
DrawLine, 21
DrawLines, 21
DrawPath, 21
DrawPie, 21
DrawPolygon, 21
DrawRectangle, 21
DrawRectangles, 21
DrawString, 21, 253
DrawString(), 19-20
EndCurrentEdit, 123
EndEdit, 160
ErrorProvider class, 84
event handlers, 102
EventLog class, 313-314
ExecuteNonQuery, 149, 155
ExecuteReader, 155
ExecuteScalar, 155
ExecuteXmlReader, 155
Exists, 313
Fail, 273
FileStream object, 152
Fill, 23-24, 155
FillClosedCurve, 23
FillEllipse, 23
FillPath, 23
FillPie, 23
FillPolygon, 23
FillRectangles, 23
FillRegion, 23
Find, 159
FindRows, 159
FindString, ListBox class, 45
FindStringExact, ListBox class, 45
Flush, 152, 273
Focus, 83
forms, 10
517
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Microsoft
. . . . . certification
. . . . . . .exams
. . .
GetChanges, 156
GetComputerName, 223
GetCurrent, 338
GetElementsByTagName, 164
GetError, 84
GetEventLogs, 313
GetItemProperties, 123
GetObject, 200
GetProcessById, 309
GetProcesses, 309
GetProcessesByName, 309
GetRandomNumber(), 96
GetString, 200
GetTextElementEnumerator(), 204
GetXml, 156
GetXmlSchema, 156
Graphics.FromHwnd(), 18
Graphics.FromImage(), 18
Hide(), 11
Increment, 315
IncrementBy, 316
Indent, 273
InitializeComponent(), 8
InitializeComponent, 104
input, 242
Install, 296
Installer class, 296
Invalidate(), 20
IsInRole, arguments, 338-339
IsNull, 160
Kill, 308-312
ListBox class, 45
Load, 164
LoadXml, 164
LogNameFromSourceName, 313
Main, 204, 257
MenuItem class, 58
Merge, 156
MoveNext(), 204
NewRow, 157
NextSample, 316
NextValue, 316
Open, 154
output, 242
Paint, 94
PerformanceCounter class, 315-316
PerformClick, MenuItem class, 58
Position, 127
Print, 252
Process class, 309-310
protected, base classes (event handling),
16-17
Read, 152
ReadByte, 152
ReadXml, 156
ReadXmlSchema, 156
Refresh, 123
RemoveAt, 123
RemoveInstance, 316
ResumeBinding, 123
Rollback, 296
Save, 164
Seek, 152
Select, 157-158
SendToBack, ToolBar class, 60
SetError, 84
SetIconAlignment, 84
SetIconPadding, 84
Show(), 10, 20
ShowDialog, 57
ShowHelp, 240
ShowHelpIndex, 240
SortKey.Compare, 205
SourceExists, 314
SqlCommand, 154-155
SqlConnection object, 154
SqlDataAdapter object, 155-156
Start, 53, 308-312
static methods, 9
Stop, Timer class, 53
String.Compare, 205
SuspendBinding, 123
Timer class, 53
ToolBar class, 59-60
Trace methods, 272-273
Unindent, 273
Uninstall, 296
Update, 156
WaitForExit, 310
WaitForInputIdle, 310
Web, 180
Write, 152, 273
WriteByte, 152
WriteEntry, 314
WriteIf, 273
WriteLine, 273
WriteLineIf, 273
WriteTo, 164
WriteXml, 156
WriteXmlSchema, 156
XmlDocument class, 164
Microsoft certification exams
adaptive exams, strategies, 465-466
build-list-and-reorder questions,
455-457
case studies, 453-454, 463-464
How can we make this index more useful? Email us at indexes@quepublishing.com
518 Microsoft certification exams
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
create-a-tree questions, 457-459
drag-and-connect questions, 458-460
fixed-length exams, strategies, 464-465
formats, 461-463
multiple-choice questions, 454-455
practice exams, taking, 467-468
question handling, strategies, 466-467
readiness, assessing, 451-452
resources, 468
select-and-place questions, 460
short-form exams, strategies, 464-465
testing centers, 452
Microsoft Certified Professional pages,
468-469
Microsoft Intermediate Language (MSIL)
Disassembler, 105-106
Microsoft Management Console (MMC)
utility, 328
Microsoft Passport, 337
Microsoft Web site, 299, 468
Microsoft Windows Explorer, 295
Microsoft Windows Installer, 288, 291, 295
Min aggregate function, 158
Min function, 144
MinDate property, 49-50
MinimizeBox property, 10, 241
minimum permissions, code access security,
332-333
Minimum property, 48, 54-55
MinimumPage property, PrinterSettings
class, 256
MinimumSize property, 10
mirroring user interfaces, 202-203
MMC (Microsoft Management Console)
utility, 328
modal dialog boxes, 57
Modal property, 10
modeless dialog boxes, 57
models
ADO.NET Object Model
data provider objects, 153-155
DataSet object, 156-162
data, data sources, 129
events, publisher/subscriber (COM+
components), 223
publisher-subscriber, 102
security, zones, 297-298
modes
Debug, 275-276
High Contrast, 244
Release, compiled applications, 272
ModifiedCurrent value
(DataViewRowState), 158
ModifiedOriginal value
(DataViewRowState), 158
modifiers, access, 3
Modifiers property, 82
modifying form properties, 6
modules
code, 336
unit testing, 271
Modules property, 312
monitoring performance, 315-316
MonthCalendar class, 49-50
MonthCalendar control, 49-50
mouse input, accessibility, 243
MouseDown event, 14
MouseEventArgs type, properties, 16
MoveNext() method, 204
.msi (Microsoft Windows Installer), 288
MSIEXEC command, 299
MSIL (Microsoft Intermediate Language)
Dissassembler, 105-106
MultiColumn property, ListBox class, 45
multifile .NET assemblies, 107
MultiLine property
TabControl class, 55
TextBox class, 42
multimedia files, 235
multiple catch blocks, 74
multiple data sources, controls, 125-127
multiple records, statements, 145
multiple-choice questions, exam format,
454-455
multiple-document interface (MDI)
applications, 60-61
MultiSelect property, ListView class, 52
multitable forms, creating, 129
multitasking, accessibility, 243
MyCustomer library, 222
My_Computer_Zone, 297
N
Name property, 10, 37
names, properties (ActiveX controls), 219
/namespace:Namespace command-line
option (wsdl.exe), 179
/namespace:namespace option (Type
Library Importer Tool), 221
namespaces
classes, 4
drawing shapes (forms), 21-23
drawing text (forms), 19-21
filled shapes (forms), 19, 23-24
GDI+ (Graphics Device Interface), 17
519
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . objects
. . . .
naming, 4
.NET Framework, 4-5
System.ComponentModel, 94
System.Drawing, Graphics object, 17-19
System.IO, classes, 151
System.Reflection.Emit, 107
System.Text, Encoding subclasses, 202
System.Windows.Forms, 94
Systems.Diagnostics, 308
Visual Studio .NET, 4-5
naming
namespaces, 4
.NET assemblies, 108
XML tags, 163
native .NET assemblies, 108
.NET application, 147
.NET assemblies, 105-110
.NET components
Component class, creating, 94-97
Control class, creating, 94, 98-99
creating, 94-95
UserControl class, creating, 94, 99-105
.NET Connected, 299
.NET Framework, 291
classes, 2
code development, 2
inheritance, 3
namespaces, 4-5
objects, 2
.NET Framework Components tab, 97
.NET Framework Configuration tool, 295,
328-329, 334
network download (deployment method),
298
neutral culture codes, 194
New Breakpoint dialog box, 277
New Breakpoint option, 277
New Project button, 6
New Project Wizard, 236
New, HTML File command (File menu),
236
New, Index command (File menu), 238
New, Project command (File menu), 6, 236
New, Table of Contents command (File
menu), 237
NewRow method, 157
NextSample method, 316
NextValue method, 316
No FileDialog permission, 335
nodes
Code Groups, 335
Data Connections, 130-131, 147-149
hierarchies, 50
Performance Counters, 317
Permission Sets, 335
References, 215, 221-222
Runtime Security, 336
Runtime Security Policy, 335
User, 335
Nodes property, TreeView class, 51
/nologo option (Type Library Importer
Tool), 221
None member (SmoothingMode property),
23
None value (DataViewRowState), 158
Northwind database, 131
NOT keyword, 158
Nothing permission set, 334
NumericUpDown class, 48
NumericUpDown control, 47-48
O
object pooling (COM+ components), 222
object reusability (COM+ components), 222
objects
Binding, 120
BindingContext, 122
BooleanSwitch, 274
Brush, 23-24
C#, 2
CancelEventArgs, 83
Command, 154-155
Connection, 154
CultureInfo, 195
CultureInfo.CompareInfo, 205
CurrencyManager, 122
data provider, 153-155
DataAdapter, 155
DataColumn, 160
DataReader, 155
DataRelation, 131, 158
DataRow, 159-160
DataSet, 156-162
DataTable, 131, 157-159
DataView, 131, 159
EventLog, 314
EventLogEntryCollection, 314
FileStream, 152
Font, 36
Graphics
retrieving, 18
System.Drawing namespace, 17-24
LicenseProvider, 326
How can we make this index more useful? Email us at indexes@quepublishing.com
520 objects
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
listener, 273
.NET Framework, 2
PageSettings, 255
Parameter, 154-155
Pen, 21-22
PlaceFacts, 178
SqlCommand, 149, 154-155
SqlConnection, 130, 154
SqlDataAdapter, 130, 155-156, 165
SqlError, 165
StringBuilder, 223
TerraService, 178
TraceSwitch, 274
Visual Studio .NET, 2
WindowsIdentity, 337-339
WindowsPrincipal, 337-339
OLEDB data provider, 153
OleDbPermission, 331
On-Screen Keyboard, 242
one-way data binding, user interfaces, 129
Opacity property, 10
Open button, 104
Open method, 154
Open With dialog box, 105
OpenFileDialog class, 150
OpenFileDialog dialog box, 56
Optimistic concurrency control, 166
Options button, 238-239
OR keyword, 158
ordering controls, Z-order, 34
Orientation property, TrackBar class, 54
OriginalRows value (DataViewRowState),
158
OSQL, 146
/out:Filename command-line option
(wsdl.exe), 179
/out:filename option (Type Library
Importer Tool), 221
Output Filename option, 292
output methods, 242
overriding protected methods, base classes
(event handling), 16-17
OwnerDraw property, MenuItem class, 58
P
Package Files option, 292
Page Setup button, 258
Page Setup dialog box, 258
PageBounds property, PrintPageEventArgs
class, 255
pages, Existing Files, 236
PageSettings class, properties, 255
PageSettings object, 255
PageSettings property, PrintPageEventArgs
class, 255
PageSetupDialog component, 258-259
PageSetupDialog dialog box, 56
Paint event, 98
Paint event handler, 20
Paint method, 94
PaintEventArgs argument, 18
Panel class, properties, 39
Panel control, 38-40
Panels property, StatusBar control, 59
PaperSize property, PageSettings class, 255
PaperSizes property, PrinterSettings class,
256
PaperSource property, PageSettings class,
255
PaperSources property, PrinterSettings
class, 256
Parameter object, 154-155
parameters, Add method, 162
Parameters property, 155
parent container control, forms, 61
Parent property, MenuItem class, 58
parent windows, 60
ParentColumns property, 159
ParentKeyConstraint property, 159
ParentRelations property, 157
ParentRowsForeColor property, 128
ParentRowsLabelStyle property, 128
ParentRowsVisible property, 128
ParentTable property, 159
Passport, 337
/password:Password command-line option
(wsdl.exe), 179
PasswordChar property, TextBox class, 42
Pen class, 22
Pen object, 21-22
PenType property, 22
perfmon.exe utility, 316
performance
ActiveX controls, 219
monitoring, 315-316
Performance Counters, 130, 315-317
Performance Monitor, 316
PerformanceCounter class, 315-316
PerformanceCounterCategory, 316
PerformanceCounterPermission, 331
PerformClick method, MenuItem class, 58
permission sets, code access security, 334
Permission Sets node, 335
521
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Process
. . . . class
. . .
permissions
code access, 330-336
DirectoryServicesPermission, 331
DnsPermission, 331
EnvironmentPermission, 331
EventLogPermission, 331
FileDialogPermission, 331
FileIOPermission, 331
final, 336
FullTrust, 297
identity, 330
Internet, 297
IsolatedStorageFilePermission, 331
IsolatedStoragePermission, 331
LocalIntranet, 297
MessageQueuePermission, 331
minimum, code access security, 332-333
No FileDialog, 335
OleDbPermission, 331
PerformanceCounterPermission, 331
PrincipalPermission, 332
PrintingPermission, 331
PublisherIdentityPermission, 332
ReflectionPermission, 331
RegistryPermission, 331
role-based, 330
Security, 331
ServiceControllerPermission, 331
SiteIdentityPermission, 332
SocketPermission, 331
SqlClientPermission, 332
StrongNameIdentityPermission, 332
UIPermission, 332
URLIdentityPermission, 332
WebPermission, 332
ZoneIdentityPermission, 332
PictureBox class, 43
PictureBox control, 43, 54
PID (process identifier), 308
PInvoke (Platform Invoke), 223-224
PlaceFacts object, 178
Platform Invoke (PInvoke), 223-224
plus sign (+), 7, 158, 327
Point structure (System.Drawing
namespace), 19
PointF structure (System.Drawing
namespace), 19
pooling, object pooling (COM+
components), 222
pop-up help, 241
Popup event, MenuItem class, 58
Position method, 127
Position property, 123, 152
PositionChanged event, 123
pound sign (#), 158
practice exams, taking, 467-468
PreferredColumnWidth property, 128
PreferredRowHeight property, 128
preprocessing directives, 275
Preview button, 259-260
preview interface, PrintPreviewDialog
component, 259
PRIMARY KEY constraint, 148
/primary option (Type Library Importer
Tool), 221
PrimaryKey property, 157
PrincipalPermission, 332, 339
PrincipalPermissionAttribute attribute, 339
Print method, 252
PrintDialog component, 261
PrintDialog dialog box, 56
PrintDocument class, 252-256
Printer button, 261
PrinterName property, PrinterSettings
class, 256
PrinterResolution property, PageSettings
class, 255
PrinterResolutions property, PrinterSettings
class, 256
PrinterSettings class, properties, 256
PrinterSettings property, PageSettings class,
255
printing
implementing (PrintDocument class),
252
PrintDocument class, 252-256
PrintPageEventArgs class, properties,
255
printing controls, 257-261
PrintingPermission, 331
PrintPage event, 252
PrintPageEventArgs class, 255
PrintPreviewControl control, 260-261
PrintPreviewDialog component, 259-260
PrintPreviewDialog dialog box, 56
PrintRange property, PrinterSettings class,
256
PrintToFile property, PrinterSettings class,
256
PriorityClass property, 312
private .NET assemblies, 107-109
private access modifier, 3
private keys, shared assemblies, 294
private UDDI registries, 175
Process class, 308-312
How can we make this index more useful? Email us at indexes@quepublishing.com
522 process identifier (PID)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
process identifier (PID), 308
processes, running, 278-279
Processes dialog box, 278
processing, transactional (COM+
components), 223
ProcessName property, 312
ProcessorAffinity property, 312
ProductName static property, 9
ProductVersion static property, 9
Program Files folder, 292
ProgressBar class, properties, 54
ProgressBar control, 53-54
project files, Help, 235-236
Project Summary screen, 290
Project tab, 239
Project Types tree, 289
ProjectInstaller class, 296
projects
Cab Projects, 289
HTML Help file (.hhp), 238
Merge Module Projects, 289
Setup and Deployment, 288-289
Setup Projects, 289-293
Web Setup Projects, 289
Projects tab, 238
prompts, command prompts, 178
properties
AcceptsReturn, TextBox class, 41
AccessibleDescription, 243
AccessibleName, 243
AccessibleRole, 243
accessors, 12
Activation, ListView class, 51
ActiveLinkColor, LinkLabel class, 41
ActiveMdiChild, 61
Alignment, 22, 55, 59
AllowDbNull*, 160
AllowDelete, 159
AllowEdit, 159
AllowMargins, 258
AllowNew, 159
AllowOrientation, 258
AllowPaper, 259
AllowPrinter, 259
Alt, 82
AlternatingBackColor, 128
AutoCheck, 44
AutoFlush, 272
AutoIncrement, 160
AutomaticDelay, 241
AutoPopDelay, 241
AutoScroll, 39
AutoSize, 59
AutoZoom, 261
BackColor, 10, 128, 243
Background Color, 128
BackgroundImage, 10, 243
BindingContext, 127
BindingManagerBase class, 123
Bindings, 123
BlinkRate, 84
BlinkStyle, 84
BorderStyle, 59, 128
Bounds, 255
Brush, 22
Button class, 44
Button, 16
Buttons, 59
CalendarDimensions, 49
Cancel, 83, 255
CanDuplex, 256
CanRead, 152
CanSeek, 152
CanWrite, 152
CaptionBackColor, 128
CaptionFont, 128
CaptionText, 128
CaptionVisible, 128
CategoryName, 315
CausesValidation, 83
CharacterCasing, 41, 81
CheckBox class, 44
CheckBoxes, 51-52
Checked, 44, 58
CheckedIndices, 46, 52
CheckedItems, 46
CheckedListBox class, 46
CheckItems, 52
CheckState, 44
ChildColumns, 159
ChildKeyConstraint, 159
ChildRelations, 157
ChildTable, 159
classes, 3
Clicks, 16
ClientSize, 10
Collate, 256
Color, 22, 255
ColumnHeadersVisible, 128
ColumnName, 160
Columns, 157, 264
ColumnWidth, 45
ComboBox class, 47
CommandText, 154
CommandType, 154
523
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .properties
. . . . .
Condition, 293
Connection, 155
ConnectionString, 154
Constraints, 157
ContainerControl, 84
Control, 82
Control.Object, 34
control-based validation (user input), 80
ControlBox, 10
controls
accessibility, 243-244
Anchor, 35
Dock, 35
Enabled, 35
Font, 36
GroupBox class, 39
Height, 37
Location, 37
modifying, 34
Name, 37
Panel class, 39
Size, 37
TabIndex, 37
TabStop, 37
Text, 37
Visible, 38
Width, 37
Copies, 256
Count, 123, 159
CounterHelp, 315
CounterName, 315
CounterType, 315
Current, 123
CurrentCulture, 196
CurrentUICulture, 196
custom, 11-12
CustomFormat, 50
DashCap, 22
DashPattern, 22
DashStyle, 22
DataBinding, 120
DataColumn object, 160
DataGrid control, 128
DataRelation object, 159
DataRow object, 160
DataSet object, 156
DataTable object, 157
DataType, 160
DataView object, 159
DateTimePicker class, 50
Debug methods, 272-273
DefaultPageSettings, 256
DefaultValue, 160
DeleteCommand, 155
Delta, 16
description, 274
DesktopLocation, 10
DetectUrls, 42
DisabledLinkColor, 41
DisplayName, 274
DocumentElement, 164
DomainUpDown class, 48
DrawMode, 47
DropDownStyle, 47
DropDownWidth, 47
Duplex, 256
dynamic, configuring, 326-328
Enabled, 10, 53, 58
EnableRaisingEvents, 309, 313
EndCap, 22
Entries, 313-314
Error, 165
ErrorProvider class, 84
EventLog class, 313-314
ExamName, 127
exception class, 73
ExceptObject, 79
ExitCode, 309
ExitTime, 309
FileStream object, 152
FirstDayOfWeek, 49
FlatMode, 128
Font, 40, 128
Font-Size, 243
ForeColor, 128, 243
Form class, 10
Format, 50
FormBorderStyle, 10
forms, modifying, 6
FromPage, 256
Graphics, 255
GridlineColor, 128
GridlineStyle, 128
GroupBox class, 39
Handle, 10
Handled, 81-82
HasExited, 309
HasMorePages, 255
HeaderBackColor, 128
HeaderFont, 128
HeaderForeColor, 128
HelpButton, 10, 241
HelpLink, 73
HelpNamespace, 240
How can we make this index more useful? Email us at indexes@quepublishing.com
524 properties
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
HelpNavigator, values, 240
HelpString, 241
Icon, 10, 59, 84
Id, 309
Image, 40, 43-44
ImageList, 51, 55, 60
Increment, 48
IndentLevel, 273
IndentSize, 273
InitialDisplay, 241
InnerException, 73
InsertCommand, 156
InstalledPrinters, 256
InstanceName, 316
Interval, Timer class, 53
IsDefaultPrinter, 256
IsMdiContainer, 61
IsPlotter, 256
IsTerminating, 79
IsValid, 256
Item, 159
Items, 124
ComboBox class, 47
DomainUpDown class, 48
ListBox class, 45
ListView class, 52
ItemHeight, ListBox class, 45
KeyChar, 81
KeyCode, 82
KeyData, 82
KeyEventArgs class, 82
KeyPressEventArgs class, 81
KeyValue, 82
Label class, 40
Landscape, 255-256
LargeChange, 54-55
LargeItemList, ListView class, 52
LayoutMdi, 61
Length, 152
Level, 274
LevelFinal, 336
LineJoin, 22
LinkArea, 41
LinkBehavior, 41
LinkColor, 41, 128
LinkLabel class, 41
Links, 41
List, 123
ListBox class, 45
Listeners, 273
ListView class, 51-52
Log, 313
LogDisplayName, 313
MachineName, 313, 316
MainWindowTitle, 312
MarginBounds, 255
Margins, 255
MaxDate, 49-50
MaxDropDownItems, 47
MaximizeBox, 10, 241
Maximum, 48, 54-55
MaximumCopies, 256
MaximumPage, 256
MaximumSize, 10
MaxLength, 47, 81, 160
MaxSelectionCount, 49
MdiChildActivate, 61
MdiChildren, 61
MdiParent, 61
Menuitems, 58
Message, 73
MinDate, 49-50
MinimizeBox, 10, 241
Minimum, 48, 54-55
MinimumPage, 256
MinimumSize, 10
Modal, 10
Modifiers, 82
Modules, 312
MonthCalendar class, 49-50
MouseEventArgs type, 16
MultiColumn, 45
MultiLine, 42, 55
MultiSelect, 52
Name, 10
names, ActiveX controls, 219
Nodes, 51
NumericUpDown class, 48
Opacity, 10
Orientation, 54
OwnerDraw, 58
PageBounds, 255
PageSettings, 255
PageSetupDialog component, 258
Panel class, 39, 59
PaperSize, 255-256
PaperSource, 255-256
Parameters, 155
Parent, 58
ParentColumns, 159
ParentKeyConstraint, 159
ParentRelations, 157
ParentRowsForeColor, 128
ParentRowsLabelStyle, 128
525
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .properties
. . . . .
ParentRowsVisible, 128
ParentTable, 159
PasswordChar, 42
Pen object, 22
PenType, 22
PerformanceCounter class, 315-316
PictureBox class, 43
Position, 123, 152
PreferredColumnWidth, 128
PreferredRowHeight, 128
PrimaryKey, 157
PrinterName, 256
PrinterResolution, 255-256
PrinterSettings, 255-256
PrintPageEventArgs class, 255
PrintPreviewControl control, 261
PrintRange, 256
PrintToFile, 256
PriorityClass, 312
Process class, 309-312
ProcessName, 312
ProcessorAffinity, 312
ProgressBar class, 54
RadioButton class, 44
RadioCheck, MenuItem class, 58
RawValue, 316
ReadOnly, 42, 48, 316
RelationName, 159
Relations, 156
ReshowDelay, 241
ResizeRedraw, 21
Responding, 312
RichTextBox class, 42
RightToLeft, 203
RowHeadersVisible, 128
RowHeaderWidth, 128
Rows, 157, 261
RowState, 160
Rtf, 42
Scrollable, 51-52
ScrollBar class, 42, 55
SelectedIndex, 45-48, 55
SelectedIndices, 45, 52
SelectedItem, 45-48
SelectedItems, 45, 52
SelectedNode, 51
SelectedRtf, 42
SelectedTab, 55
SelectedText, 47
SelectionBackColor, 128
SelectionColor, 42
SelectionEnd, 49
SelectionFont, 42
SelectionForeColor, 128
SelectionMode, 45-46
SelectionRange, 49
SelectionStart, 49
Shift, 82
Shortcut, 58
ShowCheckBox, 50
ShowInTaskbar, 10
ShowToday, 50
ShowTodayCircle, 50
ShowToolTips, 60
ShowUpDown, 50
ShowWeekNumbers, 50
simple data binding, 121-122
simple, 327
Size, 10
SizeMode, 43
SmallChange, 54-55
SmallImageList, 52
SmoothingMode, 22-23
Sort, 159
Sorted, 45-48, 51-52
Sorting, 52
Source, 73, 314
SqlCommand, 154-155
SqlConnection object, 154
SqlDataAdapter object, 155-156
StackTrace, 73
StandardError, 312
StandardInput, 312
StandardOutput, 312
StartCap, 22
StartInfo, 309
StartPage, 261
StartPosition, 10
StartTime, 312
static properties, 9
StatusBarPanel class, 59
Style, 59
SupportsColor, 256
TabControl class, 55
TabCount, 55
TabIndex, 244
TableName, 157
Tables, 156
TabPages, 55
TargetSite, 73
Text, 244
Button class, 44
CheckBox class, 44
GroupBox class, 39
How can we make this index more useful? Email us at indexes@quepublishing.com
526 properties
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Label class, 40
MenuItem class, 58
RadioButton class, 44
TextBox class, 42
TextAlign, 40
TextBox class, 41-42
TextChanged, 42
ThousandsSeparator, 48
Threads, 312
ThreeState, 44
TickFrequency, 54
TickStyle, 54
Timer class, 53
TodayDate, 50
ToolBar class, 59-60
ToolTipText, 59
ToPage, 256
TopMost, 10
TotalProcessorTime, 312
Trace methods, 272-273
TraceError, 274
TraceInfo, 274
TraceSwitch class, 274
TraceVerbose, 274
TraceWarning, 274
TrackBar class, 54
TreeView class, 51
UnhandledExceptionEventArgs class, 79
Unique, 160
UpdateCommand, 156, 165-166
UseAntiAlias, 261
UserProcessorTime, 312
Value, 48-50, 54-55
ValueChanged, 54
View, 52
VirtualMemorySize, 312
VisitedLinkColor, 41
Width, 22
WordWrap, 42
WorkingSet, 312
Wrap, 48
X, 16
XmlDocument class, 164
Y, 16
Zoom, 261
ZoomFactor, 42
Properties window, 34
Property Pages dialog box, 291-292
protected access modifier, 4
protected methods, base classes (event
handling), 16-17
protocols
FTP (File Transfer Protocol), 175
HTTP (Hypertext Transfer Protocol),
175
SMTP (Simple Mail Transfer Protocol),
175
SOAP (Simple Object Access Protocol),
174
proxy classes, 176-178
public access modifier, 3
public key encryption, 294
public keys, shared assemblies, 294
public UDDI registries, 175
/publickey:filename option (Type Library
Importer Tool), 221
publisher-subscriber model, 102
publisher/subscriber events model (COM+
components), 223
PublisherIdentityPermission, 332
publishers, 102
publishing performance data, 316
Q
queries
ad-hoc, 146-148
cross-product result set, 143
SQL, 144-150
QueryPageSettings event, 252
question-handling strategies, 466-467
queued components, asynchronous calls
(COM+ components), 223
queues, message, 130
R
RadioButton class, 44
RadioButton control, 43-44, 80
RadioCheck property, MenuItem class, 58
RandomNumberGenerator component, 97
RawValue property, 316
Read method, 152
ReadByte method, 152
readiness, exams, 451-452
reading performance data, 315-316
ReadOnly property, 316
DomainUpDown class, 48
NumericUpDown class, 48
TextBox class, 42
ReadXml method, 156
ReadXmlSchema method, 156
527
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .runtime
. . . .
records
elements, 129
statements, inserting, 145
tables, adding, 145
Rectangle structure (System.Drawing namespace), 19
RectangleF structure (System.Drawing
namespace), 19
/reference:filename option (Type Library
Importer Tool), 221
references, Web, adding (Web Services),
176-178
References folder, 176
References node, 215, 221-222
ReflectionPermission, 331
Refresh method, 123
#region, code block, 7
#region directive, 275
registering event sources, 314
registries, UDDI (Universal Description,
Discovery, and Integration), 175
Registry Editor, 292
RegistryPermission, 331
regression testing, 272
relational databases, 129, 150, 156
RelationName property, 159
Relations property, 156
Release folder, 291
Release mode, compiled applications, 272
reliability, application testing, 271
remote debugging, 279
remote systems, processes, 309
remoting channels, managing, 329
removable media (deployment method), 298
RemoveAt method, 123
RemoveInstance method, 316
rendering shapes, 22
RequestMinimum value, 333
RequestOptional value, 333
RequestRefuse value, 333
requests, FileDialogPermissionAttribute,
333
resgen.exe (Resource File Generator tool),
110
ReshowDelay property, 241
Resize event, 98
ResizeRedraw property, 21
Resource File Generator tool (resgen.exe),
110
resource files, 194
assembly, 201
.NET assemblies, 109-110
runtime resources, 200-201
Visual Studio .NET IDE, 198-200
resource-only .NET assemblies, 109-110
ResourceManager class, 110, 200
ResourceReader class, 110
resources
accessing, 330
classes, 110
exam strategies, 468
Server Explorer, 130
ResourceWriter class, 110
Responding property, 312
responses, event (custom controls), 101-103
Restricted Sites Zone, 298
result sets, cross-product, 143
ResumeBinding method, 123
ResXResourceReader class, 110
ResXResourceWriter class, 110
reusability, objects (COM+ components),
222
Rich Text Format (RTF), 41
rich-text files, 293
RichTextBox class, properties, 42
RichTextBox control, 41-42
RID (role identifier), 339
RightToLeft property, 203
Robohelp, 235
robustness, application testing, 271
role identifier (RID), 339
role-based permissions, 330
role-based security
COM+ components, 222
authorization, 330, 337-339
Rollback method, 296
rolling back (installations), 288
root elements XML, 163
RowChanged event, 157
RowChanging event, 157
RowDeleted event, 157
RowDeleting event, 157
RowHeadersVisible property, 128
RowHeaderWidth property, 128
Rows property, 157, 261
RowState property, 160
RTF (Rich Text Format), 41
Rtf property, RichTextBox class, 42
.rtf files, 293
Rumtime Security settings, 298
Run static method, 9
running processes, debugging, 278-279
runtime, dynamic runtime configurations,
326-329
How can we make this index more useful? Email us at indexes@quepublishing.com
528 runtime resources
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
runtime resources, localizing, 200-201
Runtime Security node, 336
Runtime Security Policy, 298, 335
runtime user interface, 94
runtime-callable wrappers, 219-220
S
sampling performance counters, 316
satellite .NET assemblies, 109-110
satellite assemblies, controls, 200
Save method, 164
SaveFileDialog dialog box, 56
screens
Choose a Project Type, 289
Choose Files to Include, 290
Choose Project Outputs to Include, 289
Project Summary, 290
Scroll event, 54-55
Scrollable property, 51-52
ScrollBar class, 55
scrollbars, controls, 39
ScrollBars property, TextBox class, 42
scrolling, PrintPreviewDialog component,
259
SDK (Software Development Kit), 178,
235, 294
Search button, 469
searching, keywords, 239
security
code access, 329
code groups, 333-334
permissions, 330-336
configuring
code access security, 329-336
role-based security, 330
declarative, 336
imperative, 336
role-based, 330
authorization, 337-339
COM+ components, 222
Security event log, 313
security model, zones, 297-298
security policy settings, managing, 329
SecurityAction.RequestMinimum flag,
values, 333
SecurityPermission, 331
Seek method, 152
Select event, MenuItem class, 58
SELECT INTO, 145
Select method, 157-158
SELECT statement, 142-145
select-and-place questions, exam format,
460
SelectedIndex property, 45-48, 55
SelectedIndexChanged event, 45-47, 52, 55
SelectedIndices property, 45, 52
SelectedItem property, 45-48
SelectedItemChanged event,
DomainUpDown class, 48
SelectedItems property, 45, 52
SelectedNode property, TreeView class, 51
SelectedRtf property, RichTextBox class, 42
SelectedTab property, TabControl class, 55
SelectedText property, ComboBox class, 47
SelectionBackColor property, 128
SelectionColor property, RichTextBox class,
42
SelectionEnd property, MonthCalendar
class, 49
SelectionFont property, RichTextBox class,
42
SelectionForeColor property, 128
SelectionMode property, 45-46
SelectionRange property, MonthCalendar
class, 49
SelectionStart property, MonthCalendar
class, 49
SendToBack method, ToolBar class, 60
/server command-line option (wsdl.exe), 179
Server Explorer, resources, 130
servers, SQL, 130, 146-150
Service Pack 1 (SP-1), 297
ServiceControllerPermission, 331
Services, Server Explorer, 130. See also Web
Services
set accessors, 12
SetError method, 84
SetIconAlignment method, 84
SetIconPadding method, 84
SetProcessDefaultLayout Windows API,
203
sets, permission 334
Setup and Deployment projects, 288-289
Setup Projects, 289-293
Setup Wizard, 289
Setup.exe file, 291
shapes, 21-24
shared .NET assemblies, 107-109
shared assemblies, 293-296
shfusion.dll (Assembly Cache Viewer Shell
Extension), 295
Shift property, 82
short-form exams, 461-465
529
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .StartCap
. . . . property
. . . . .
Shortcut property, MenuItem class, 58
shortcuts. See keyboard shortcuts
Show All Files button, 105
Show All Files icon, 176
Show() method, 10, 20
ShowCheckBox property, DateTimePicker
class, 50
ShowDialog method, 57
ShowHelp method, 240
ShowHelpIndex method, 240
ShowInTaskbar check box, 327
ShowInTaskbar property, 10
ShowToday property, MonthCalendar class,
50
ShowTodayCircle property, MonthCalendar
class, 50
ShowToolTips property, ToolBar class, 60
ShowUpDown property, DateTimePicker
class, 50
ShowWeekNumbers property,
MonthCalendar class, 50
signatures, digital, 292-294
signcode.exe (File Signing tool), 295
signing shared assemblies, 294-295
/silent option (Type Library Importer Tool),
221
simple data binding, user interfaces,
120-124
Simple Mail Transfer Protocol (SMTP),
175
Simple Object Access Protocol (SOAP), 174
simple properties, 327
simulations, 461
single quotes (‘’), 157
Single Threaded Apartment (STA), 8
single-document interface applications,
60-61
single-file .NET assemblies, 107
single-table forms, creating, 129
Site code group, 334
SiteIdentityPermission, 332
size
accessibility, 243
forms, measuring, 19
Size property, 10, 37
Size structure (System.Drawing namespace),
19
SizeF structure (System.Drawing namespace), 19
SizeMode property, PictureBox class, 43
SkipVerification permission set, 334
SmallChange property, 54-55
SmallImageList property, ListView class, 52
SmoothingMode property, 22-23
SMTP (Simple Mail Transfer Protocol),
175
sn.exe (Strong Name utility), 294-295
SOAP (Simple Object Access Protocol),
174-175
SocketPermission, 331
Software Development Kit (SDK), 178,
235, 294
Software publisher code group, 334
SolidBrush class, 24
Solution Explorer, 95-96, 105, 176
Solution Explorer window, 327
solutions, HTML Help, 235
Sort property, 159
Sorted property, 45-48, 51
sorting
culture-aware, 205
data, 205
Sorting property, ListView class, 52
SortKey.Compare method, 205
sound
accessibility, 243
files, 235
Source property, 73, 314
SourceExists method, 314
sources
data sources, 125-129
event, 314
SP-1 (Service Pack 1), 297
SQL (Structured Query Language)
queries, wildcards, 144
servers, 130, 146-150
view, 131-132
SQL Query Analyzer, 147
SQL Server data provider, 153
SqlClientPermission, 332
SqlCommand object, 149, 154-155
SqlConnection object, 130, 154
SqlDataAdapter object, 130, 155-156, 165
SqlError object, 165
SqlException class, 165
square brackets ([]), 144, 157
STA (Single Threaded Apartment), 8
StackTrace property, 73
StandardError property, 312
StandardInput property, 312
StandardOutput property, 312
Start command (Debug menu), 6
Start method, 53, 308-312
StartCap property, 22
How can we make this index more useful? Email us at indexes@quepublishing.com
530 StartInfo property
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
StartInfo property, 309
StartPage property, PrintPreviewControl
control, 261
StartPosition property, 10
StartTime property, 312
Startup folder, 292
statements
CREATE PROC, 148
debugging, 272
DELETE, 146
INSERT, 145
records, inserting, 145
SELECT, 142-145
throw, 77-78
UPDATE, 145
states, controls, 43
static .NET assemblies, 107
static members classes, 3
static methods, 9
static properties, 9
StatusBar control, 58-59
StatusBarPanel class, properties, 59
StDev aggregate function, 158
Step Into command (Debug menu), 276
Step Out command (Debug menu), 276
Step Over command (Debug menu), 276
step-by-step execution, code (debugging),
276
Stop method, Timer class, 53
storage
file-based data storage, 150
relational database, 150
stored procedures, 146-150
storing
cultures, localized settings, 200
form customizations, 8
.NET assemblies, 107-108
shared assemblies, 293
validating logic, fields, 83
StreamReader class, 151
streams, 151-153
StreamWriter class, 151
/strictref option (Type Library Importer
Tool), 221
string buffers, 223
string indexing, 203-204
String.Compare method, 205
StringBuilder objects, 223
StringInfo class, 204
Strong name code group, 334
Strong Name utility (sn.exe), 294-295
StrongNameIdentityPermission, 332
structures, System.Drawing namespace, 19
stubs, unit testing, 270
Style property, StatusBarPanel class, 59
subclasses, 202
subculture codes, 194
subscribers, 102
subtract sign (-), 7
SUBSTRING function, 158
Sum aggregate function, 158
Sum function, 144
SupportsColor property, PrinterSettings
class, 256
SuspendBinding method, 123
Switch class, 274
switches, trace, 274
symbols
@, 148
custom, 275
DEBUG, 275
TRACE, 275
synchronization, DataSet, 164
syntax. See code
/sysarray option (Type Library Importer
Tool), 222
SysInfo control, 217
System event logs, 313
System folder, 292
System.ComponentModel namespace, 94
System.Configuration.AppSettingsReader
class, 326
System.Drawing namespace
Graphics object, 17-19
drawing shapes, 21-23
drawing text, 19-21
filled shapes, 23-24
structures, 19
System.Drawing namespace (GDI+), 17
System.Drawing.Drawing2D namespace
(GDI+), 17
System.Drawing.Imaging namespace
(GDI+), 18
System.Drawing.Text namespace (GDI+),
18
System.IO namespace, classes, 151
System.Object type, 14
System.Reflection.Emit namespace, 107
System.Text namespace, Encoding
subclasses, 202
System.Windows.Forms namespace, 94
System.Windows.Forms.UpDownBase
class, inheritance, 47
SystemBrushes class, 24
531
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tools
. . .
SystemException, 72
SystemException catch block, 74
SystemPens class, 22
Systems.Diagostics namespace, 308
T
T-SQL (Transact-SQL)
DELETE statement, 146
INSERT statement, 145
SELECT statement, 142-144
UPDATE statement, 145
Tab key, 37
TabControl class, 55
TabControl control, 55
TabCount property, TabControl class, 55
TabIndex property, 37, 244
table columns, child, 158
table of contents, 237-239
TableName property, 157
TableOfContents value, 240
tables
DataSet objects, 157
fields, selecting, 143
records, 129, 145
Tables property, 156
TabPages property, TabControl class, 55
tabs
COM, 215, 222
COM Components, 217
Files, 239
.NET Framework Components, 97
Project, 238-239
TabStop, control property, 37
tags, XML, 163
TargetSite property, 73
templates
Class Library, 95
User Control, 98
Windows Control Library, 100, 104
TerraService object, 178
testing
application testing, 270-271
automated alpha-phase, 270
bottom-up, 271
HTML Help files, 239
human-interaction, 270
international applications, 272
stubs, 270
top-down, 271
umbrella, 271-272
Web Services, 181
testing centers, environment, 452
tests. See exams
text
forms, drawing, 19-21
printing, PrintDocument class, 253-254
Text check box, 327
Text property, 37, 244
Button class, 44
CheckBox class, 44
GroupBox class, 39
Label class, 40
MenuItem class, 58
RadioButton class, 44
TextBox class, 42
TextAlign property, Label class, 40
TextBox class, 41-42
TextBox control, 41-42, 194-196
TextBoxBase class, 41
TextChanged event, TextBox class, 42
TextChanged property, RichTextBox class,
42
TextureBrush class, 24
TextWriterTraceListener class, 273
This window, 280
ThousandsSeparator property,
NumericUpDown class, 48
thread-by-thread localization, 196
Threads property, 312
ThreeState property, CheckBox class, 44
throw statement, 77-78
throwing exceptions, 77, 278
Tick event, Timer class, 53
TickFrequency property, TrackBar class, 54
TickStyle property, TrackBar class, 54
time values, 49
Timer class, 53
Timer component, 95
Timer control, 53-54
timing, accessibility, 243
tlbimp.exe (Type Library Importer Tool),
220-222
TodayDate property, MonthCalendar class,
50
tool, .NET Framework Configuration, 295
ToolBar class, 59-60
ToolBar control, 59-60
toolbox, components, 97
tools
Assembly Generation (al.exe), 107, 110
Configuration, 298
deployment tools, 288, 291
File Signing (signcode.exe), 295
How can we make this index more useful? Email us at indexes@quepublishing.com
532 tools
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Global Assembly Cache tool
(GacUtil.exe), 296
Installer (InstallUtil.exe), 297
.NET Framework Configuration,
328-329, 334
Resource File Generator (resgen.exe),
110
Type Library Importer Tool
(tlbimp.exe), 220-222
wsdl.exe, 178-179
Tools menu commands, Debug Processes,
278
ToolTip component, 241
ToolTip control, 56
ToolTipText property, StatusBarPanel class,
59
top-down integration testing, 271
ToPage property, PrinterSettings class, 256
topic files, 235-237
Topic value, 240
TopMost property, 10
TotalProcessorTime property, 312
Trace class, 272-273
trace listeners, 273
trace switches, 274
TRACE symbol, 275
TraceError property, 274
TraceInfo property, 274
TraceLevel class, enumeration, 274
TraceListener class, 273
TraceSwitch class, properties, 274
TraceSwitch object, 274
TraceVerbose property, 274
TraceWarning property, 274
tracing, 272-275
TrackBar class, 54
TrackBar control, 53-54
Transact-SQL. See T-SQL
transactional processing (COM+ components), 223
transforming data, 129-132
translations, French, 199
trees, Project Types, 289
TreeView class, 51
TreeView control, 50-52
troubleshooting, 288. See also exceptions
Trusted Sites Zone, 298
try blocks, 73-74, 77
try-catch blocks, code, 75
two-way data binding, user interfaces, 129
txtCulture TextBox control, 194-196
txtCurrency TextBox control, 196
txtDate TextBox control, 196
txtNumber TextBox control, 196
Type Library Importer Tool (tlbimp.exe),
220-222
U
UDDI (Universal Description, Discovery,
and Integration), 175
UI (user interface), localization, 193
cultures, 194-197
resource files, 194, 198-201
UIPermission, 332
umbrella integration testing, 272
Unchanged value (DataViewRowState), 158
unchecked keywords, 76
#undef directive, 275
unhandled expressions, 79-80
UnhandledException event, 79
UnhandledExceptionEventArgs class, properties, 79
Unicode, 201
UnicodeEncoding subclass, 202
Unindent method, 273
Uninstall method, 296
Unique property, 160
unit testing, 270-271
Universal Description, Discovery, and
Integration (UDDI), 175
unmanaged code. See legacy code
/unsafe option (Type Library Importer
Tool), 222
Update method, 156
UPDATE statement, 145
UpdateCommand property, 156, 165-166
URL code group, 334
URL remoting, 297-298
URLIdentityPermission, 332
UseAntiAlias property, PrintPreviewControl
control, 261
user assistance, 239-241
User Control template, 98
user input
comparing/storing, 203-205
managing, 203
validating, 80-85
user interface (UI), localization, 193
cultures, 194-197
resource files, 194, 198-201
User Interface Editor, 293
user interface mirroring, 202-203
533
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Web
. . Services
. . . . .
user interfaces
client-side, 94
complex data binding, 124-128
data binding, 120, 129
one-way data binding, 129
runtime, 94
simple data binding, 120-124
two-way data binding, 129
User node, 335
UserControl class, 98
controls, creating, 100-101
.NET components, creating, 94, 99-105
/username:Username command-line option
(wsdl.exe), 179
UserProcessorTime property, 312
UTF7Encoding subclass, 202
UTF8Encoding subclass, 202
utilities
command-line, OSQL, 146
disco.exe, 178
MMC (Microsoft Management
Console), 328
perfmon.exe, 316
Strong Name (sn.exe), 294-295
XCOPY, 288
V
validating user input, 80-85
Validating event, 83
validating logic, fields, 83
value, RequestOptional, 333
Value property, 48-50, 54-55
ValueChanged event, 48-50, 55
ValueChanged property, TrackBar class, 54
values
AssociateIndex, 240
Boolean, 35, 38
databases, modifying, 145
date, 49
Demand, 333
enumerated, 158, 314
Find, 240
foreign key, 129
HelpNavigator property, 240
Index, 240
KeywordIndex, 240
RequestMinimum, 333
RequestRefuse, 333
SecurityAction.RequestMinimum flat,
333
TableOfContents, 240
time, 49
Topic, 240
Var aggregate function, 158
/verbose option (Type Library Importer
Tool), 222
view, Code, 98
View Compiled File button, 239
View menu commands, Class View, 100
View property, ListView class, 52
viewing
Assembly Manifest, 105-106
editors, 293
GAS (Global Assembly Cache), 108-109
views
Code, 6-8, 221
Design, 6, 98
SQL, 131-132
VirtualMemorySize property, 312
Visible, control property, 38
VisitedLinkColor property, LinkLabel class,
41
Visual C# .NET, classes, 3
visual cues, adding, 244
visual inheritance, 13, 103-105
Visual Studio .NET
classes, 2
command prompt, 178
IDE (integrated development environment), 2
inheritance, 3
namespaces, 4-5
objects, 2
Web Services, Web references, 176-178
Visual Studio .NET IDE, 34, 146, 198-200,
292-293
Visual Studio .NET toolbox, 217-218
VScrollBar control, 54-55
W
WaitForExit method, 310
WaitForInputIdle method, 310
#warning directive, 275
Watch window, 280
Web methods, 180
Web references, adding (Web Services),
176-178
Web Services
creating, 180-181
Disco, 175
disco.exe, 178
discovery, 176
How can we make this index more useful? Email us at indexes@quepublishing.com
534 Web Services
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
invoking, 178
proxy classes, 176
SOAP (Simple Object Access Protocol),
174
UDDI (Universal Description,
Discovery, and Integration), 175
Web references, adding, 176-178
wsdl.exe, 178-179
Web Services Description Language
(WSDL), 175
Web Setup Projects, 289
Web sites, Microsoft, 299, 468
Web-based distribution (deployment
method), 299
Web-based resources, 468-469
WebMethod attribute, 180
WebPermission, 332
WebService attribute, 180
WHERE clause, 144, 157
Width, control property, 37
Width property, 22
wildcards (%), 144, 158
windows
Auto, 279
Breakpoints, 277
Call Stack, 279
child, 60
Immediate, 279
Locals, 279
logo certification, 299
parent, 60
Properties, 34
Solution Explorer, 327
This, 280
Watch, 280
Windows applications
event logs, 313-314
performance, 315-316
Process class, 308-312
Windows authentication, 337
Windows command (Debug menu), 279
Windows Control Library template, 100,
104
Windows event log, 79
Windows Explorer (Microsoft), 295
Windows Form Designer, 5
blank forms, creating, 6
Code view, 7-8
controls, managing, 200
forms, 6-8
Windows Forms ActiveX Control Importer
(aximp.exe), 215-217
Windows Forms Designer, 61-63
Windows Forms dialog components. See
dialog boxes
Windows Installer (Microsoft), 288, 291,
295
Windows, Breakpoints command (Debug
menu), 277
WindowsIdentity object, 337-339
WindowsPrincipal object, 337-339
wizards
Add/Remove Programs Wizard, 296
C# Property Wizard, 100
Data Form Wizard, 129
New Project Wizard, 236
Setup, 289
WordWrap property, 42
WorkingSet property, 312
Wrap property, DomainUpDown class, 48
wrappers
ActiveX controls, 214
runtime-callable, 219-220
Write method, 152, 273
WriteByte method, 152
WriteEntry method, 314
WriteIf method, 273
WriteLine method, 273
WriteLineIf method, 273
WriteTo method, 164
WriteXml method, 156
WriteXmlSchema method, 156
WSDL (Web Services Description
Language), 175, 178
wsdl.exe tool, 178-179
X-Z
X property, 16
XCOPY utility, 288
XML (Extensible Markup Language)
data, 162-165
data files, 150
declarations, 163
root elements, 163
SOAP messages, 175
tags, naming, 163
WSDL (Web Services Description
Language), 175
XmlDataDocument class, 164-165
XmlDocument class, 163-164
Y property, 16
535
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .ZoomFactor
. . . . . . property
. . . . .
Z-order, control order, 34
Zone code group, 334
ZoneIdentityPermission, 332
zones, security model, 297-298
zoom, PrintPreviewDialog component, 259
Zoom property, PrintPreviewControl
control, 261
ZoomFactor property, RichTextBox class,
42
How can we make this index more useful? Email us at indexes@quepublishing.com