2009-08-24 9 views
2

NumericUpDown, похоже, имеет дело только с целыми числами. Как я могу изменить его (?), Поэтому я могу использовать удвоения в качестве значения и приращения?WinForms: NumericUpDown (.NET CF 3.5) и действительные числа

+0

Обязательно добавьте это в качестве комментария: NumericUpDown - это, наверное, самый уродливый, самый бескомпромиссный, самый бесполезный контроль в истории Windows. Ваши клиенты будут любить вас, если вы придумаете любой другой способ ввода чисел. ввод чисел с помощью SIP (в режиме клавиатуры) - это боль, но если вы зададите вопрос «Какой способ ввести номера в Windows Mobile?», я опубликую самый красивый фрагмент кода C#, который я когда-либо встречал – MusiGenesis

+1

Я использовал слайд-бары рядом с ними на рабочем столе, чтобы сделать его проще. – 2009-08-24 20:29:38

+0

@MusiGenesis: http://stackoverflow.com/questions/1324559/whats-the-best-way-to-enter-numbers-in-windows -mobile-net-cf-3-5/1324599 # 1324599;) – 2009-08-24 20:37:07

ответ

0

Существует свойство DecimalPlaces. Установите его на нечто большее, чем 0, и это позволит вам работать с десятичными знаками.

+1

Не работает на CF. –

+0

Кажется, что нет «Десятичных фигур» в CompactFramework – 2009-08-24 20:17:38

+0

oops, извините, не заметили __CF__ –

2

NumericUpDown работает с десятичными типами, но является целым числом только на компактном каркасе. Это ограничение класса CF.

Существует, однако, CodeProject UserControl, который обеспечивает реализацию для CF.

+0

Есть ли обходной путь или бесплатная альтернатива? – 2009-08-24 20:18:27

+0

Да. Я просто добавил это к своему ответу. –

+0

Спасибо. Я видел это. Его текстовое поле с двумя изображениями и таймером (!!). Я тестировал его, и он не получает вход в 50% случаев. Я щелкаю и ничего не происходит. – 2009-08-24 20:33:09

2

Я просто использую текстовое поле, а затем переопределяю событие OnKeyPress. Этот код работал для меня в прошлом, но хорош только для групп, которые пишут 1234,56, а не 1234,56.

public partial class NumberTextBox : TextBox 
{ 
    public NumberTextBox() 
    { 
     InitializeComponent(); 
    } 

    public decimal Value 
    { 
     get 
     { 
      try 
      { 
       return decimal.Parse(Text); 
      } 
      catch (Exception) 
      { 
       return -1; 
      } 
     } 
    } 

    public int ValueInt 
    { 
     get { return int.Parse(Text); } 
    } 

    protected override void OnKeyPress(KeyPressEventArgs e) 
    { 
     if (!char.IsControl(e.KeyChar) 
      && !char.IsDigit(e.KeyChar) 
      && e.KeyChar != '.') 
     { 
      e.Handled = true; 
     } 

     // only allow one decimal point 
     if (e.KeyChar == '.' && (this).Text.IndexOf('.') > -1) 
     { 
      e.Handled = true; 
     } 
     base.OnKeyPress(e); 
    } 

    public void AppendString(string value) 
    { 
     if (string.IsNullOrEmpty(value)) 
     { 
      Text = string.Empty; 
     } 
     else 
     { 
      if (value == "." && Text.IndexOf('.') > -1) 
       return; 
      Text += value; 
     } 
    } 
} 
0

Мой код является всего лишь одним блочным кодом здесь (протестирован с Compact Framework);

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     if (e.KeyChar == '.') 
     { 
      if (((TextBox)sender).Text.IndexOf('.') > -1) 
      { 
       e.Handled = true; 
      } 
      else if (((TextBox)sender).Text.Length == 0) 
      { 
       e.Handled = true; 
      } 
     } 
     else if (!char.IsDigit(e.KeyChar)) 
     { 
      e.Handled = true; 
     } 

     if (e.KeyChar == '\b') // backspace silme tuşunun çalıması için gerekli 
     { 
      e.Handled = false; 
     } 

     base.OnKeyPress(e); 
    } 

, кстати, я ненавижу Compact Framework. Потому что он слишком ограничен! Но я должен :(