Как держать недопустимое значение для NumericUpDown после того, как это теряет фокус?

В моем проекте существует UserControl, который включает NumericUpDown ctrl, и его допустимый диапазон значений от 10 до 100,

таким образом, если вводы данных пользователем 200 в NumericUpDown ctrl, то его значение будет измененный на 100 автоматически после фокуса, измененного на другой ctrl, это выглядит немного любопытным для клиента, потому что они могут нажать кнопку OK, после того, как введено 200 в NumericUpDown ctrl, им нужно окно сообщения, которое говорит им значение, которое они вводят, не находится в диапазоне.

Но вопросом является значение для NumericUpDown, изменится автоматически после фокуса, измененного, если вход значения будет вне его диапазона.

Таким образом, как реализовать это?

Sameh Serag, это - код, который я протестировал. Я имею, добавляет кнопка на форме, но ничего не сделала. Результат для меня состоит в том после того, как я ввел 200 и нажимаю кнопку, только messagebox со значением 100 показывают. После того, как я ввел 200 и нажимаю клавишу Tab, она только покажет messagebox со значением 200, и текстовое значение в NumericUpDown изменяется на 100. Настолько любопытный :-) Так или иначе большое спасибо за Вашу справку! BTW, версия платформы .NET 2.0 с sp2 для меня.

public partial class Form1 : Form
{
    private TextBox txt;

    public Form1()
    {
        InitializeComponent();

        txt = (TextBox)numericUpDown1.Controls[1];
        txt.Validating += new CancelEventHandler(txt_Validating);
    }

    void txt_Validating(object sender, CancelEventArgs e)
    {
        MessageBox.Show(txt.Text);
    }
}
6
задан abatishchev 27 August 2012 в 13:20
поделиться

1 ответ

Фокус в том, чтобы встроить текстовое поле в числовой элемент управления и обработать его событие Validating.

Вот как это сделать:

Создайте фиктивную форму и добавьте элемент управления numeric updown и некоторые другие элементы управления, и когда элемент управления numeric unpdown потеряет фокус, текст формы будет установлен на значение, которое ввел пользователь.

Вот код того, что я сделал:

public partial class Form1 : Form
    {
        TextBox txt;
        public Form1()
        {
            InitializeComponent();
            txt = (TextBox)numericUpDown1.Controls[1];//notice the textbox is the 2nd control in the numericupdown control
            txt.Validating += new CancelEventHandler(txt_Validating);
        }
        void txt_Validating(object sender, CancelEventArgs e)
        {
            this.Text = txt.Text;
        }
    }

EDIT:

@Carlos_Liu: Хорошо, теперь я вижу проблему, вы можете достичь этого с помощью события TextChanged, просто сохраните значение в фиктивной переменной и повторно используйте его в txt_Validating, но будьте осторожны, не обновляйте эту переменную, пока текстовое поле не сфокусировано.

Вот новый пример кода:

public partial class Form1 : Form
{
    TextBox txt;
    string val;
    public Form1()
    {
        InitializeComponent();
        txt = (TextBox)numericUpDown1.Controls[1];//notice the textbox is the 2nd control in the numericupdown control
        txt.TextChanged += new EventHandler(txt_TextChanged);
        txt.Validating += new CancelEventHandler(txt_Validating);
    }

    void txt_TextChanged(object sender, EventArgs e)
    {
        if (txt.Focused) //don't save the value unless the textbox is focused, this is the new trick
            val = txt.Text;
    }
    void txt_Validating(object sender, CancelEventArgs e)
    {
        MessageBox.Show("Val: " + val);
    }
}

EDIT#2

@Carlos_Liu: Если вам нужно, чтобы введенное значение сохранялось, все еще есть трюк для этого: @ событие Validating текстового поля, проверьте значение, если оно не в пределах диапазона, отмените, потеряв фокус!

Вот новая версия кода:

public partial class Form1 : Form
{
    TextBox txt;
    string val;
    public Form1()
    {
        InitializeComponent();
        txt = (TextBox)numericUpDown1.Controls[1];
        txt.TextChanged += new EventHandler(txt_TextChanged);
        txt.Validating += new CancelEventHandler(txt_Validating);
    }

    void txt_TextChanged(object sender, EventArgs e)
    {
        if (txt.Focused)
            val = txt.Text;
    }
    void txt_Validating(object sender, CancelEventArgs e)
    {
        int enteredVal = 0;
        int.TryParse(val, out enteredVal);
        if (enteredVal > numericUpDown1.Maximum || enteredVal < numericUpDown1.Minimum)
        {
            txt.Text = val;
            e.Cancel = true;
        }
    }
}
13
ответ дан 8 December 2019 в 18:35
поделиться