Hola,
Agrega a tu proyecto una nueva clase llamada NumericComboBox y copia el código que sigue. Este te permitirá agregar un nuevo componente del tipo combobox en tu Toobox del VS, Sin embargo en este componente se pueden ingresar numeros enteros o dobles, si quieres ingresar un sólo dígito debes programarlo en el evento NumericBox_TextChanged, algo así como if(this.Text.long > 1)....
Bueno, suerte con esto. Ojalá te sirva esto.
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows.Forms;
namespace Documentos
{
public partial class NumericComboBox : ComboBox
{
public NumericComboBox()
{
InitializeComponent();
}
public NumericComboBox(IContainer container)
{
container.Add(this);
InitializeComponent();
}
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// NumericComboBox
//
this.TextChanged += new System.EventHandler(this.NumericBox_TextChanged);
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// Variable que indica si es entero o no (real)
/// </summary>
bool _isInteger = false;
/// <summary>
/// Valor antes de actualizar
/// </summary>
double ValorAntiguo = 0;
/// <summary>
/// Valor actualizando
/// </summary>
double ValorNuevo;
/// <summary>
/// Entero antes de actualizar
/// </summary>
int iValorAntiguo = 0;
/// <summary>
/// Entero actualizando
/// </summary>
int iValorNuevo;
/// <summary>
/// Propiedad que indica si el valor que recibe es un entero
/// </summary>
public bool isInteger
{
get
{
return _isInteger;
}
set
{
_isInteger = value;
}
}
/// <summary>
/// Se ejecuta cuando el valor cambia
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void NumericBox_TextChanged(object sender, EventArgs e)
{
if (this.Text == null || this.Text == "")
{
//Si el texto es nulo, termina. Devuelve cero
iValorAntiguo = 0;
ValorAntiguo = 0;
this.Text = "0";
return;
}
//Determina cual es el proceso que debe llamarse dependiendo si el valor es entero o no
if (_isInteger)
{
comprobarInt();
}
else
{
comprobarDouble();
}
}
/// <summary>
/// Comprueba si el valor ingresado es un real double
/// </summary>
void comprobarDouble()
{
try
{
ValorNuevo = double.Parse(this.Text);
ValorAntiguo = ValorNuevo;
}
catch
{
MessageBox.Show("Debe Ingresar un Número", "Aviso");
this.Text = ValorAntiguo.ToString();
}
}
/// <summary>
/// Comprueba si el valor ingresado en un entero
/// </summary>
void comprobarInt()
{
try
{
iValorNuevo = int.Parse(this.Text);
iValorAntiguo = iValorNuevo;
}
catch
{
MessageBox.Show("Debe Ingresar un Número Entero", "Aviso");
this.Text = iValorAntiguo.ToString();
}
}
}
}