- •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
.NET Table 14.7 LabelEditEventArgs class
The LabelEditEventArgs class represents the event arguments received by BeforeLabelEdit and AfterLabelEdit event handlers for the ListView class. This class is part of the System.Windows.Forms namespace, and inherits from the System.EventArgs class.
|
CancelEdit |
Gets or sets whether the edit operation should be cancelled. |
|
|
This property can be set both before and after the item is |
Public |
|
edited. |
|
|
|
Properties |
Item |
Gets the zero-based index into the list view’s Items collection |
|
|
of the ListViewItem to be edited. |
|
Label |
Gets the new text to assign to the label of the indicated item. |
|
|
|
Since we are not in a production environment, we will take the easy way out and only handle the AfterLabelEdit event. This means a user may edit an album only to find that he or she cannot save his changes, which is not the best interface from a usability perspective.
The code changes required are given in the following steps:
|
|
|
|
|
INITIATE LABEL EDITING |
|
|
|
|
|
|
|
|
|
|
|
Action |
Result |
||
|
|
|
|
|
|
|
1 |
In the MainForm.cs [Design] |
Item labels in the list view may now be edited. |
||||
|
window, set the LabelEdit |
|
||||
|
property of the ListView control |
|
||||
|
to true. |
|
|
|
|
|
|
|
|
|
|
|
|
2 |
Add a Name menu to the top of |
|
||||
|
the Edit menu. |
|
||||
|
|
Settings |
|
|||
|
|
|
|
|
|
|
|
|
Property |
|
Value |
|
|
|
|
(Name) |
|
menuEditLabel |
|
|
|
|
Text |
|
&Name |
|
|
|
|
|
|
|
|
|
3 |
Add a Click event handler for |
private void menuEditLabel_Click |
||||
|
this menu. |
|
|
|
(object sender, System.EventArgs e) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
4 |
Within this handler, if an item is |
if (listViewMain.SelectedItems.Count == 1) |
||||
|
selected, edit the item. |
listViewMain.SelectedItems[0].BeginEdit(); |
||||
|
|
|
|
|
|
} |
|
|
|
|
|
|
Note: This code only edits the label if a single item |
|
|
|
|
|
|
is selected. While we do not permit multiple items |
|
|
|
|
|
|
to be selected in our ListView control, this code |
|
|
|
|
|
|
establishes an appropriate behavior in case such |
|
|
|
|
|
|
selection is ever permitted in the future. |
|
|
|
|
|
|
|
5 |
Add a KeyDown event handler for |
private void listViewMain_KeyDown |
||||
|
the ListView control. |
(object sender, System.Windows. |
||||
|
|
|
|
|
|
Forms.KeyEventArgs e) |
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
SELECTION AND EDITING |
469 |
INITIATE LABEL EDITING (continued)
|
Action |
Result |
|
|
|
6 |
If the F2 key is pressed and an |
if (e.KeyCode == Keys.F2) |
|
item is selected, edit the item. |
{ |
|
|
if (listViewMain.SelectedItems.Count == 1) |
|
|
{ |
|
|
listViewMain.SelectedItems[0]. |
|
|
BeginEdit(); |
|
|
e.Handled = true; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
That’s all it takes to begin an edit. The actual work of interacting with the user is handled by the framework. When the user is finished, we can pick up the result in an AfterLabelEdit event handler. There is also a BeforeLabelEdit event that is useful for selectively permitting an edit or altering an item before the edit begins. For our purposes, the AfterLabelEdit event will suffice.
|
|
PROCESS A LABEL EDIT |
|
|
|
|
Action |
Result |
|
|
|
7 |
Add an AfterLabelEdit |
private void listViewMain_AfterLabelEdit |
|
event handler for the |
(object sender, System.Windows. |
|
ListView control. |
Forms.LabelEditEventArgs e) |
|
{ |
|
|
|
|
|
|
|
8 |
If the user cancelled the edit, |
if (e.Label == null) |
|
then we are finished. |
{ |
|
Note: For example, if the |
// Edit cancelled by the user |
|
e.CancelEdit = true; |
|
|
user presses the Esc key dur- |
return; |
|
ing editing, this handler is |
} |
|
|
|
|
invoked with a null label. |
|
|
|
|
9 |
In this handler, locate the item |
ListViewItem item = listViewMain.Items[e.Item]; |
|
to be edited. |
|
|
|
|
10 |
Update the album name, and |
if (UpdateAlbumName(e.Label, item) == false) |
|
cancel the edit if an error |
e.CancelEdit = true; |
|
occurs. |
} |
|
|
|
|
Note: Once again we sepa- |
|
|
rate the logic to operate on |
|
|
our album into a separate |
|
|
method. |
|
|
|
|
470 |
CHAPTER 14 LIST VIEWS |
PROCESS A LABEL EDIT (continued)
|
Action |
Result |
|
|
|
11 |
Add the UpdateAlbumName |
private bool UpdateAlbumName |
|
method to update the title of |
(string newName, ListViewItem item) |
|
the album. |
{ |
|
string fileName = item.Tag as string; |
|
|
|
|
|
How-to |
string newFileName |
|
= RenameFile(fileName, newName, ".abm"); |
|
|
a. Retrieve the file name from |
|
|
if (newFileName == null) |
|
|
the Tag property for the |
{ |
|
item. |
MessageBox.Show( |
|
b. Rename the file using a pri- |
"Unable to rename album to this name."); |
|
return false; |
|
|
vate method that returns |
} |
|
the new name. |
// Update Tag property |
|
c. Inform the user if the file |
|
|
item.Tag = newFileName; |
|
|
could not be renamed. |
return true; |
|
d. Otherwise, update the Tag |
} |
|
|
|
|
property with the new |
|
|
name. |
|
|
|
|
12 |
Implement the RenameFile |
private string RenameFile |
|
method to construct the new |
(string origFile, string newBase, string ext) |
|
name for the file. |
{ |
|
string fileName = Path. |
|
|
|
|
|
How-to |
GetDirectoryName(origFile) + "\\" + newBase; |
|
string newFile = Path.ChangeExtension(fileName, |
|
|
a. Use the GetDirecto- |
|
|
ext); |
|
|
ryName method to retrieve |
|
|
the directory for the file. |
|
|
b. Use the ChangeExtension |
|
|
method to ensure the file |
|
|
has the correct extension. |
|
|
|
|
13 |
Rename the file using the |
try |
|
Move method in the File |
{ |
|
class. |
File.Move(origFile, newFile); |
|
return newFile; |
|
|
|
|
|
|
} |
|
|
|
14 |
Return null if an error |
catch (Exception) |
|
occurs. |
{ |
|
|
// An error occurred |
|
|
return null; |
|
|
} |
|
|
} |
|
|
|
This code uses some methods from the Path and File classes to manipulate the file name strings and rename the album file. Our application now supports displaying album properties and editing of album labels. The next topic of discussion is item activation.
SELECTION AND EDITING |
471 |
14.5ITEM ACTIVATION
As you might expect, item activation is the means by which an item is displayed or otherwise activated by the control. Normally, activation is just a fancy way to say double-click. In our ListBox class in chapter 10, we activated an item in the list by handling the DoubleClick event and displaying the properties dialog associated with the item. Such behavior is activation.
The reason for the fancy term is that the ListView class allows activation other than a double-click to be supported. The Activation property determines the type of activation supported, based on the ItemActivation enumeration. The possible values for this enumeration are shown in .NET Table 14.8. Note that the OneClick style is similar to an HTML link in a Web browser. In our program, we will stick with the standard activation.
.NET Table 14.8 ItemActivation enumeration
The ItemActivation enumeration specifies the type of activation supported by a control. This enumeration is part of the System.Windows.Forms namespace.
|
OneClick |
A single click activates an item. The cursor appears as a |
|
|
hand pointer, and the item text changes color as the mouse |
Enumeration |
|
pointer passes over the item. |
|
|
|
Values |
Standard |
A double-click activates an item. |
|
TwoClick |
A double-click activates an item, plus the item text changes |
|
|
color as the mouse pointer passes over the item. |
|
|
|
Regardless of how items are activated, an ItemActivate event occurs whenever an item is activated. The event handler for this event receives a standard System.EventArgs parameter, so the activated item is obtained from the SelectedItems collection.
The activation behavior for our MyAlbumExplorer application will display the Photographs in the selected album. This is a rather complicated change, since the columns and list item behavior must now accommodate the display of both albums and photos here. The fact that we were careful to separate much of the album logic into individual methods along the way will help us keep our code straight. Figure 14.6 shows our application with photographs displayed in the ListView control. These photographs are sorted by the date each photo was taken. The icon used here might not be your first choice for a photograph icon, but it will suffice for our purposes. If you find another icon you prefer, or are feeling creative, you can use an alternate icon in your application.
472 |
CHAPTER 14 LIST VIEWS |