- •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
this.Text = "Form1";
}
#endregion
It is worth noting here that the InitializeComponent method is called from the Form1 constructor. In chapter 1, we initialized our Form object in the constructor as well. Visual Studio uses a separate method for this purpose in order to encapsulate the auto-generated code for the program.
fThis line assigns the STAThread attribute to our Main function. This ensures that the main application thread runs as a single threaded apartment so that operations such as drag and drop and the clipboard will work correctly. Strictly speaking, we should have done this in chapter 1 as well (we did not in order to keep the number of discussion points down). Apartments and threading are a bit beyond our discussion here, so for now just accept that this line is needed for the form to properly interact with the clipboard and other parts of the Windows operating system.
[STAThread]
Congratulations are once again in order for creating your first Windows Forms program, this time in Visual Studio .NET. Sit back in your chair to savor your accomplishment, and join me in section 2.2 when you are ready to add some controls to your program.
2.2Adding controls
In this section we use Visual Studio .NET to add the Button and PictureBox controls to our form. Before we do, let’s take a look at the AssemblyInfo.cs file in our project.
2.2.1The AssemblyInfo file
When you create a C# Windows application project, an AssemblyInfo.cs file is created to define various attributes for the program assembly. This includes the version number shown in the Version tab when you display the program’s properties dialog box from Windows Explorer. An attribute in C# is a declarative tag that affects the settings or behavior exhibited by an assembly, type (such as a class), or type member (such as a method or property). All attributes are based on the System.Attribute class defined in the .NET Framework as part of the System.Reflection namespace.
The AssemblyInfo.cs file makes use of some assembly-related attributes defined by this namespace. These settings are defined using the standard format for attributes targeted at the assembly file:
[assembly: <attribute>(<setting>)]
The various attribute classes defined for this purpose include the AssemblyVersionAttribute class supporting the file version number settings. In C#, the
ADDING CONTROLS |
43 |
Attribute portion of the class name can be omitted, resulting in a version number setting something like the following:
[assembly: AssemblyVersion("1.0")]
A summary of the attributes used by this file are shown in the following table:
Common attributes in AssemblyInfo.cs file
Attribute |
Description |
|
|
AssemblyTitle |
The title for this assembly |
AssemblyDescription |
A short description of the assembly |
AssemblyCompany |
The company name for the assembly |
AssemblyProduct |
The product name for the assembly |
AssemblyCopyright |
The copyright string for the assembly |
AssemblyVersion |
The version string for the assembly |
|
|
Most of these attributes accept a string that specifies the value for the attribute. One exception is the AssemblyVersion attribute. The version number is used internally for comparing expected and actual version numbers of other assemblies, namely programs or libraries, used by your application. The version number format is a string specified as follows:
Major.Minor.Build.Revision
These are all expected to be integers. The first two values are for the major and minor version number used by most products these days. Changes in these numbers normally represent incompatible changes with previous versions; that is, version 2.1 is not compatible with version 2.2 of the same library.
The build number is for different compiles of the same minor version of an assembly. Occasionally this might introduce incompatibilities, but often version 2.1.17 will operate the same as version 2.1.42, although perhaps with some slight problems in the earlier build that will have been fixed in the later build. The revision number is for bug fixes or other incidental updates, and should not normally break compatibility.
In .NET, the build and revision number can be inserted automatically by the compiler. This is done by inserting an asterisk (*) in place of one or both of these numbers.
The automated build number is the number of days since January 1, 2000 in local time, and the automated revision number is the number of seconds since the previous midnight, local time, modulo 2. These automated values ensure that a new build and revision number is generated for each compile, that the build number always increases, and that the revision number increases within a generated build. It should be noted that this scheme is good for thousands of years, and that the revision number will never be larger than a 32-bit integer. Some examples and interpretations of version number strings are shown in the following table.
44 |
CHAPTER 2 GETTING STARTED WITH VISUAL STUDIO .NET |
Assembly version number examples
Version |
Major # |
Minor # |
Build # |
Revision # |
|
String |
|||||
|
|
|
|
||
|
|
|
|
|
|
“1” |
1 |
0 |
0 |
0 |
|
“2.1” |
2 |
1 |
0 |
0 |
|
“3.2.1” |
3 |
2 |
1 |
0 |
|
“4.3.2.1” |
4 |
3 |
2 |
1 |
|
“5.4.*” |
5 |
4 |
Days since 1 Jan 2000 in |
Seconds since midnight, |
|
|
|
|
local time. |
local time, divided by 2. |
|
“6.5.4.*” |
6 |
5 |
4 |
Seconds since midnight, |
|
|
|
|
|
local time, divided by 2. |
|
|
|
|
|
|
In our application, we will set the version number equal to the current section number. The following steps set the version number for our application to 2.2. While we are here, we will also assign values to other settings in the AssemblyInfo.cs file, and use the ProductVersion property of the Application class to include this version number in the title bar automatically.
SET THE VERSION NUMBER FOR THE MYPHOTOS PROJECT
|
Action |
Results |
|
|
|
1 |
Display the project’s |
The source code for this file appears in the main window. |
|
AssemblyInfo.cs file. |
|
|
How-to |
|
|
In the Solution Explorer |
|
|
window, double click the |
|
|
name of the file. |
|
|
|
|
2 |
Find the AssemblyVersion |
[assembly: AssemblyVersion("2.2")] |
|
line and change the version |
|
|
number to “2.2”. |
|
|
|
|
3 |
Set the other assembly |
In my code, I used the following settings. |
|
attributes to reasonable |
[assembly: AssemblyTitle("MyPhotos")] |
|
values. |
|
|
[assembly: AssemblyDescription("Sample application |
|
|
|
for Windows Forms Programming with C#")] |
|
|
[assembly: AssemblyConfiguration("")] |
|
|
[assembly: AssemblyCompany("Manning |
|
|
Publications Co.")] |
|
|
[assembly: AssemblyProduct("MyPhotos")] |
|
|
[assembly: AssemblyCopyright("Copyright |
|
|
(C) 2001")] |
|
|
[assembly: AssemblyTrademark("")] |
|
|
[assembly: AssemblyCulture("")] |
|
|
|
4 |
Display the Form1.cs source |
|
|
code file. |
|
|
|
|
ADDING CONTROLS |
45 |