Как проверить, больше ли значение NumericUpDown, чем значение года DateTimePicker? - PullRequest
0 голосов
/ 13 марта 2020

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

У меня тогда есть DateTimePicker для поля DOB: я хочу убедиться, что значение, указанное в NumericUpDown, не больше, чем разница в годах между датой, указанной в DateTimePicker, и текущей датой.

Например, пользователь вводит 10th of january 2010 в DateTimePicker: тогда он не может поместить число больше 10 в NumericUpDown (или, может, но при этом отобразится сообщение об ошибке).

Как мне go сделать это?

Ответы [ 4 ]

0 голосов
/ 13 марта 2020

Ну, обработайте DateTimePicker.ValueChanged, чтобы установить максимальное значение элемента управления NumericUpDown:

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
    numericUpDown1.Maximum = int.Parse(dateTimePicker1.Value.ToString("yy"));
}

Если NumericUpDown показывает 4 цифры для части года, то просто:

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
    numericUpDown1.Maximum = dateTimePicker1.Value.Year;
}

Затем у меня есть DateTimePicker для поля DOB : я хочу убедиться, что значение, указанное в NumericUpDown, не больше, чем разница в годах между датой, указанной в DateTimePicker, и текущей датой.


Затем получите возраст и присвойте его свойству Maximum элемента управления NumericUpDown:

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
    var age = DateTime.Now.Year - dateTimePicker1.Value.Year;

    if (dateTimePicker1.Value > DateTime.Now.AddDays(-1))
        age -= 1;

    numericUpDown1.Maximum = age;
    numericUpDown1.Value = age;
}

Если вы предпочитаете уведомлять пользователя, вы можете использовать, например, компонент ErrorProvider . В этом случае обработайте событие ValueChanged элемента управления NumericUpDown:

//..
//Don't forget to EP.Dispose(); in the FormClosing event.
private readonly ErrorProvider EP = new ErrorProvider();
//..

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
    EP.Clear();

    var age = DateTime.Now.Year - dateTimePicker1.Value.Year;

    if (dateTimePicker1.Value > DateTime.Now.AddDays(-1))
        age -= 1;

    if (age < numericUpDown1.Value)
    {
        numericUpDown1.Value = age;
        EP.SetError(numericUpDown1, "Incorrect age...");                
    }                
}
0 голосов
/ 13 марта 2020

Принимая этот элемент управления https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.datetimepicker.value

dateTime SelectedDate = dtp1.Value;
int SelectedLimit = nud1.Value;

if(SelectedDate.Year >= SelectedLimit)
  //do something
else
  //do something else

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

Лично я предпочитаю довольно "пассивные" отчеты об ошибках через INotifyDataErrorInfo и аналогичные интерфейсы. Вывести сообщение, не пытаться принудительно указывать c значения.

0 голосов
/ 13 марта 2020

Вы можете использовать свойство Maximum, чтобы установить максимальное значение для NumericUpDown.

Пожалуйста, обратитесь к следующему коду.

public Form1()
{
    InitializeComponent();
    // When the DateTimePicker value has not changed
    numericUpDown1.Maximum = DateTime.Now.Year - dateTimePicker1.Value.Year;
}

// When the DateTimePicker value has changed
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
    numericUpDown1.Maximum = DateTime.Now.Year - dateTimePicker1.Value.Year;
}
0 голосов
/ 13 марта 2020

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

private void DateTimePicker1_ValueChanged(Object sender, EventArgs e) {

   numericUpDown1.Maximum = (DateTime.Now.Year - dateTimePicker1.Value.Year);

}

Название вашего вопроса и основной текст не согласны. Один говорит, что вы хотите убедиться, что ввод nud больше, а другой говорит, что не больше. Мой лог c гарантирует, что вход в NUD не больше, но если вы хотите противоположного, установите минимум NUD вместо максимального

DTP имеет свойства MaxDate и MinDate, которые также могут быть полезны вам в предотвращение слишком ненормального выбора пользователя

...