| Introduction | p. 1 |
| What's in This Book | p. 1 |
| Conventions Used in This Book | p. 4 |
| What You'll Need | p. 4 |
| Online Resources | p. 5 |
| Setting Up Your Development Environment | p. 7 |
| Smart Device Extensions and the .NET Compact Framework | p. 7 |
| Targeting Nonstandard Devices | p. 16 |
| In Brief | p. 32 |
| Introducing the .NET Compact Framework | p. 33 |
| Why the .NET Compact Framework? | p. 33 |
| Examining the .NET Compact Framework in Detail | p. 35 |
| In Brief | p. 42 |
| Designing GUI Applications with Windows Forms | p. 43 |
| Investigating Unsupported Controls in the .NET Compact Framework | p. 43 |
| Investigating Unsupported System.Windows.Forms Functionality in the .NET Compact Framework | p. 44 |
| Working with the Visual Studio .NET Form Designer | p. 44 |
| Understanding the Different Windows Forms Target Platforms | p. 49 |
| Working with the Form Control | p. 52 |
| Programming the Button Control | p. 55 |
| Using the TextBox Control | p. 56 |
| Using the Label Control | p. 56 |
| Working with RadioButton Controls | p. 56 |
| Using the CheckBox Control | p. 58 |
| Using the ComboBox Control | p. 59 |
| Using the ListBox Control | p. 63 |
| Using the NumericUpDown Control | p. 65 |
| Using the DomainUpDown Control | p. 69 |
| Programming the ProgressBar Control | p. 72 |
| Using the StatusBar Control | p. 73 |
| Using the TrackBar Control | p. 73 |
| Using the ToolBar Control | p. 74 |
| Adding Menus with the MainMenu Control | p. 78 |
| Using a ContextMenu Control in an Application | p. 79 |
| Using the Timer Control | p. 83 |
| Using the OpenFileDialog and SaveFileDialog Controls | p. 86 |
| Using the Panel Control | p. 88 |
| Using the HScrollBar and VScrollBar Controls | p. 88 |
| Using the ImageList Control | p. 89 |
| Using the PictureBox Control | p. 90 |
| Using the ListView Control | p. 92 |
| Using the TabControl Control | p. 98 |
| Using the TreeView Control | p. 100 |
| Working with the DataGrid Control | p. 104 |
| In Brief | p. 110 |
| Using Threads and Timers in the .NET Compact Framework | p. 111 |
| Threads, Timers, and Windows CE | p. 111 |
| The Thread Class | p. 112 |
| Understanding Thread Basics | p. 113 |
| Coordinating Threads with the Mutex Class | p. 121 |
| Blocking until a Thread Finishes | p. 125 |
| Controlling Access to Data Objects with the Monitor Class | p. 128 |
| Managing Multiple Threads with a Thread Pool | p. 130 |
| Timers | p. 131 |
| Updating Variables with the Interlocked Class | p. 135 |
| In Brief | p. 136 |
| Network Connectivity with the .NET Compact Framework | p. 139 |
| Working with Sockets | p. 139 |
| Socket Programming with the .NET Compact Framework | p. 141 |
| Serializing Objects for Transmission through a Socket | p. 150 |
| Using UDP Packets | p. 151 |
| Multicasting with UDP Packets | p. 155 |
| Communicating with Remote Servers through the HTTP Protocol | p. 157 |
| Communicating with Remote Servers through the HTTPS Protocol | p. 159 |
| Communicating through the Device IrDA Port | p. 159 |
| In Brief | p. 166 |
| ADO.NET on the .NET Compact Framework | p. 167 |
| Introducing ADO.NET on the .NET Compact Framework | p. 167 |
| Caching Data with the DataSet | p. 167 |
| Understanding Constraints | p. 175 |
| Setting Up Autoincremented Fields | p. 178 |
| Modeling Relational Data with the DataSet | p. 179 |
| Creating Bindable Views of Data with a DataView | p. 187 |
| Binding Data to a Control | p. 194 |
| Comparing the Compact DataSet with the Desktop DataSet | p. 196 |
| In Brief | p. 196 |
| Programming with Microsoft SQL Server CE | p. 199 |
| Investigating the Features Supported by Microsoft SQL Server 2000 | p. 199 |
| Creating a Microsoft SQL Server CE Database | p. 200 |
| Adding Structure to a Microsoft SQL Server CE Database | p. 204 |
| Populating a Microsoft SQL Server CE Database | p. 210 |
| Retrieving Data by Using Sq1CeDataReader | p. 213 |
| Filling a DataSet by Using the Sq1CeDataAdapter | p. 223 |
| Updating the Microsoft SQL Server CE Database by Using the Sq1CeDataAdapter | p. 227 |
| Generating Sq1Command Objects with the Sq1CeCommandBuilder | p. 233 |
| In Brief | p. 235 |
| XML and the DataSet | p. 237 |
| XML and the .NET Compact Framework DataSet | p. 237 |
| Loading XML into a DataSet | p. 238 |
| Saving a DataSet as XML | p. 241 |
| Loading and Saving XML in a Sample Application | p. 245 |
| Modeling Relational Data with XML Schemas | p. 246 |
| Loading and Saving Schema Alone | p. 256 |
| Writing a DataSet to XML without Schema Information | p. 257 |
| Reading a DataSet from XML, Ignoring Schema Information | p. 257 |
| Inferring Schema | p. 258 |
| Using XML to Design a DataSet | p. 259 |
| Saving and Loading DataSets as XML DiffGrams | p. 261 |
| In Brief | p. 263 |
| Using XML Web Services | p. 265 |
| Creating a Simple XML Web Service | p. 265 |
| Understanding the .NET Framework Web Service Client | p. 271 |
| Creating a Client for the Simple XML Web Service | p. 272 |
| Consuming a Web Service That Uses a DataSet | p. 280 |
| Consuming Web Service That Exposes a Typed DataSet | p. 284 |
| In Brief | p. 287 |
| Manipulating XML with the XmlTextReader and the XmlTextWriter | p. 289 |
| XML Architecture Overview | p. 289 |
| Working with the XmlTextReader | p. 290 |
| Loading XML Data into an XmlTextReader | p. 290 |
| Using the XmlTextReader's Namespaces Property | p. 293 |
| Understanding the Normalization Property | p. 294 |
| Controlling White-Space Interpretation with the WhitespaceHandling Property | p. 296 |
| Using the XmlResolver Property | p. 298 |
| Reading XML Nodes | p. 299 |
| Reading XML Attributes | p. 306 |
| Understanding How to Perform Full-Content Reads | p. 312 |
| Skipping over Nodes | p. 318 |
| Closing the XmlTextReader | p. 320 |
| Working with the XmlTextWriter | p. 320 |
| Creating the XmlTextWriter | p. 321 |
| Manipulating Namespace Support | p. 321 |
| Formatting the XmlTextWriter's Output | p. 322 |
| Writing an XML Declaration | p. 323 |
| Writing XML Elements | p. 324 |
| Writing XML Attributes | p. 327 |
| Writing xml:space and xml:lang Attributes | p. 329 |
| Writing Element and Attribute Content | p. 332 |
| Converting .NET Compact Framework Data Types through XmlConvert | p. 338 |
| Writing Raw XML Markup | p. 341 |
| Writing Other Nodes | p. 343 |
| Writing Processing Instructions | p. 345 |
| Writing White-Space Characters | p. 347 |
| In Brief | p. 348 |
| Working with the XML Document Object Model | p. 351 |
| Processing XML by Using the Document Object Model | p. 351 |
| Differences from the Desktop .NET Framework | p. 352 |
| Loading the XML DOM | p. 353 |
| Navigating the XML DOM | p. 354 |
| Accessing Text from Elements | p. 358 |
| Accessing Markup from Nodes | p. 359 |
| Accessing an Element's Attributes | p. 362 |
| Accessing Other XmlNodes | p. 365 |
| Searching an XML Document Node Tree | p. 366 |
| Creating XmlNodes | p. 367 |
| Creating XmlDeclarations | p. 368 |
| Creating XmlElements | p. 369 |
| Creating XmlAttributes | p. 369 |
| Creating Other Node Types | p. 370 |
| Inserting XmlNodes | p. 371 |
| Using the AppendChild and PrependChild Methods | p. 372 |
| Working with the InsertBefore and InsertAfter Methods | p. 373 |
| Inserting XmlAttributes into an XmlDocument | p. 374 |
| Replacing the XmlNodes within an XmlDocument | p. 376 |
| Removing XmlNodes for an XmlDocument | p. 378 |
| Removing XmlAttributes from their XmlElements | p. 379 |
| Writing the XmlDocument | p. 381 |
| In Brief | p. 382 |
| Interacting with Native Code | p. 383 |
| Understanding When to Call Native Code | p. 383 |
| Calling Native Code: Quick Start | p. 384 |
| Marshalling the Fundamental Data Types | p. 388 |
| Marshalling Simple Structures | p. 397 |
| Passing Nested Structures by Using Custom Marshalling Code | p. 402 |
| Calling the Windows CE Operating System | p. 406 |
| Accessing COM Components from the .NET Compact Framework | p. 410 |
| In Brief | p. 411 |
| Exploring .NET Reflection | p. 413 |
| Understanding the .NET Compact Framework Reflection API | p. 413 |
| Loading .NET Assemblies | p. 413 |
| Discovering Type Information | p. 414 |
| Creating Type Instances by Using ConstructorInfo | p. 417 |
| Invoking Methods by Using the MethodInfo Class | p. 426 |
| Using Reflection to Manipulate Object State | p. 435 |
| Adding Custom Metadata to .NET Elements | p. 460 |
| In Brief | p. 468 |
| Cryptography | p. 469 |
| Cryptography on the .NET Compact Framework | p. 469 |
| Invoking the CryptoAPI | p. 470 |
| Computing a Hash | p. 474 |
| Encrypting and Decrypting Data by Using a Password | p. 479 |
| Using Session Keys to Encrypt and Decrypt Data | p. 491 |
| Determining CryptoAPI Constants with the ConstFinder Sample Application | p. 507 |
| In Brief | p. 507 |
| Measuring the Performance of a .NET Compact Framework Application | p. 509 |
| Using a Stopwatch Timer to Measure Code Execution Time | p. 509 |
| Using .NET Compact Framework Performance Counters | p. 514 |
| In Brief | p. 523 |
| Deploying a .NET Application | p. 525 |
| Packaging a .NET Compact Framework Application | p. 525 |
| Using Visual Studio .NET to Package an Application | p. 525 |
| Using CAB Wizard to Package an Application | p. 526 |
| Distributing a .NET Compact Framework Application | p. 534 |
| In Brief | p. 539 |
| Developing for the SmartPhone | p. 541 |
| Introducing the SmartPhone | p. 541 |
| Developing for the SmartPhone by Using the .NET Compact Framework | p. 542 |
| Writing an Application for SmartPhone--XMLDataSetViewer | p. 543 |
| In Brief | p. 547 |
| Index | p. 549 |
| Table of Contents provided by Ingram. All Rights Reserved. |