- •brief contents
- •about this book
- •The Windows Forms namespace
- •Part 1: Hello Windows Forms
- •Part 2: Basic Windows Forms
- •Part 3: Advanced Windows Forms
- •Who should read this book?
- •Conventions
- •Action
- •Result
- •Source code downloads
- •Author online
- •acknowledgments
- •about .NET
- •Casting the .NET
- •Windows Forms overview
- •about the cover illustration
- •Hello Windows Forms
- •1.1 Programming in C#
- •1.1.1 Namespaces and classes
- •1.1.2 Constructors and methods
- •1.1.3 C# types
- •1.1.4 The entry point
- •1.1.5 The Application class
- •1.1.6 Program execution
- •1.2 Adding controls
- •1.2.1 Shortcuts and fully qualified names
- •1.2.2 Fields and properties
- •1.2.3 The Controls property
- •1.3 Loading files
- •1.3.1 Events
- •1.3.2 The OpenFileDialog class
- •1.3.3 Bitmap images
- •1.4 Resizing forms
- •1.4.1 Desktop layout properties
- •1.4.2 The Anchor property
- •1.4.3 The Dock property
- •1.5 Recap
- •2.1 Programming with Visual Studio .NET
- •2.1.1 Creating a project
- •Action
- •Result
- •2.1.2 Executing a program
- •Action
- •Result
- •2.1.3 Viewing the source code
- •View the code generated by Visual Studio .NET
- •Action
- •Result
- •2.2 Adding controls
- •2.2.1 The AssemblyInfo file
- •Action
- •Results
- •2.2.2 Renaming a form
- •Action
- •Result
- •2.2.3 The Toolbox window
- •Action
- •Result
- •2.3 Loading files
- •2.3.1 Event handlers in Visual Studio .NET
- •Action
- •Result
- •2.3.2 Exception handling
- •Action
- •Result
- •Action
- •Results and Comments
- •2.4 Resizing forms
- •2.4.1 Assign the Anchor property
- •Action
- •Result
- •2.4.2 Assign the MinimumSize property
- •Action
- •Result
- •2.5 Recap
- •Basic Windows Forms
- •Menus
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •3.3 Click events
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •3.5 Context menus
- •Action
- •Result
- •Action
- •Result
- •3.6 Recap
- •Status bars
- •4.1 The Control class
- •4.2 The StatusBar class
- •Action
- •Result
- •Action
- •Result
- •4.3.1 Adding panels to a status bar
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •4.5 Recap
- •Reusable libraries
- •5.1 C# classes and interfaces
- •5.2 Class libraries
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •5.3 Interfaces revisited
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •5.4 Robustness issues
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Common file dialogs
- •Action
- •Results
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •6.3 Paint events
- •Action
- •Result
- •Action
- •Result
- •6.4 Context menus revisited
- •Action
- •Result
- •Action
- •Result
- •6.5 Files and paths
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •6.6 Save file dialogs
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •6.7 Open file dialogs
- •Action
- •Result
- •Action
- •Result
- •6.8 Recap
- •Drawing and scrolling
- •7.1 Form class hierarchy
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •7.4 Panels
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Dialog boxes
- •8.1 Message boxes
- •Action
- •Result
- •Action
- •Result
- •8.1.4 Creating A YesNoCancel dialog
- •Action
- •Result
- •Action
- •Result
- •8.2 The Form.Close method
- •8.2.1 The relationship between Close and Dispose
- •Action
- •Result
- •8.3 Modal dialog boxes
- •Action
- •Result
- •Action
- •Result
- •8.3.2 Preserving caption values
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Basic controls
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •9.1.2 Creating a derived form
- •Action
- •Result
- •9.2 Labels and text boxes
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •9.3.6 Adding AlbumEditDlg to our main form
- •Action
- •Result
- •Action
- •Result
- •9.4 Recap
- •List controls
- •10.1 List boxes
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •10.2 Multiselection list boxes
- •10.2.1 Enabling multiple selection
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •10.3 Combo boxes
- •Action
- •Result
- •Action
- •Result
- •10.4 Combo box edits
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •10.5 Owner-drawn lists
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •More controls
- •Action
- •Result
- •Action
- •Result
- •11.2 Tab pages
- •Action
- •Result
- •Action
- •Result
- •11.3.1 Dates and times
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •11.5 Recap
- •A .NET assortment
- •12.1 Keyboard events
- •Action
- •Result
- •Action
- •Result
- •12.2 Mouse events
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •12.3 Image buttons
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •12.4 Icons
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •12.5 Recap
- •Toolbars and tips
- •13.1 Toolbars
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •13.4.2 Creating tool tips
- •Action
- •Result
- •Action
- •Result
- •Advanced Windows Forms
- •List views
- •14.2 The ListView class
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •14.2.3 Populating a ListView
- •Action
- •Result
- •Action
- •14.3 ListView columns
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •14.6 Recap
- •Tree views
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •15.3 Dynamic tree nodes
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •15.4 Node selection
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •15.5 Fun with tree views
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Multiple document interfaces
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •16.3 Merged menus
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •16.4 MDI children
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •16.5 MDI child window management
- •Action
- •Result
- •Action
- •Result
- •16.6 Recap
- •Data binding
- •17.1 Data grids
- •Action
- •Result
- •Action
- •Result
- •17.2 Data grid customization
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Odds and ends .NET
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •18.2 Timers
- •Action
- •Result
- •Action
- •Result
- •18.3 Drag and drop
- •Action
- •Result
- •Action
- •Result
- •18.4 ActiveX controls
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •Action
- •Result
- •18.5 Recap
- •C# primer
- •A.1 C# programs
- •A.1.1 Assemblies
- •A.1.2 Namespaces
- •A.2 Types
- •A.2.1 Classes
- •A.2.2 Structures
- •A.2.3 Interfaces
- •A.2.4 Enumerations
- •A.2.5 Delegates
- •A.3 Language elements
- •A.3.1 Built-in types
- •A.3.2 Operators
- •A.3.3 Keywords
- •A.4 Special features
- •A.4.1 Exceptions
- •A.4.2 Arrays
- •A.4.3 Main
- •A.4.4 Boxing
- •A.4.5 Documentation
- •.NET namespaces
- •B.1 System.Collections
- •B.2 System.ComponentModel
- •B.3 System.Data
- •B.4 System.Drawing
- •B.5 System.Globalization
- •B.6 System.IO
- •B.7 System.Net
- •B.8 System.Reflection
- •B.9 System.Resources
- •B.10 System.Security
- •B.11 System.Threading
- •B.12 System.Web
- •B.13 System.Windows.Forms
- •B.14 System.XML
- •Visual index
- •C.1 Objects
- •C.2 Marshal by reference objects
- •C.3 Components
- •C.4 Common dialogs
- •C.7 Event data
- •C.8 Enumerations
- •For more information
- •bibliography
- •Symbols
- •Index
|
MODIFY THE CLASS NAMESPACE |
||
|
|
|
|
|
Action |
|
Result |
|
|
|
|
7 |
Modify the entire |
The PhotoAlbum.cs file should now look as follows: |
|
|
MyPhotoAlbum namespace to |
using System; |
|
|
exist within the Manning |
||
|
|
|
|
|
namespace |
namespace Manning |
|
|
How-to |
{ |
|
|
namespace MyPhotoAlbum |
||
|
Enter the bolded text into the |
{ |
|
|
PhotoAlbum.cs file. When you |
/// <summary> |
|
|
type the final brace, Visual |
/// |
Summary description for PhotoAlbum. |
|
/// </summary> |
||
|
Studio will automatically |
||
|
public class PhotoAlbum |
||
|
reformat the lines as shown. |
{ |
|
|
Note: We have not made a sim- |
public PhotoAlbum() |
|
|
{ |
|
|
|
ilar change in the MyPhotos |
|
// |
|
application since in this project |
|
// TODO: Add Constructor Logic here |
|
the namespace is not likely to |
|
// |
|
} |
|
|
|
be used outside of the applica- |
|
|
|
} |
|
|
|
tion itself. |
} |
|
|
|
} |
|
|
|
|
|
Our library is now ready; all we need to do is add code. One last task before we do this is to make certain we can use our library from within the MyPhotos application project. For this to work, the MyPhotos project must include a reference to the MyPhotoAlbum class. This corresponds to the /reference switch on the C# compiler (csc.exe) that we saw in chapter 1, and is a bit like linking a library into your program in C++. Since there are no header files in C#, a reference is all we need to start using classes from the library in our project.
REFERENCE MYPHOTOALBUM FROM THE MYPHOTOS PROJECT
|
Action |
Result |
|
|
|
8 |
Display the Add Reference |
|
|
dialog box for the MyPhotos |
|
|
project. |
|
|
How-to |
|
|
a. Click the MyPhotos |
|
|
project in the Solution |
|
|
Explorer window. |
|
|
b. Click on the Project menu. |
|
|
c. Select the Add Reference |
|
|
item. |
|
|
Alternately |
|
|
Right-click on the |
|
|
References entry under the |
|
|
MyPhotos project in the |
|
|
Solution Explorer window, |
|
|
and select Add Reference. |
|
|
|
|
CLASS LIBRARIES |
137 |
REFERENCE MYPHOTOALBUM FROM THE MYPHOTOS PROJECT (continued)
|
Action |
Result |
|
|
|
9 |
Reference the |
The MyPhotoAlbum assembly appears in Solution Explorer |
|
MyPhotoAlbum project. |
under the References entry for the MyPhotos project. |
|
How-to |
|
|
a. Click the Projects tab. |
|
|
b. Click the MyPhotoAlbum |
|
|
project. |
|
|
c. Click the Select button. |
|
|
d. Click OK to add the |
|
|
selected project. |
|
|
|
|
It is important to realize that our new reference refers to the assembly produced by the MyPhotoAlbum project, and not the project itself. Visual Studio automatically uses the correct path when compiling the MyPhotos project to pick up the most recent MyPhotoAlbum library from the corresponding project.
If you are not using Visual Studio .NET to build your program, you will need to establish the correct library location manually. The command-line tools discussed in chapter 1 are used for this purpose. The next section provides a short discussion on this topic.
5.2.2USING THE COMMAND-LINE TOOLS
As we saw in chapter 1, you can build Windows Forms applications without using Visual Studio .NET. The interactive environment makes a number of tasks easier, but also uses memory and other system resources. On a computer with limited resources, this can present some problems. If you have a favorite editor and are comfortable working with makefiles, you can create the examples in this book without using Visual Studio .NET.
To create a class library such as MyPhotoAlbum.dll, create a MyPhotoAlbum directory for the library and place the required source files in it. In this case you would create a PhotoAlbum.cs file to hold the PhotoAlbum class source code, and create other files as required. You can create an AssemblyInfo.cs file as well, or simply include the version number and other assembly information at the top of your file as we did in chapter 1. The C# compiler (csc.exe) discussed in chapter 1 is used to produce both executables and libraries. The /target switch specifies the type of output file to produce.
138 |
CHAPTER 5 REUSABLE LIBRARIES |
C# compiler output options (/target switch)
Switch |
Output |
Comments |
|
|
|
/target:exe |
Creates a console |
This is the default. |
|
application (.exe). |
|
/target:library |
Creates a library file (.dll). |
The library generated is an assembly that can be referenced by other .NET applications.
/target:module |
Creates a library module |
This option does not produce an assembly manifest |
|
(.dll). |
for the file. Such a file cannot be loaded by the .NET |
|
|
runtime until it is incorporated in an assembly |
|
|
manifest using the /addmodule switch. This |
|
|
permits collections of files to become a single |
|
|
assembly. |
/target:winexe |
Creates a Windows |
When a Windows application is run in a console |
|
application (.exe). |
window, the console does not wait for the |
|
|
application to exit. This is different than a console |
|
|
application, where the console does in fact wait. |
|
|
|
The /out switch can be used to specify the output file name. Both /out and /target must appear before any source file names.
For example, the following line will create a library assembly called MyPhotoAlbum.dll using a single source file PhotoAlbum.cs.
>csc /target:library /out:MyPhotoAlbum.dll PhotoAlbum.cs /r:System.dll
To use this library with your MyPhotos application, you will need to include a /r reference when compiling the application. For example, if your library was in a directory called C:\MyProjects\MyPhotoAlbum, then you would use the following switch when compiling the MyPhotos application:
/r:C:\MyProjects\MyPhotoAlbum
5.2.3CREATING THE PHOTOALBUM CLASS
No matter how you compile your library, we are now ready to implement the PhotoAlbum class. These next two sections take us through the initial implementation of this and the Photograph class. If you find typing all this code a bit tedious (or are a really bad typist!), don’t be afraid to download the final code from the book’s web site and simply read the accompanying text. For the rest of us, let’s forge ahead.
|
|
IMPLEMENT PHOTOALBUM CLASS |
|
|
|
|
|
|
Action |
|
Result |
|
|
|
|
1 |
Display the PhotoAlbum.cs |
|
|
|
file in the main window. |
|
|
|
|
|
|
2 |
Add some class |
|
/// <summary> |
|
documentation. |
|
/// The PhotoAlbum class represents a |
|
|
|
/// collection of Photographs. |
|
|
|
/// </summary> |
|
|
|
|
CLASS LIBRARIES |
139 |
IMPLEMENT PHOTOALBUM CLASS (continued)
|
Action |
Result |
|
|
|
3 |
Define CollectionBase |
public class PhotoAlbum : CollectionBase |
|
as the base class. |
{ |
|
|
|
4 |
Create an empty default |
public PhotoAlbum() |
|
constructor. |
{ |
|
|
// Nothing to do |
|
|
} |
|
|
Note: It’s a good idea to add a short comment in situa- |
|
|
tions like this to inform the poor guy or gal who eventu- |
|
|
ally supports your code that you created an empty |
|
|
constructor on purpose. |
|
|
|
You may notice here that the MyPhotoAlbum project does not compile. Try to do so and the compiler returns an error something like the following:
Error The type or namespace name 'CollectionBase' could not be
found (are you missing a using directive or an assembly ref-
erence?)
This is because CollectionBase is part of the System.Collections namespace. It turns out this namespace is part of the system library, so there is no need for another reference in our project. We could fix the error by declaring the class as follows:
public PhotoAlbum : System.Collections.CollectionBase
{
. . .
Since we may use other objects or names from the System.Collections namespace, we will instead simply indicate that our class will use this namespace at the top of the file.
USE SYSTEM.COLLECTIONS NAMESPACE
|
Action |
Result |
|
|
|
5 |
Add a using directive to |
You should now have two using directives present: |
|
the PhotoAlbum.cs file for |
using System; |
|
the System.Collections |
|
|
using System.Collections; |
|
|
namespace. |
|
|
|
|
Now the project should compile with no errors. Before we implement any members for this class, let’s also take a look at the Photograph class.
140 |
CHAPTER 5 REUSABLE LIBRARIES |