Numeric UpDown Control for Hardware Control Applications or Yet Another SpinEdit






4.55/5 (9 votes)
An article on numeric Up/Down control with some unique features useful for hardware control applications

Introduction
For many of my projects which are mainly related to controlling hardware, I need a numeric UpDown
(SpinEdit
) control which could easily and quickly change value extending along many orders of magnitude, let's say to change frequency from 1 to 2 GHz and then add 200 Hz more. Unfortunately standard controls provided by Borland VCL or .ET do not satisfy this requirement. A search among third party controls was not successful too as I needed some specific capabilities, most notably the value late update. Under the late update I mean that for hardware control application it is common that SpinEdit
controls value on remote device and thus it is desirable to initiate value change by SpinEdit
, but postpone the actual Value change until hardware confirms that parameter has been changed.
The simple IgSpinEdit
control offered in this article provides the required functionality. It was originally developed for Borland C Builder, but as I started to use .NET some time ago I ported it to C# and improved it a bit. I am not going to discuss the actual code in this article. It is present in the zip file. I will only give a brief explanation of the major properties.
Using the Code
The control is built upon UserControl
and provides the following original features:
- Extra UpDown buttons to control
Increment
value, which may change between adjustableIncrementMin
andIncrementMax
. On everyIncrement
change, a position of the digit in the value controlled by Value UpDown is advanced back or forth on one position thus providing quick navigation along wide range numbers. Tooltip gives a clue as to which digital position is currently affected. IncrementVisible
property which controls whether or not IncrementUpDown
buttons are visible.ExternalUpdate
property which governs if theValue
changes instantly or through external code.Pow2Increment
property which, if set, directs the control to generate sequence where the next value is twice as high or twice as low as the previous one. It can generate any base*2^n series, e.g. useful 1, 2, 4, 8 … n^2 (base = 1). In this mode,Increment
is controlled byIgSpinEdit
itself and thus Increment UpDown buttons are automatically hidden.- Flexible visual representation of the
Value
provided byFormatString
property along withValueAsInt
andValueAsHex
properties.ValueAsInt
andValueAsHex
do not change the internal representation of the value, which isdouble
, but control how the value is displayed. For example, to show value as Hex, setValueAsHex
totrue
andFormatString
to “0x{0:Xn}
”, where n is the number of digits to display.ValueAsHex
, if set, also changes Increment multiplier from default10
to16
to provide same one digit advance on every hit on IncrementUpDown
. ValueChanging
event which is raised ifExternalUpdate
is set totrue
and valueUpDown
button has been pressed. The control passes a new value to the handler without updating its internal state. Handler may cancel update by settinge.Cancel
or pass newe.Value
to external code which should later update internal value state by assigning toValue
property directly.ValueChanged
event which is raised whenValue
has been updated internally.
Other properties and events are inherited from UserControl
.
The control does not try to prevent all possible erroneous parameter combinations, so please apply common sense while setting control properties and it will work quite well.
The control is accompanied with a simple test application showing how to use the control and allows playing with parameters. The application screenshot is presented at the beginning of the article.
One important thing to note is that IgSpinEdit
implements ISupportInitialize
interface to handle correct initialization. Fortunately VS Designer automatically handles calls to ISupportInitialize
BeginInit()/EndInit()
pair, so you should not do it yourself.
For test convenience, an "External update" handler is implemented in the lower left corner of the test application and it handles ValueChanging
event of all IgSpinEdit
controls. Please note that on application start up, only “Value as Int” has ExternalUpdate
set that prevents it from changing value until the Update button is pressed.
Conclusion
This article presents an extended numeric UpDown
control which is especially useful for hardware control applications. There is nothing fancy in it, but I found it really useful for my projects. I hope some readers will agree with me.
Feel free to use the provided code in any way you wish. Comments and suggestions are welcome.
History
- 06-18-2008: Original article