C# WinForms numericUpDown control (removing the spin box)
After a ton of googling, I couldn't come up with anything..
Is there any way to get a numericUpDown control that does not have the spin box?
I need a textbox that only accepts integers, and a numericUpDow开发者_运维问答n has the perfect behavior that I am looking for. However, I need to hide the numeric spinbox for space constraints.
When I try to do something like numericUpDown.Controls[0].Hide() or numericUpDown.Controls.RemoveAt(0), the spinbox disappears but leaves an unusuable void where the spinbox used to be. Thus the numbers scroll at that point, meaning the space is wasted..
Is there any other solution to this?
Thanks..
You can inherit from NumericUpDown. The trick is to hide control when the control is created.
public class NumericUpDownWitoutButtons : NumericUpDown
{
public NumericUpDownWitoutButtons()
{
Controls[0].Visible = false;
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.Clear(SystemColors.Window);
base.OnPaint(e);
}
}
If the place were buttons should be looks weird, override OnPaint too.
Also, you probably don't need NumericUpDown. Would it be enough to validate that only digits can by typed in? C# Numbers Only Textbox
I settled for disabling the arrow buttons, as less ugly than trying to hide or remove them.
Immediately after this boilerplate code:
internal MainWin()
{
InitializeComponent();
, add this:
myNumericUpDown.Controls[0].Enabled = false; // Disable the arrow buttons.
Also: set InterceptArrowKeys
to false
in the control's properties, to prevent arrow keys (on the keyboard) from incrementing and decrementing myNumericUpDown.Value
.
Bad ways:
myNumericUpDown.Controls[0].Hide(); // Hide the arrow buttons.
// This leaves a gray patch that turns white after minimize-and-restore.
myNumericUpDown.Controls.RemoveAt(0); // Remove the arrow buttons.
// This leaves a gray patch that turns white after minimize-and-restore.
Half-bad way:
Forget the above. Only set Increment
to 0
in the control's properties. The arrow buttons still operate, and the arrow keys (on the keyboard) are still intercepted, but now they do nothing. Sadly, no-action buttons are probably less intuitive than disabled arrow buttons. (I'm surprised that it even accepts Increment
= 0
. A smart version of this control would neatly hide the arrow buttons when the increment is 0.)
Other solution(s):
A number-box can be implemented as a TextBox
with extra code that restricts input to only numbers, and returns or announces a numeric value (decimal
or your choice). (Searching finds many diverse, complex examples.) Pasted data comes in differently from keystrokes, so additional code is needed to handle pastes. (Upside: You can make the number-box smarter than the built-in NumericUpDown
: NumericUpDown stupidly accepts and displays .
until the user presses Enter or leaves the field, even if you specify DecimalPlaces = 0
; and it accepts and displays multiple decimal points, which is nonsense.)
An integer-box is simpler than a generalized number-box that accepts real numbers (optionally in floating-point notation) and returns a real-number type (float
, double
, or decimal
).
精彩评论