如何检查NumericUpDown的值是否大于DateTimePicker的Year值?

问题描述 投票:-1回答:4

我目前有一个NumericUpDown,用户可以在其中输入他们在网站上的年限。

然后我有一个用于DOB字段的DateTimePicker:我想确保NumericUpDown中指定的值不大于DateTimePicker中指定的日期和当前日期之间的年差。

例如,用户在DateTimePicker中输入10th of january 2010:然后他们不能在NumericUpDown中输入大于10的数字(或者可以输入,但是会显示错误消息)。

我将如何去做?

c# winforms datetimepicker numericupdown
4个回答
0
投票

使用此控件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

当然,现在的问题是,如何防止错误的设置,在何处连接更改事件等,所以agressiveöy。

我个人更喜欢通过INotifyDataErrorInfo和类似接口进行“被动”错误报告。显示一条消息,请勿尝试强制使用特定值。


0
投票

您可以使用属性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
投票

如何挂钩日期时间选择器valuechanged事件并设置NUD的最大值?

private void DateTimePicker1_ValueChanged(Object sender, EventArgs e) {

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

}

您的问题的标题与正文不同。一个说您要确保nud输入更大,另一个说not大。我的逻辑确保NUD中的输入不大,但是如果您要相反,请设置NUD最小值而不是最大值

DTP具有MaxDate和MinDate属性,这对于防止用户选择太过疯狂也很有用


0
投票

好,处理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;
}

然后我为DOB字段提供了一个DateTimePicker:我想确保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...");                
    }                
}
© www.soinside.com 2019 - 2024. All rights reserved.