Числовое значение вниз заставляет оператора тысячи обновлять текст при каждом нажатии - PullRequest
3 голосов
/ 08 марта 2011

Когда я использую объект numbericupdown с тысячным оператором, установленным в true, он только обновляет текст, чтобы правильно отображать запятые, когда он теряет фокус. Есть ли способ заставить его обновляться при каждом изменении значения?

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Вам нужно будет сделать событие.Как мы знаем, thounsandseperator срабатывает по фокусу, мы можем просто вызывать его, когда набираем текст.

 private void numericUpDown1_KeyUp(object sender, KeyEventArgs e)
        {
            numericUpDown1.Focus();
            //Edit:
            numericUpDown1.Select(desiredPosition,0)
        }

Таким образом, в качестве пользовательского типа мы возвращаем блоку его фокус, который является хаком для вызова тысячного оператораформатирование.

Примечание: проблемы со взломами являются странными ситуациями, которые требуют большего количества взломов ... например: Курсор возвращается в начало текста ... вам понадобится другой взлом, чтобы исправить это.

Поэкспериментируйте с другими событиями, чтобы найти подходящее для вашего случая.

Редактировать: Кстати, если вы хотите пойти еще дальше с этим ...

  1. СохранитьОтслеживание курсора.
  2. Верните курсор в правильное положение при вызове keyup. Установка позиции курсора в элементе управления numericUpDown
0 голосов
/ 17 марта 2011

Чтобы отформатировать текстовое значение в вашем элементе управления, вам нужен вызов ParseEditText (), который защищен, но доступен из класса, который наследует NumericUpDown.Проблема в том, что после вашего вызова курсор будет перемещаться перед первым символом.Для управления положением курсора вам необходим доступ к свойству SelectionStart, которое NumericUpDown не предоставляет.NumericUpDown все еще имеет поле с именем upDownEdit типа UpDownEdit.Класс UpDownEdit, хотя внутренний наследует от TextBox и ведет себя так же, как один.Таким образом, решением было бы унаследовать от NumericUpDown и использовать отражение, чтобы получить / установить значение upDownEdit.SelectionStart.Вот то, над чем вы можете работать:

public class NumericUpDownExt : NumericUpDown
{
    private static FieldInfo upDownEditField;
    private static PropertyInfo selectionStartProperty;
    private static PropertyInfo selectionLengthProperty;

    static NumericUpDownExt()
    {
        upDownEditField = (typeof(UpDownBase)).GetField("upDownEdit", BindingFlags.Instance | BindingFlags.NonPublic);
        Type upDownEditType = upDownEditField.FieldType;
        selectionStartProperty = upDownEditType.GetProperty("SelectionStart");
        selectionLengthProperty = upDownEditType.GetProperty("SelectionLength");
    }

    public NumericUpDownExt() : base()
    {
    }

    public int SelectionStart
    {
        get
        {
            return Convert.ToInt32(selectionStartProperty.GetValue(upDownEditField.GetValue(this), null));
        }
        set
        {
            if (value >= 0)
            {
                selectionStartProperty.SetValue(upDownEditField.GetValue(this), value, null);
            }
        }
    }

    public int SelectionLength
    {
        get
        {
            return Convert.ToInt32(selectionLengthProperty.GetValue(upDownEditField.GetValue(this), null));
        }
        set
        {
            selectionLengthProperty.SetValue(upDownEditField.GetValue(this), value, null);
        }
    }

    protected override void OnTextChanged(EventArgs e)
    {
        int pos = SelectionStart;
        string textBefore = this.Text;
        ParseEditText();
        string textAfter = this.Text;
        pos += textAfter.Length - textBefore.Length;
        SelectionStart = pos;
        base.OnTextChanged(e);
    }
}
...