- 7.1 A Survey of .NET Windows Forms Controls
- 7.2 Button Classes, Group Box, Panel, and Label
- 7.3 PictureBox and TextBox Controls
- 7.4 ListBox, CheckedListBox, and ComboBox Classes
- 7.5 The ListView and TreeView Classes
- 7.6 The ProgressBar, Timer, and StatusStrip Classes
- 7.7 Building Custom Controls
- 7.8 Using Drag and Drop with Controls
- 7.9 Using Resources
- 7.10 Summary
- 7.11 Test Your Understanding
7.3 PictureBox and TextBox Controls
The PictureBox Class
The PictureBox control is used to display images having a bitmap, icon, metafile, JPEG, GIF, or PNG format. It is a dynamic control that allows images to be selected at design time or runtime, and permits them to be resized and repositioned within the control.
constructor: public PictureBox()
The constructor creates an empty (Image = null) picture box that has its SizeMode property set so that any images are displayed in the upper-left corner of the box.
The two properties to be familiar with are Image and SizeMode. Image, of course, specifies the graphic to be displayed in the PictureBox. SizeMode specifies how the image is rendered within the PictureBox. It can be assigned one of four values from the PictureBoxSizeMode enumeration:
- AutoSize. PictureBox is sized to equal the image.
- CenterImage. Image is centered in box and clipped if necessary.
- Normal. Image is place in upper-left corner and clipped if necessary.
- StretchImage. Image is stretched or reduced to fit in box.
Figure 7-7 illustrates some of the features of the PictureBox control. It consists of a form with three small picture boxes to hold thumbnail images and a larger picture box to display a full-sized image. The large image is displayed when the user double-clicks on a thumbnail image.
The code, given in Listing 7-2, is straightforward. The event handler ShowPic responds to each DoubleClick event by setting the Image property of the large PictureBox ( bigPicture ) to the image contained in the thumbnail. Note that the original images are the size of bigPicture and are automatically reduced (by setting SizeMode) to fit within the thumbnail picture boxes.
Figure 7-7 Thumbnail images in small picture boxes are displayed at full size in a larger viewing window.
Listing 7-2 Working with Picture Boxes
using System; using System.Drawing; using System.Windows.Forms; public class ArtForm : Form { private PictureBox bigPicture; private PictureBox tn1; private PictureBox tn2; private PictureBox tn3; private Button btnClear; public ArtForm() { bigPicture = new PictureBox(); tn1 = new PictureBox(); tn2 = new PictureBox(); tn3 = new PictureBox(); btnClear = new Button(); bigPicture.Location = new Point(90, 30); bigPicture.Name = "bigPicture"; bigPicture.Size = new Size(160, 160); this.Controls.Add(bigPicture); // Define picturebox to hold first thumbnail image tn1.BorderStyle = BorderStyle.FixedSingle; tn1.Cursor = Cursors.Hand; tn1.Image = Image.FromFile("C:\\schiele1.jpg"); tn1.Location = new Point(8, 16); tn1.Name = "tn1"; tn1.Size = new Size(56, 56); tn1.SizeMode = PictureBoxSizeMode.StretchImage; this.Controls.Add(tn1); // Code for other thumbnails would go here // Button to clear picture box btnClear.Location = new Point(136, 192); btnClear.Name = "btnClear"; btnClear.Size = new Size(88, 24); btnClear.Text = "Clear Image"; this.Controls.Add(btnClear); btnClear.Click += new EventHandler(this.btnClear_Click); // Set up event handlers for double click events tn1.DoubleClick += new EventHandler(ShowPic); tn2.DoubleClick += new EventHandler(ShowPic); tn3.DoubleClick += new EventHandler(ShowPic); } static void Main() { Application.Run(new ArtForm()); } private void btnClear_Click(object sender, EventArgs e) { bigPicture.Image = null; // Clear image } private void ShowPic (object sender, EventArgs e) { // Sender is thumbnail image that is double clicked bigPicture.Image = ((PictureBox) sender).Image; } }
The TextBox Class
The familiar TextBox is an easy-to-use control that has several properties that affect its appearance, but few that control its content. This leaves the developer with the task of setting up event handlers and data verification routines to control what is entered in the box.
constructor: public TextBox()
The constructor creates a TextBox that accepts one line of text and uses the color and font assigned to its container. From such humble origins, the control is easily transformed into a multi-line text handling box that accepts a specific number of characters and formats them to the left, right, or center. Figure 7-8 illustrates some of the properties used to do this.
Figure 7-8 TextBox properties
The text is placed in the box using the Text property and AppendText method:
txtPoetry.Text = "In Xanadu did Kubla Khan\r\na stately pleasure dome decree,"; txtPoetry.AppendText("\r\nWhere Alph the sacred river ran");
A couple of other TextBox properties to note are ReadOnly, which prevents text from being modified, and PasswordChar, which is set to a character used to mask characters entered—usually a password.
TextBoxes and Carriage Returns
When storing data from a TextBox into a database, you want to make sure there are no special characters embedded in the text, such as a carriage return. If you look at the TextBox properties, you’ll find AcceptsReturn, which looks like a simple solution. Setting it to false should cause a TextBox to ignore the user pressing an Enter key. However, the name of this property is somewhat misleading. It only works when the form’s AcceptButton property is set to a button on the form. Recall that this property causes the associated button’s Click handler to be executed when the Enter key is pressed. If AcceptButton is not set (and the MultiLine property of the text box is set to true), the TextBox receives a newline (\r\n) when the Enter key is pushed.
This leaves the developer with the task of handling unwanted carriage returns. Two approaches are available: capture the keystrokes as they are entered or extract the characters before storing the text. The first approach uses a keyboard event handler, which you should be familiar with from the previous chapter.
// Set up event handler in constructor for TextBox txtPoetry txtPoetry.KeyPress += new KeyPressEventHandler(onKeyPress); private void onKeyPress( object sender, KeyPressEventArgs e) { if(e.KeyChar == (char)13) e.Handled = true; }
Setting Handled to true prevents the carriage return/linefeed from being added to the text box. This works fine for keyboard entry but has no effect on a cut-and-paste operation. To cover this occurrence, you can use the keyboard handling events described in Chapter 6 to prevent pasting, or you can perform a final verification step that replaces any returns with a blank or any character of your choice.
txtPoetry.Text = txtPoetry.Text.Replace(Environment.NewLine," ");