Как разделить цифры запятыми (,) в текстовом поле в C # winform? - PullRequest
0 голосов
/ 05 марта 2019

Я хочу разделить цифры запятыми в текстовом поле в Winforms.Я написал эту функцию, и она работает:

public string setComma(double number)
{
    string x = string.Format("{0:n0}", number);
    return x;
}

private void txtPayani_TextChanged(object sender, EventArgs e)
{
    txtPayani.Text = setComma(payani);
}

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

Чтобы решить эту проблему, я использовал этот код:

private void txtPayani_TextChanged(object sender, EventArgs e)
{
    txtPayani.Text = setComma(payani);
    txtPayani.Select(txtPayani.Text.Length, 0);
}

, но когда я удаляю одно текстовое поле формы со средней цифрой, сновакурсор мыши назад вправо, и это плохо.

Что мне делать?

Ответы [ 3 ]

2 голосов
/ 05 марта 2019
0 голосов
/ 07 марта 2019

Рассмотрите возможность создания пользовательского текстового поля, которое содержит значение double и форматирование string и отображает форматированный текст, когда текстовое поле не имеет фокуса, и фактическое значение, когда текст редактируется.

Например, когда не в фокусе, такой пользовательский элемент управления с .Formatting = "n" для форматирования будет выглядеть так:

scr1

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

scr2

Смотрите ниже код, который я использовал для этого:

[DefaultProperty("Value"), DefaultBindingProperty("Value")]
public class NumericTextBox : TextBox
{
    string formatting;
    double value;

    public NumericTextBox()
    {
        this.formatting = "g";
        this.value = 0.0;

        base.ReadOnly = true;
        base.Text = "0.0";
    }

    [Category("Data")]
    [SettingsBindable(true)]
    [DefaultValue("g")]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    [Bindable(BindableSupport.Yes)]
    public string Formatting
    {
        get => formatting;
        set
        {
            if (formatting == value)
            {
                return;
            }
            this.formatting= value;
            OnFormattingChanged(this, EventArgs.Empty);
            try
            {
                base.Text = Value.ToString(value);
            }
            catch (FormatException ex)
            {
                Trace.WriteLine(ex.ToString());
                base.Text = Value.ToString();
            }
        }
    }
    public event EventHandler FormattingChanged;

    protected void OnFormattingChanged(object sender, EventArgs e) => FormattingChanged?.Invoke(sender, e);

    [Category("Data")]
    [SettingsBindable(true)]
    [DefaultValue(0.0)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    [Bindable(BindableSupport.Yes)]
    public double Value
    {
        get => this.value;
        set
        {
            if (this.value == value)
            {
                return;
            }
            this.value=value;
            OnValueChanged(this, EventArgs.Empty);
            base.Text = value.ToString(Formatting);
        }
    }

    public event EventHandler ValueChanged;

    protected void OnValueChanged(object sender, EventArgs e) => ValueChanged?.Invoke(sender, e);

    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        base.ReadOnly = true;
        if (double.TryParse(base.Text, out double x))
        {
            base.Text = x.ToString(Formatting);
            this.Value = x;
        }
    }
    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        base.ReadOnly = false;
        base.Text = Value.ToString("R");
    }

}
0 голосов
/ 05 марта 2019

Вы должны использовать TextBox.CaretIndex для установки позиции вставки, чтобы при изменении TextBox.Text позиция вставки не изменялась. Вы, вероятно, не хотите использовать TextBox.Select(). Непроверенный код ниже:

private void txtPayani_TextChanged(object sender, EventArgs e)
    {
        int Position = txtPayani.CaretIndex;
        int Length = txtPayani.Text.Length;

        txtPayani.Text = setComma(payani);

        if(Position == Length) // If it was at the end, keep it there
        {
            txtPayani.CaretIndex = txtPayani.Text.Length;
        }
        else // Else, keep it in the same spot
        {
            txtPayani.CaretIndex = Position;
        }
    }

Если вы используете WinForms, вам может понадобиться использовать SelectionStart и SelectionLength, чтобы сделать что-то подобное. Вы не указали свою структуру пользовательского интерфейса, которая будет полезна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...