- •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
CREATE THE PASSWORD SECTION OF THE ALBUMEDITDLG FORM
|
|
|
|
|
|
|
Action |
|
|
|
Result |
|
|
|
|
|
|
|
|
|
|
||
1 |
|
In the AlbumEditDlg.cs [Design] window, |
|
||||||||
|
|
drag a CheckBox control from the Toolbox |
|
||||||||
|
|
window onto the form. |
|
|
|
|
|||||
|
|
|
|
|
|
|
Settings |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Property |
|
Value |
|
|||||
|
|
|
(Name) |
|
cbtnPassword |
|
|||||
|
|
|
Text |
|
|
Require &Password |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
Add a text box to receive the password, |
|
||||||||
|
|
and an additional label and text box to |
|
||||||||
|
|
confirm the password. Set the size and |
|
||||||||
|
|
position of these controls as shown in the |
|
||||||||
|
|
graphic. |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
Settings |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
Control |
|
Property |
Value |
|
|||||
|
|
First |
|
(Name) |
txtAlbumPwd |
|
|||||
|
|
TextBox |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Enabled |
False |
|
||||
|
|
|
|
PasswordChar |
* |
|
|
|
|||
|
|
Label |
|
(Name) |
lblConfirmPwd |
|
|||||
|
|
|
|
|
Enabled |
False |
|
||||
|
|
|
|
|
|
Text |
Confir&m |
|
|||
|
|
|
|
|
|
|
|
Password |
|
||
|
|
|
|
|
TextAlign |
MiddleLeft |
Note: Since the default value for the |
||||
|
|
Second |
|
(Name) |
txtConfirmPwd |
CheckBox is unchecked, these controls are |
|||||
|
|
TextBox |
|
|
|
|
|
|
|
set to disabled by default. We will enable |
|
|
|
|
|
|
Enabled |
False |
them when the user clicks the check box. |
||||
|
|
|
|
|
Also, notice the two different settings |
||||||
|
|
|
|
PasswordChar |
x |
||||||
|
|
|
|
for PasswordChar used here. This is done |
|||||||
|
|
|
|
|
|
|
|
|
|
|
only for illustrative purposes. Generally, |
|
|
|
|
|
|
|
|
|
|
|
you should use the same password charac- |
|
|
|
|
|
|
|
|
|
|
|
ter for all controls in a window. |
|
|
|
|
|
|
|
|
|
|
|
|
306 |
CHAPTER 9 BASIC CONTROLS |
CREATE THE PASSWORD SECTION OF THE ALBUMEDITDLG FORM (continued)
|
Action |
Result |
|
|
|
3 |
Use the tab order view to assign the |
|
|
TabIndex properties for the controls in |
|
|
the dialog, using the order shown in the |
|
|
graphic. |
|
|
|
|
4 |
Add a CheckedChanged handler for the |
private void cbtnPassword_CheckedChanged |
|
CheckBox object to enable the controls |
(object sender, System.EventArgs e) |
|
when the box is checked. |
{ |
|
// Enable pwd controls as required. |
|
|
|
|
|
How-to |
bool enable = cbtnPassword.Checked; |
|
This is the default event for the CheckBox |
txtAlbumPwd.Enabled = enable; |
|
lblConfirmPwd.Enabled = enable; |
|
|
control, so simply double-click on the |
|
|
txtConfirmPwd.Enabled = enable; |
|
|
control. |
if (enable) |
|
|
|
|
|
{ |
|
|
// Assign focus to pwd text box |
|
|
txtAlbumPwd.Focus(); |
|
|
} |
|
|
} |
|
|
|
5 |
Add a Validating event handler to the |
private void txtAlbumPwd_Validating |
|
txtAlbumPwd control. |
(object sender, System. |
|
Note: The Validating and Validated |
ComponentModel.CancelEventArgs e) |
|
{ |
|
|
events allow custom validation to be per- |
if (txtAlbumPwd.TextLength == 0) |
|
formed on a control. |
{ |
|
MessageBox.Show(this, |
|
|
|
|
|
|
"The password for the album " |
|
|
+ "cannot be blank", |
|
|
"Invalid Password", |
|
|
MessageBoxButtons.OK, |
|
|
MessageBoxIcon.Error); |
|
|
e.Cancel = true; |
|
|
} |
|
|
} |
|
|
|
BUTTON CLASSES |
307 |
CREATE THE PASSWORD SECTION OF THE ALBUMEDITDLG FORM (continued)
|
Action |
Result |
|
|
|
6 |
Add a ValidPasswords method to return |
private bool ValidPasswords() |
|
whether the two passwords match. |
{ |
|
|
if ((cbtnPassword.Checked) |
|
|
&& (txtConfirmPwd.Text |
|
|
!= txtAlbumPwd.Text)) |
|
|
{ |
|
|
MessageBox.Show(this, |
|
|
"The password and confirm " |
|
|
+ "values do not match", |
|
|
"Password Error", |
|
|
MessageBoxButtons.OK, |
|
|
MessageBoxIcon.Error); |
|
|
return false; |
|
|
} |
|
|
return true; |
|
|
} |
|
|
|
This code demonstrates a couple of new concepts, such as setting the focus and validating the contents of a control. Let’s look at these changes in a bit more detail.
private void cbtnPassword_CheckedChanged |
|
b Handle the |
|
||
(object sender, System.EventArgs e) |
|
CheckedChanged |
{ |
|
event |
|
|
|
// Enable the password controls as required |
|
|
bool enable = cbtnPassword.Checked; |
|
|
txtAlbumPwd.Enabled = enable; |
|
|
lblConfirmPwd.Enabled = enable; |
|
|
txtConfirmPwd.Enabled = enable; |
|
|
if (enable)
{
// Assign focus to password control txtAlbumPwd.Focus();
}
}
cSet focus to txtAlbumPwd control
private void txtAlbumPwd_Validating
(object sender, System.ComponentModel.CancelEventArgs e)
{
if (txtAlbumPwd.TextLength == 0)
{
MessageBox.Show(this,
"The password for the album cannot be blank", "Invalid Password",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
e.Cancel = true;
}
}
private bool ValidPasswords()
{
Handle the d
Validating
event
308 |
CHAPTER 9 BASIC CONTROLS |
if ((cbtnPassword.Checked)
&& (txtConfirmPwd.Text != txtAlbumPwd.Text))
{
MessageBox.Show(this,
"The password and confirm values do not match", "Password Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return false;
}
return true;
}
The numbered sections in this code warrant the following commentary.
bThe AutoCheck property handles the Click event automatically on behalf of our CheckBox control. To process the change in button state that occurs when this happens, we handle the CheckedChanged event. The value of the Checked property is used to enable or display the associated controls, as required.
cWhen our radio button is checked, the focus, by default, would remain with the cbtnPassword control. Typically, when a user checks this button, he or she would immediately want to edit the password field. Calling the Focus method does this automatically and saves the user an extra step.
dThe Validating event is one of a series of events related to entering and leaving a control. Collectively, these events are sometimes referred to as the focus events. The
focus events, in the order in which they occur, are as follows: Enter, GotFocus,
Leave, Validating, Validated, and LostFocus.These events can be used to fine-tune the behavior of a control as the user moves from one control to the next.
The validation events, namely Validating and Validated, occur during and after validation whenever the CausesValidation property is set to true. This property defaults to true, so the validation events normally occur. The Validating event receives a CancelEventArgs parameter much like the OnClosing event we discussed for the Form class in chapter 6. The CancelEventArgs.Cancel property is used to cancel the operation when the validation fails.
In our case, we want to verify that the password provided is not blank. When this occurs, we display a message box to inform the user of the problem, and cancel the operation to indicate that validation has failed. The .NET Framework returns focus to the control, forcing the user to correct the problem.
BUTTON CLASSES |
309 |