Home

Spin Buttons

 

Introduction to the Numeric Up Down Control

 

Description

A spin button, also called a spin box, also called an up/down control, is a Windows control equipped with two opposite arrow buttons The UpDown Control. The user clicks one of the arrow buttons at one time to increase or decrease the current value of the control. The value held by the control is also called its position. 

The values of an up/down control range from a minimum to a maximum. When the up arrow button is clicked, the value of the control increases. If the user clicks and holds the mouse on the up pointing arrow button, the value of the control keeps increasing until it reaches its maximum and then stops. The opposite behavior applies when the user clicks or holds the mouse on the down-pointing arrow button.

Creating an Up-Down Control

The .NET Framework provides two types of spin buttons. The immediate parent of the up/down control is the UpDownBase class.  This class provides the characteristics and behaviors common to both types of up/down controls.

As it name implies, the numeric up-down control is made to display numeric values. To use it, from the Common Controls section of the Toolbox, you can click the NumericUpDown button NumericUpDown and click the form or the container that will host it. This control is based on the NumericUpDown class that you can use to dynamically create the control. Here is an example:

using System;
using System.Drawing;
using System.Windows.Forms;

public class Exercise : System.Windows.Forms.Form
{
    NumericUpDown nudCounter;

    public Exercise()
    {
        InitializeComponent();
    }

    private void InitializeComponent()
    {
        nudCounter = new NumericUpDown();
        nudCounter.Location = new Point(12, 12);

        Controls.Add(nudCounter);
    }
}

public class Program
{
    static int Main()
    {
        System.Windows.Forms.Application.Run(new Exercise());
        return 0;
    }
}

This would produce:

Numeric Up-Down
 

ApplicationApplication: Introducing the Numeric Up/Down Control

  1. Start Microsoft Visual C#
  2. Create a new Windows Application named PledgeDistribution1
  3. In the Solution Explorer, right-click Form1.cs and click Rename 
  4. Type PledgeDistribution.cs and press Enter
  5. Design the form as follows:
     
    Pledge Distribution
    Control Text Name Additional Properties
    Form Pledge Distribution   Maximize Box: False
    Label Amount Pledged:    
    TextBox 0.00 txtAmountPledged Text Align: Right
    Label Rotherham College:    
    NumericUpDown      
    Label %    
    TextBox 0.00 txtAmount1 Text Align: Right
    Label Leicester University:    
    NumericUpDown      
    Label %    
    TextBox 0.00 txtAmount2 Text Align: Right
    Label Lars Union Academy:    
    NumericUpDown      
    Label %    
    TextBox 0.00 txtAmount3 Text Align: Right
    Label Message lblMessage  
    Button Close btnClose  
  6. Execute the application to test the form
  7. Close the form and return to your programming environment

Characteristics of the Numeric Up-Down Control

 

The Up-Down Alignment

In traditional Win32 programming, the spin button does not have a means of displaying its value. This means that you usually have to accompany it with another control such as a text box. You also have to decide whether to place the text box to the left or the right side of the spin button control. Although the .NET Framework's up-down controls don't have this limitation, you still have to decide whether to position the arrow buttons on the left or the right side of the text box part. This property is controlled by the UpDownAlign Boolean property whose default value is Right, which places the arrow buttons on the right side. If you want the buttons to be positioned on the left, set this property to Left. The values of this property are managed through the LeftRightAlignment enumeration of the UpDownBase parent class. Here is an example of aligning the buttons to the left:

private void InitializeComponent()
{
        nudCounter = new NumericUpDown();
        nudCounter.Location = new Point(12, 12);
        nudCounter.UpDownAlign = LeftRightAlignment.Left;

        Controls.Add(nudCounter);
}

This would produce:

The UpDown control with the buttons aligned to the left of the text box

Intercepting the Arrow Keys

When a spin button control comes up, to use it, the user can click one of the up or down-pointing buttons, which causes the value to change. The user can also press the up or down arrow keys to change the value. The ability to use the keyboard is controlled by the InterceptArrowKeys Boolean property, whose default value is True, which means the user is allowed to use the keyboard to change the value of the control. If for some (strange) reason you want to prevent the user from changing the value using the keyboard, set this property to False. If this property is set to True, remember that the user can use the keyboard only after giving focus to the control, which is usually done by pressing Tab a few times until the control receives focus. Another way the user can change the value of the control is to manually edit the value of the text box part of the control.

When the value of an spin button has been changed, the control fires a ValueChanged() event. This event simply uses an EventArgs class as argument. If the user decides to manually edit the value of the control by typing a number in the text box part of the control, the spin button fires a TextChanged() event.

The Minimum and the Maximum Values

After adding the up-down control to a container such as a form, you change its characteristics using the Properties window. Probably the most important piece of information you would need from a spin button is the value it is holding at a particular time. As mentioned already, the spin button navigates from a minimum to a maximum value. The values of the control can be natural or decimal numbers. They are actually defined as System.Decimal types. These numbers range from a minimum controlled by the Minimum property to a maximum value controlled by the Maximum property. By default, a freshly added numeric up-down control on a form has its Minimum value set to 0 and its Maximum value set to 100. You can change the values at design time in the Properties window or programmatically as follows:

private void InitializeComponent()
    {
        nudCounter = new NumericUpDown();
        nudCounter.Location = new Point(12, 12);
        nudCounter.Minimum = 42.48M;
        nudCounter.Maximum = 3822046.06M;

        Controls.Add(nudCounter);
    }

If you use large numbers in the thousands, they may become difficult to read:

The Value of the Control

When, or while, a spin button is being used, its text box displays a value: this is the Value property. You can use this property to specify what value the control would use at startup. It can be an integer or a decimal number but it must be between the Minimum and the Maximum values. 

The Type of Value

By default, the numeric up-down displays natural numbers. Alternatively, you can make the spin button display hexadecimal numbers. The type of numbers displayed is controlled by the Boolean Hexadecimal property whose default value is False, which means that it is primarily meant to display natural numbers. If you prefer the control to display hexadecimal numbers, set this property to True. Here is an example:

private void InitializeComponent()
{
        nudCounter = new NumericUpDown();
        nudCounter.Location = new Point(12, 12);
        nudCounter.Minimum = 42.48M;
        nudCounter.Maximum = 3822046.06M;
        nudCounter.Hexadecimal = true;

        Controls.Add(nudCounter);
}

This would produce:

Displaying Decimal Numbers

By default, the numeric up-down control is made to display only natural numbers. If you want it to display decimal numbers, use the DecimalPlaces property to specify the number of decimal places on the right side of the decimal separator which, in US English, is the period.

The Thousand Separator

If you want to make the control's numeric values easier to read, you can display a symbol to separate the thousands. This characteristic can be set using the Boolean ThousandsSeparator property whose default value is False. If you want to display a symbol between thousands, set this property to True. Here is an example:

private void InitializeComponent()
{
        nudCounter = new NumericUpDown();
        nudCounter.Location = new Point(12, 12);
        nudCounter.Minimum = 42.48M;
        nudCounter.Maximum = 3822046.06M;
        nudCounter.ThousandsSeparator = true;

        Controls.Add(nudCounter);
}

This causes the control to check the value used as the thousands separator in the Control Panel of the computer that is using the application. The thousands separator for US English is the comma ",". Here is an example:

The NumericUpDown control displaying the thousands separator

The Incrementing Value

When using the spin button, the user clicks one of the arrows of the control to increase or decrease the value. By default, the value increases or decreases by 1. If you want the value to augment by more than 1, set the desired value using the Increment property. The value of this property can be a natural or a decimal value (it is defined as System.Decimal). To set the Increment value programmatically, you can use code as follows:

private void InitializeComponent()
{
        nudCounter = new NumericUpDown();
        nudCounter.Location = new Point(12, 12);
        nudCounter.Minimum = 42.48M;
        nudCounter.Maximum = 3822046.06M;
        nudCounter.Increment = 125.82M;
        nudCounter.ThousandsSeparator = true;

        Controls.Add(nudCounter);
}

ApplicationApplication: Configuring a Numeric Up-Down Control

  1. On the form, click the top numeric up-down control
  2. In the Properties, click Value, type 50 and press Enter
  3. In the same way, change the following properties for the controls:
     
    Pledge Distribution
    Control Name Additional Properties
    NumericUpDown updAmount1 Value: 50
    NumericUpDown updAmount2 Value: 25
    NumericUpDown updAmount3 Value: 25
  4. Double-click the top up-down control and implement its event as follows:
     
    private void updAmount1_ValueChanged(object sender, EventArgs e)
    {
                double AmountPledged = 0.00D;
                double RateAmount1, RateAmount2, RateAmount3,
                       Amount1, Amount2, Amount3,
                       Rest;
    
                // Get the current value of the amount pledged
                try
                {
                    AmountPledged = double.Parse(this.txtAmountPledged.Text);
                }
                catch (FormatException)
                {
                    MessageBox.Show("The amount you entered to pledge is not valid");
                }
    
                // Get the percentage that is displaying in the UpDown controls other
                // than this one
                RateAmount2 = (double)this.updAmount2.Value;
                RateAmount3 = (double)this.updAmount3.Value;
                // To make sure that the total percentage applied on all three UpDown
                // controls is = 100, get the difference left from subtracting
                // the values of the other UpDown controls from 100
                // Use that difference as the Maximum value applied on the current
                // UpDown control
                this.updAmount1.Maximum = (decimal)(100 - RateAmount2 - RateAmount3);
                // Now that we have an appropriate percentage value on the current
                // UpDown control, retrieve it
                RateAmount1 = (double)this.updAmount1.Value;
    
                // Now we can calculate the amount to apply to each institution
                Amount1 = AmountPledged * RateAmount1 / 100;
                Amount2 = AmountPledged * RateAmount2 / 100;
                Amount3 = AmountPledged * RateAmount3 / 100;
                // We need the difference, if any, left after calculating the amount 
                // pledged to each institution
                Rest = AmountPledged - Amount1 - Amount2 - Amount3;
    
                // Display the value allocated to each institution 
                this.txtAmount1.Text = Amount1.ToString("C");
                this.txtAmount2.Text = Amount2.ToString("C");
                this.txtAmount3.Text = Amount3.ToString("C");
    
                // If there is still money left, let the user know
                if (Rest > 0)
                    this.lblMessage.Text = Rest.ToString("C") + " still to be used";
                else
                    this.lblMessage.Text = "";
    }
  5. Return to the form
  6. Double-click the middle up-down control and implement its event as follows:
     
    private void updAmount2_ValueChanged(object sender, EventArgs e)
    {
                double AmountPledged = 0.00D;
                double RateAmount1, RateAmount2, RateAmount3,
                    Amount1, Amount2, Amount3,
                    Rest;
    
                try
                {
                    AmountPledged = double.Parse(this.txtAmountPledged.Text);
    
                }
                catch (FormatException)
                {
                    MessageBox.Show("The amount you entered to pledge is not valid");
                }
    
                RateAmount1 = (double)this.updAmount1.Value;
                RateAmount3 = (double)this.updAmount3.Value;
                this.updAmount2.Maximum = (decimal)(100 - RateAmount1 - RateAmount3);
                RateAmount2 = (double)this.updAmount2.Value;
    
                Amount1 = AmountPledged * RateAmount1 / 100;
                Amount2 = AmountPledged * RateAmount2 / 100;
                Amount3 = AmountPledged * RateAmount3 / 100;
                Rest = AmountPledged - Amount1 - Amount2 - Amount3;
    
                this.txtAmount1.Text = Amount1.ToString("C");
                this.txtAmount2.Text = Amount2.ToString("C");
                this.txtAmount3.Text = Amount3.ToString("C");
    
                if (Rest > 0)
                    this.lblMessage.Text = Rest.ToString("C") + " still to be used";
                else
                    this.lblMessage.Text = "";
    }
  7. Return to the form
  8. Double-click the bottom up-down control and implement its event as follows:
     
    private void updAmount3_ValueChanged(object sender, EventArgs e)
    {
                double AmountPledged = 0.00D;
                double RateAmount1, RateAmount2, RateAmount3,
                    Amount1, Amount2, Amount3,
                    Rest;
    
                try
                {
                    AmountPledged = double.Parse(this.txtAmountPledged.Text);
                }
                catch (FormatException)
                {
                    MessageBox.Show("The amount you entered to pledge is not valid");
                }
    
                RateAmount1 = (double)this.updAmount1.Value;
                RateAmount2 = (double)this.updAmount2.Value;
                this.updAmount3.Maximum = (decimal)(100 - RateAmount1 - RateAmount2);
                RateAmount3 = (double)this.updAmount3.Value;
    
                Amount1 = AmountPledged * RateAmount1 / 100;
                Amount2 = AmountPledged * RateAmount2 / 100;
                Amount3 = AmountPledged * RateAmount3 / 100;
                Rest = AmountPledged - Amount1 - Amount2 - Amount3;
    
                this.txtAmount1.Text = Amount1.ToString("C");
                this.txtAmount2.Text = Amount2.ToString("C");
                this.txtAmount3.Text = Amount3.ToString("C");
    
                if (Rest > 0)
                    this.lblMessage.Text = Rest.ToString("C") + " still to be used";
                else
                    this.lblMessage.Text = "";
    }
  9. Return to the form and click (once) the Amount Pledged text box
  10. In the Properties window, click the Events button
  11. Double-click the Leave field to generate its event and implement it as follows:
     
    private void txtAmountPledged_Leave(object sender, EventArgs e)
    {
            // Make sure the amount pledged text box has a number
            // If it doesn't, then display the UpDown controls 
            // so the user cannot use them and cause bad events
            if( txtAmountPledged.Text == "" )
            {
                    updAmount1.Enabled = false;
                    updAmount2.Enabled = false;
                    updAmount3.Enabled = false;
            }
            else
            {
                    updAmount1.Enabled = true;
                    updAmount2.Enabled = true;
                    updAmount3.Enabled = true;
            }
    }
  12. Return to the form 
  13. Double-click the Close button and implement its Click event its event as follows:
     
    private void btnClose_Click(object sender, System.EventArgs e)
    {
    	Close();
    }
  14. Test the application
     
    Test of the Pledge Distribution Application
  15. Close the form and return to your programming environment

 

Introduction to the Domain Up Down Control

 

Description

A spin button, also called an up-down control, is usually made to display a numeric value that can then be increased or decreased when the user clicks one of the buttons of the controls. In a Microsoft Windows typical application, if you wanted to deal with values other than numbers, there was some gymnastic code to write. Fortunately, the .NET Framework provides a special spin button that can hold and display values other numbers.

The .NET Framework's domain up-down control is a text-based object created from a class named DomainUpDown. Like NumericUpDown, the DomainUpDown class is derived from the UpDownBase class where it gets its primary functionality from.

Creating a Domain Up-Down Control

At design time, to get a domain up-down control, from the Toolbox, you can click the DomainUpDown button and click the form. To programmatically create a domain up-down control, declare a variable of type DomainUpDown, initialize it and add it to the Controls property of the container that will hold it. Here is an example:

using System;
using System.Drawing;
using System.Windows.Forms;

public class Exercise : System.Windows.Forms.Form
{
    DomainUpDown spnNames;

    public Exercise()
    {
        InitializeComponent();
    }

    private void InitializeComponent()
    {
        spnNames  = new DomainUpDown();
        
        Controls.Add(spnNames);
    }
}

public class Program
{
    static int Main()
    {
        System.Windows.Forms.Application.Run(new Exercise());
        return 0;
    }
}

This would produce:

ApplicationApplication: Introducing the Domain Up-Down Control

  1. Start a new Windows Application and name it MovieReview1
  2. Right-click each of the following pictures and paste them in the MovieReview1\MovieReview1\bin\Debug folder of the current project
     
  3. Design the form as follows:
     
    Movie Review
    Control Text Name Other Properties
    Label Title:    
    DomainUpDown   dudTitles  
    Label Director:    
    TextBox   txtDirector  
    Label Cast of Characters    
    Label Year    
    TextBox   txtYearReleased TextAlign: Right
    Label Rating:    
    TextBox   txtRating  
    ListBox   lbxCastMembers  
    Label Length:    
    TextBox   txtLength  
    PictureBox   pbxImage  
    Button Close btnClose  
  4. In the Solution Explorer, right-click Form1.cs and click Rename
  5. Type MovieReview.cs and press Enter

Characteristics of the Domain Up-Down Control

 

Introduction

The spin button shares the normal characteristics of other graphical Windows controls that they inherit from their ancestor the Control class. These characteristics including the location, the size, the background color, the ability to be enabled or disabled, the ability to be hidden or shown, etc. As a text-based object, the domain up-down control uses characteristics such as the ability to display text, alignment of text, and the ability to resize itself according to the length of its text, which is based on the AutoSize property.

Because the DomainUpDown class is derived from the UpDownBase class, it inherits the ability to specify on what side of the text box the spin button will align, to the left or to the right. This is controlled by the UpDownAlign property. The DomainUpDown class also inherits the ability to let the user manually change the value of the control. This is supported by the UserEdit Boolean property.

ApplicationApplication: Configuring the Control

  1. On the form, click the domain up-down control
  2. In the Properties window, set the TextAlign property to Center
  3. Set the UpDownAlign property to Left
     
  4. Save the form

The Text of the Control

When using the spin button, the user can click one of the arrow buttons. This would bring the next or the previous string of the list and display that item in the text box part of the control. The user can also first give focus to the control, and then use the arrow keys to navigate in the list of strings.

At any time, the string that is currently displaying on the spin button is represented by its Text property. To specify the string that the control should display, at design time, you can enter the string in the Text field of the Properties window. To programmatically specify what item the control should display, assign it to its Text property. Here is an example:

private void InitializeComponent()
{
        spnNames  = new DomainUpDown();
        spnNames.Location = new Point(12, 12);

        spnNames.Text = "Paul Yamaguchi";

        Controls.Add(spnNames);
}

This would produce:

You can even use a string that is not in the collection. If you do, the control would display it but if the user changes the current item of the control that string would disappear and the user cannot get it back.

The Items of the Control

As mentioned already, instead of displaying (only) numbers, the domain up-down control can be used to display strings (and/or numbers). To make this possible, the control must hold a list the strings to display. This list is held by the Items property. At design time, to create a list of values, in the Properties window of the control, click Items and click its ellipsis button. This would open the String Collection Editor

String Collection Editor

You can then type each string on its own line (of course, you can type only numbers or a mix of numbers and strings). After creating the list, you can click OK.

The DomainUpDown.Items property is based on the nested DomainUpDownItemCollection class. The DomainUpDownItemCollection class is derived from the ArrayList class which gives it the ability to create and manage its list. To programmatically add a string to the list, call its Add() method. You can do this continually until you have added all the necessary strings. Here is an example:

private void InitializeComponent()
{
        spnNames  = new DomainUpDown();
        spnNames.Location = new Point(12, 12);

        spnNames.Items.Add("Patricia Katts");
        spnNames.Items.Add("Paul Bertrand Yamaguchi");
        spnNames.Items.Add("Marguerite Soya");

        Controls.Add(spnNames);
}

Instead of adding one item at a time, the DomainUpDownItemCollection class is equipped with a method named AddRange. This allows you to add an array of items. Here is an example:

private void InitializeComponent()
{
        spnNames  = new DomainUpDown();
        spnNames.Location = new Point(12, 12);
        spnNames.Items.Add("Patricia Katts");
        spnNames.Items.Add("Paul Yamaguchi");
        spnNames.Items.Add("Marguerite Soya");

        string[] Names = new string[]
        {
            "Huguette Lingon", "Peter Kabba",
            "Harry Almada", "Allen Dean"
        };
        spnNames.Items.AddRange(Names);

        Controls.Add(spnNames);
}

When calling Add() (or AddRange()), the new item(s) is(are) added at the end of the existing list, unless the list is empty, in which case the item(s) would be the first. The DomainUpDownItemCollection class is also equipped with a method named Insert() that allows you to add a new item somewhere inside the list at a position of your choice.

ApplicationApplication: Populating the Control

  1. Double-click an unoccupied area of the form and change the file as follows:
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace MovieReview1
    {
        public partial class MovieReview : Form
        {
            string[] Titles        = new string[8];
            string[] Directors     = new string[8];
            int[]    YearsReleased = new int[8];
            string[] Ratings       = new string[8];
            string[] Lengths       = new string[8];
            string[] Pictures      = new string[8];
    
            ListBox[] Actors = new ListBox[8];
    
            public MovieReview()
            {
                InitializeComponent();
            }
    
            private void MovieReview_Load(object sender, EventArgs e)
            {
                Titles[0] = "Distinguished Gentleman (The)";
                Directors[0] = "Jonathan Lynn";
                YearsReleased[0] = 1992;
                Ratings[0] = "R";
                Lengths[0] = "112 Minutes";
                Pictures[0] = "distgent.jpg";
                Actors[0] = new ListBox();
                Actors[0].Items.Add("Eddie Murphy");
                Actors[0].Items.Add("Lane Smith");
                Actors[0].Items.Add("Sheryl Lee Ralph");
                Actors[0].Items.Add("Joe Don Baker");
                Actors[0].Items.Add("Victoria Rowell");
                Actors[0].Items.Add("Grant Shaud");
                Actors[0].Items.Add("Kevin McCarthy");
                Actors[0].Items.Add("Charles S. Dutton");
                Actors[0].Items.Add("Victor Rivers");
                Actors[0].Items.Add("Chi McBride");
                Actors[0].Items.Add("Sonny Jim Gaines");
                Actors[0].Items.Add("Noble Willingham");
                Actors[0].Items.Add("Gary Frank");
                Actors[0].Items.Add("Daniel Benzali");
                Actors[0].Items.Add("Cynthia Harris");
    
                Titles[1] = "Fatal Attraction";
                Directors[1] = "Adrian Lyne";
                YearsReleased[1] = 1987;
                Ratings[1] = "R";
                Lengths[1] = "119 Minutes";
                Pictures[1] = "fatal.jpg";
                Actors[1] = new ListBox();
                Actors[1].Items.Add("Michael Douglas");
                Actors[1].Items.Add("Glenn Close");
                Actors[1].Items.Add("Anne Archer");
                Actors[1].Items.Add("Ellen Hamilton Latzen");
                Actors[1].Items.Add("Stuart Pankin");
    
                Titles[2] = "New Jack City";
                Directors[2] = "Mario Van Peebles";
                YearsReleased[2] = 1991;
                Ratings[2] = "R";
                Lengths[2] = "97 Minutes";
                Pictures[2] = "newjack.jpg";
                Actors[2] = new ListBox();
                Actors[2].Items.Add("Wesley Snipes");
                Actors[2].Items.Add("Ice-T");
                Actors[2].Items.Add("Allen Payne");
                Actors[2].Items.Add("Chris Rock");
                Actors[2].Items.Add("Mario Van Peebles");
                Actors[2].Items.Add("Michael Michele");
                Actors[2].Items.Add("Bill Nunn");
    
                Titles[3] = "Showgirls";
                Directors[3] = "Paul Verhoeven";
                YearsReleased[3] = 1995;
                Ratings[3] = "NC-17";
                Lengths[3] = "128 Minutes";
                Pictures[3] = "showgirls.jpg";
                Actors[3] = new ListBox();
                Actors[3].Items.Add("Elizabeth Berkley");
                Actors[3].Items.Add("Kyle MacLachlan");
                Actors[3].Items.Add("Gina Gershon");
                Actors[3].Items.Add("Glenn Plummer");
    
                Titles[4] = "Annie";
                Directors[4] = "John Huston";
                YearsReleased[4] = 1982;
                Ratings[4] = "PG";
                Lengths[4] = "126 Minutes";
                Pictures[4] = "annie.jpg";
                Actors[4] = new ListBox();
                Actors[4].Items.Add("Albert Finney");
                Actors[4].Items.Add("Carol Burnett");
                Actors[4].Items.Add("Ann Reinking");
                Actors[4].Items.Add("Tim Curry");
                Actors[4].Items.Add("Bernadette Peters");
    
                Titles[5] = "Dave";
                Directors[5] = "Ivan Reitman";
                YearsReleased[5] = 1993;
                Ratings[5] = "R";
                Lengths[5] = "110 Minutes";
                Pictures[5] = "Dave.jpg";
                Actors[5] = new ListBox();
                Actors[5].Items.Add("Kevin Kline");
                Actors[5].Items.Add("Sigourney Weaver");
                Actors[5].Items.Add("Frank Langella");
                Actors[5].Items.Add("Kevin Dunn");
                Actors[5].Items.Add("Ving Rhames");
                Actors[5].Items.Add("Ben Kingsley");
                Actors[5].Items.Add("Charles Grodin");
    
                Titles[6] = "Housesitter";
                Directors[6] = "Frank Oz";
                YearsReleased[6] = 1992;
                Ratings[6] = "PG";
                Lengths[6] = "110 Minutes";
                Pictures[6] = "housesitter.jpg";
                Actors[6] = new ListBox();
                Actors[6].Items.Add("Steve Martin");
                Actors[6].Items.Add("Goldie Hawn");
                Actors[6].Items.Add("Dana Delany");
                Actors[6].Items.Add("Julie Harris");
                Actors[6].Items.Add("Donald Moffat");
                Actors[6].Items.Add("Peter MacNicol");
    
                Titles[7] = "Beverly Hills Cop";
                Directors[7] = "Martin Brest";
                YearsReleased[7] = 1984;
                Ratings[7] = "R";
                Lengths[7] = "105 Minutes";
                Pictures[7] = "bhc.jpg";
                Actors[7] = new ListBox();
                Actors[7].Items.Add("Eddie Murphy");
                Actors[7].Items.Add("Judge Reinhold");
                Actors[7].Items.Add("John Ashton");
                Actors[7].Items.Add("Lisa Eilbacher");
                Actors[7].Items.Add("Ronny Cox");
                Actors[7].Items.Add("Steven Berkoff");
                Actors[7].Items.Add("James Russo");
                Actors[7].Items.Add("Jonathan Banks");
                Actors[7].Items.Add("Bronson Pinchot");
                Actors[7].Items.Add("Paul Reiser");
                
                dudTitles.Items.AddRange(Titles);
    
                dudTitles.SelectedIndex = 0;
                dudTitles_SelectedItemChanged(sender, e);
            }
        }
    }
  2. Return to the form

Sorting the List

As you create the list of strings, they are added either at the end (with Add() or AddRange()) or inserted (with Insert()) at the position of your choice. If you want the items to be arranged in alphabetical or chronological order, use the Sorted Boolean property.

To find out whether the list is sorted or not, get the value of the control's Sorted property.

The Index of the Current String

When the user clicks one of the buttons of the spin control or use an arrow key to change the item, the control fires a SelectedItemChanged event. You can use this event to find out what the index of the item that was selected. You have to alternatives.

You can identify an item by its index. The index of the current item is represented by the SelectedIndex property, which is an integer. If you prefer to locate an item by its name (or string), you can use the SelectedItem property, which is of type object. You can also use the SelectedItem property to specify the string that the spin button should display. To do this, simply assign a string to this property. Here is an example:

private void InitializeComponent()
{
        spnNames  = new DomainUpDown();
        spnNames.Location = new Point(12, 12);
        spnNames.Items.Add("Patricia Katts");
        spnNames.Items.Add("Paul Yamaguchi");
        spnNames.Items.Add("Marguerite Soya");

        string[] Names = new string[]
        {
            "Huguette Lingon", "Peter Kabba",
            "Harry Almada", "Allen Dean"
        };
        spnNames.Items.AddRange(Names);

        spnNames.SelectedItem = "Peter Kabba";

        Controls.Add(spnNames);
}

Unlike the Text property, if you assign a string that is not in the list, it would not show in the text box part of the control. This means that, if you assign a string (that is not in the list of control's strings) to the Text property, the compiler would simply display that string in the control. On the other hand, when you assign a string to the SelectedItem property, the compiler would check in the list if that string exists. If it finds it, then it displays it in the text box. If it does not find, it does nothing: it does not throw an exception.

ApplicationApplication: Identifying the Selected Item

  1. On the form, double-click the domain up-down control
  2. Implement its event as follows:
     
    private void dudTitles_SelectedItemChanged(object sender, EventArgs e)
    {
            lbxCastMembers.Items.Clear();
    
            txtDirector.Text = Directors[dudTitles.SelectedIndex + 1];
            txtYearReleased.Text =
                    YearsReleased[dudTitles.SelectedIndex + 1].ToString();
            txtRating.Text = Ratings[dudTitles.SelectedIndex + 1];
            txtLength.Text = Lengths[dudTitles.SelectedIndex + 1];
            pbxImage.Image =
                    Image.FromFile(Pictures[dudTitles.SelectedIndex + 1]);
            lbxCastMembers.Items.AddRange(Actors[dudTitles.SelectedIndex + 1].Items); 
    }
  3. Return to the form
  4. Double-click the Close button and implement its event as follows:
     
    private void btnClose_Click(object sender, EventArgs e)
    {
                Close();
    }
  5. Execute the application and test the domain control
  6. Close the form and return to your programming environment

Wrapping the List Navigation

As mentioned previously, when the user navigates through the list, the items are changed one after another. When the user gets to the end of the list, the navigation stops and the user cannot go further. As an alternative, when the user gets to the end of the list and click the up button, if you want, you can make the list restart from the beginning. This characteristics is controlled by the Wrap Boolean property whose default value is false.

To find out whether the control is currently set to wrap, get the value of its Wrap property.

ApplicationApplication: Wrapping the Navigation

  1. On the form, click the domain up-down control
  2. In the Properties window, double-click Wrap to set its value to True 
  3. Execute the application and test the domain control
     
  4. Close the form and return to your programming environment

Previous Copyright © 2004-2010 FunctionX, Inc. Next