- •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
C H A P T E R |
1 1 |
|
|
More controls
11.1Tab controls 354
11.2Tab pages 359
11.3Dates and Times 366
11.4Calendars 372
11.5Recap 381
Chapters 9 and 10 examined basic controls such as buttons and labels, and list controls such as the ListBox class. In this chapter we discuss the tab controls and controls for displaying dates and times. Tab controls are especially useful when used to separate a large number of controls into logical groups within a single region of a form. The date controls, of course, are used to present and specify DateTime structures in a form.
The specific controls discussed in this chapter are the following:
•TabControl
•TabPage
•DateTimePicker
•MonthCalendar
Since the MyAlbumEditor project served us so well in chapter 10, we will continue to use this project here as well. Of course, any changes we make to our MyPhotoAlbum library will be available when we return to the MyPhotos project in chapter 12.
We begin our discussion with tab controls.
353
11.1TAB CONTROLS
Tab controls are used to compact a large amount of data into a single form by segmenting the data into different screens, or tab pages. One of the more well-known examples of this construct is the Properties window associated with files and directories in the Windows file system. Right-click on a directory and select the Properties item, and you will see a window similar to figure 11.1. This figure shows the properties for the MyAlbumEditor directory containing the project we began in chapter 10. There are three tab pages available to display different types of directory properties: General, Web Sharing, and Sharing. The exact tabs displayed on your system may differ depending on which version of Windows you are running and the specific features installed and enabled.
Figure 11.1
Users switch to a different tab page by clicking on the desired tab, or using the keyboard shortcut Ctrl+Tab.
You can create windows similar to figure 11.1 using the Windows Forms classes Control and TabPage. The TabControl class is a container for one or more TabPage objects, with each TabPage instance holding the tab information and set of controls to display for a specific page. Since I haven't shown you a class diagram for a few chapters, take a look at figure 11.2 showing the class hierarchy for the tab and tab page controls. It is also worth noting that the complete class hierarchy of all Windows Forms controls is shown in appendix C.
As shown in figure 11.2, the TabControl class inherits directly from the Control class we discussed in chapter 3. We will look at the members of this class in a moment. The TabPage class, on the other hand, inherits from the Panel class. This makes sense, since each page in a tab control contains a collection of controls, exactly
354 |
CHAPTER 11 MORE CONTROLS |
like a Panel object. This also permits tab pages to automatically scroll if the display area exceeds the size of the window by using members of the ScrollableControl class. We saw how to enable this type of scrolling for Form and Panel objects in chapter 7.
Figure 11.2
The TabPage class is a Panel object that exists within a tab control.
In this chapter we will look at the details of both the TabControl and the TabPage class. We examine the TabControl class first.
11.1.1THE TABCONTROL CLASS
The TabControl class provides a container in which to manage a collection of
TabPage objects. This container class provides members to control the location, appearance, and behavior of the pages in the control. Details on this class are provided in .NET Table 11.1.
Tab controls are often forgotten or perhaps forsaken by programmers. It is not uncommon to see a user interface packed full of buttons, labels, text boxes, and other controls. Often these are collected into group boxes to separate the information into logical groups. While such interfaces are very functional, they may not be so effective since users must process so much information at once. Visual Studio .NET allows multiple tab pages to be created for an interface quite easily, so perhaps programmers will think to use these constructs more often in the future. As a rule of thumb, make sure the controls in each tab page are all related, and try to limit yourself to no more than seven controls per page. The number seven here is not completely arbitrary, as user interface research has shown that this is a reasonable maximum number of items to present to a user at once.1
1See the references listed in the bibliography for more information on this and other aspects of good user interface design.
TAB CONTROLS |
355 |
.NET Table 11.1 TabControl class
The TabControl class is a control that presents a collection of tab pages to the user. Each tab page is represented by a TabPage class instance. This class is part of the System.Windows.Forms namespace, and inherits from the Control class. See .NET Table 4.1 on page 104 for a list of members inherited from the Control class, and .NET Table 11.2 on page 360 for details on the TabPage class.
|
Alignment |
Gets or sets the area of the control where tabs are |
|
|
displayed, called the tab strip. Defaults to the top of |
|
|
the control. |
|
Appearance |
Gets or sets how the tabs are displayed, such as a |
|
|
normal tab or 3D button. |
|
DrawMode |
Gets or sets how the tabs are drawn in the control. |
|
HotTrack |
Gets or sets whether the tabs change their |
|
|
appearance when the mouse passes over them. |
|
ImageList |
Gets or sets the list of images to use on the |
|
|
control’s tabs. |
|
ItemSize |
Gets or sets the default size of each tab. |
Public |
Multiline |
Gets or sets whether more than one line of tabs |
|
can be displayed. |
|
Properties |
|
|
|
|
|
|
RowCount |
Gets the number of rows currently displayed on the |
|
|
control’s tab strip. |
|
SelectedIndex |
Gets or sets the index of the currently selected tab |
|
|
page. |
|
SelectedTab |
Gets or sets the currently selected TabPage object. |
|
ShowToolTips |
Gets or sets whether the tool tips for each tab page |
|
|
should be displayed. |
|
SizeMode |
Gets or sets how the tabs for the control are sized. |
|
TabCount |
Gets the number of tab pages in the control. |
|
TagPages |
Gets the collection of TabPage objects contained |
|
|
by this control. |
|
|
|
Public |
GetTabRect |
Returns the bounding Rectangle for a specified |
Methods |
|
tab. |
|
|
|
Public |
DrawItem |
Occurs when a tab must be drawn. |
|
|
|
Events |
SelectedIndexChanged |
Occurs when a new tab page is selected. |
|
||
|
|
|
11.1.2CREATING A TAB CONTROL
Let’s create a new tab control for our MyAlbumEditor project. We will do this by creating a new form to display the collection of images in an album. While this is not necessarily an efficient use of memory, it does provide a nice example of tab controls and tab pages. Figure 11.3 shows the new dialog with our favorite album displayed.
356 |
CHAPTER 11 MORE CONTROLS |