- •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
•Explain the difference between modal and modeless dialogs.
•Create dialog boxes using the Form class.
Before we get into generating custom dialog boxes, we will first look at how simple messages are displayed using the MessageBox class.
8.1MESSAGE BOXES
Developers, especially object-oriented developers, are always looking for shortcuts. Classes such as OpenFileDialog and SaveFileDialog not only provide a standard way to prompt a user for files, they also save programmers a lot of time and effort by encapsulating the required window display and interaction code. Another common task programmers face is the need to display a simple message to the user. Our photo album application, for example, should really display an error message when an album cannot be saved successfully, or it could pose a question by asking the user if they would like to save the album to an alternate file location.
The .NET Framework provides a MessageBox class for this purpose. This class is very similar to the MFC function of the same name. This section will show how this class is used to handle simple interactions with a user. While this class is not actually a Form object, it is the most basic type of modal dialog box.
All dialog boxes are either modal or modeless. A modal dialog box requires the user to respond before the associated program will continue. Modeless or nonmodal dialog boxes allow the application to continue while the dialog box is displayed.
All MessageBox windows are modal, while Form windows are modal if invoked via the Form.ShowDialog method and modeless if invoked via the Form.Show method.
Figure 8.1 These examples show the four types of icons available to
MessageBox dialogs.
MESSAGE BOXES |
225 |
Figure 8.1 shows some sample message boxes with various settings. Note the different button configurations, and how the Question Icon dialog has defined No as the default button. An overview of the MessageBox class is provided in .NET Table 8.1.
.NET Table 8.1 MessageBox class
The MessageBox class represents a modal dialog box that displays a message or question to the user and waits for their response. This class is part of the System.Windows.Forms namespace. A MessageBox cannot be instantiated as an object with the new keyword; instead the static Show method is used to display the dialog.
By default, a message box displays with no icon and a single OK button. The Show method is overloaded to allow these and other settings to be customized. There are four enumerations used for this purpose: MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, and MessageBoxOptions. In the following table, the enumeration values for some of these four types are included, since these types are only used with the MessageBox.Show method.
Public Static |
Show |
Displays a message box and returns the |
|
|
DialogResult enumeration value corresponding to |
||
Methods |
|
||
|
the button selected by the user. |
||
|
|
||
|
|
|
|
|
OK |
The message box should contain an OK button only. |
|
|
OKCancel |
The message box should contain an OK and Cancel |
|
MessageBoxButtons |
|
button. |
|
YesNo |
The message box should contain a Yes and No |
||
Enumeration Values |
|||
|
|
button. |
|
|
YesNoCancel |
The message box should contain a Yes, No, and |
|
|
|
Cancel button. |
|
|
|
|
|
|
Error |
The message box should contain an error symbol, a |
|
|
|
white X in a red circle. Use this for unexpected |
|
|
|
problems that prevent an operation from continuing. |
|
|
Information |
The message box should contain an information |
|
|
|
symbol, a lower case letter ‘i’ in a circle. Use this for |
|
|
|
general messages about the application such as a |
|
MessageBoxIcon |
|
status or notification. |
|
|
|
||
Enumeration Values |
Question |
The message box should contain a question mark |
|
|
|||
|
|
symbol. Use this for Yes/No questions where a |
|
|
|
choice by the user is required. |
|
|
Warning |
The message box should contain a warning symbol, |
|
|
|
an exclamation point in a yellow triangle. Use this for |
|
|
|
problems that may interfere with the ability of an |
|
|
|
operation to continue. |
|
|
|
|
|
MessageBoxDefault- |
Button1 |
The first button in the message box is the default. |
|
|
|
||
Button Enumeration |
Button2 |
The second button is the default. |
|
Values |
Button3 |
The third button is the default. |
|
|
|||
|
|
|
226 |
CHAPTER 8 DIALOG BOXES |
8.1.1THE MESSAGEBOX.SHOW METHOD
A MessageBox instance cannot be instantiated. Instead, the Show method is used to create the message dialog and return the result. There are a number of overloads available for this method, from a version that takes a single message string to one that accepts a parameter for everything from the title bar text to which button should be the default. Various forms of this method are shown in the following signatures. The comment preceding each signature refers to the characters in bold.
//The return value indicates which button was clicked by the user public static DialogResult Show( string text );
//Displays the dialog in front of the specified window object
public static DialogResult Show( IWin32Window owner, string text );
// Accepts a message string and title bar caption
public static DialogResult Show( string text, string caption );
// Displays the dialog with the specified buttons public static DialogResult Show( IWin32Window owner,
string text, string caption,
MessageBoxButtons buttons );
// The penultimate Show method: an icon, default button, and options public static DialogResult Show( IWin32Window owner,
string text, string caption,
MessageBoxButtons buttons,
MessageBoxIcon icon,
MessageBoxDefaultButton defaultButton,
MessageBoxOptions options );
Turning back to our MyPhotos application, the addition of a message box would be beneficial in some of the situations we have already encountered. These include:
•When an error occurs while trying to open an existing album.
•When an error occurs while trying to save the current album.
•When the current album has changed and is about to be discarded.
We will add a MessageBox to our program for each of these instances.
8.1.2CREATING AN OK DIALOG
When we are unable to open a selected album, there is not much to do other than inform the user that something is wrong. We will use an error dialog since a failure here is not normally expected. The resulting dialog is shown in figure 8.2.
Figure 8.2
This message box is displayed when the album contains an unrecognized version number.
MESSAGE BOXES |
227 |
Let’s add the code to create this dialog whenever an unexpected problem occurs while opening the file
Set the version number of the MyPhotos application to 8.1.
HANDLE EXCEPTION IN MENUOPEN_CLICK METHOD
|
Action |
Result |
|
|
|
1 |
Locate the |
private void menuOpen_Click |
|
menuOpen_Click method |
(object sender, System.EventArgs e) |
|
in the MainForm.cs source |
{ |
|
. . . |
|
|
file. |
|
|
|
|
|
|
|
2 |
Enclose the code to open |
if (dlg.ShowDialog() == DialogResult.OK) |
|
the album in a try block. |
{ |
|
|
try |
|
|
{ |
|
|
// Open the new album. |
|
|
_album.Open(dlg.FileName); |
|
|
_album.FileName = dlg.FileName; |
|
|
_bAlbumChanged = false; |
|
|
this.Invalidate(); |
|
|
} |
|
|
|
3 |
Catch any Exception that |
catch (Exception ex) |
|
occurs. |
|
|
|
|
4 |
Display the dialog in the |
{ |
|
catch block. |
MessageBox.Show(this, |
|
|
"Unable to open file " + dlg.FileName |
|
|
+ "\n (" + ex.Message + ")", |
|
|
"Open Album Error", |
|
|
MessageBoxButtons.OK, |
|
|
MessageBoxIcon.Error); |
|
|
} |
|
|
} |
|
|
. . . |
|
|
} |
|
|
Note: The text string is constructed using the + (plus |
|
|
sign) notation for strings. Also note that a new line is |
|
|
inserted in the dialog with the \n character. |
|
|
|
In this code, we cheated a little by catching any and all Exception objects in the catch block. It is normally safer to catch specific exceptions that may occur so you can provide feedback or take actions based on the specific error. In this code, an IOException will occur if an unexpected error occurs during a file I/O operation. If you recall, the PhotoAlbum.Open method throws an IOException explicitly if the version number in the file is not recognized.
It is also worth noting that we ignore the result returned by the Show method, since there is only a single OK button in the dialog.
228 |
CHAPTER 8 DIALOG BOXES |