运行时的C#日期格式错误VS2005应用程序

时间:2016-03-30 06:15:24

标签: c# winforms

我有一个日期时间选择器dtOtMonth,我只需要显示月份和年份。所以我在表单加载时将其格式化如下。

dtOtMonth.Format = DateTimePickerFormat.Custom;
dtOtMonth.CustomFormat = "MM/yyyy";

但是当我尝试在运行时使用向上/向下箭头编辑日期时,它会给我以下错误。

年,月和日参数描述了无法表示的DateTime。

  

System.ArgumentOutOfRangeException未处理         消息="年,月和日参数描述不可表示的日期时间。"         源=" mscorlib程序"         堆栈跟踪:              在System.DateTime.DateToTicks(Int32年,Int32月,Int32日)              在System.Windows.Forms.DateTimePicker.SysTimeToDateTime(SYSTEMTIME s)              在System.Windows.Forms.DateTimePicker.WmDateTimeChange(消息& m)              在System.Windows.Forms.DateTimePicker.WmReflectCommand(Message& m)              在System.Windows.Forms.DateTimePicker.WndProc(消息& m)              在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)              在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)              在System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,   Int32 msg,IntPtr wparam,IntPtr lparam)              在System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWnd,   Int32 msg,IntPtr wParam,IntPtr lParam)              在System.Windows.Forms.Control.SendMessage(Int32 msg,IntPtr wparam,IntPtr lparam)              在System.Windows.Forms.Control.ReflectMessageInternal(IntPtr hWnd,   消息和; M)              在System.Windows.Forms.Control.WmNotify(消息& m)              在System.Windows.Forms.Control.WndProc(消息& m)              在System.Windows.Forms.GroupBox.WndProc(消息& m)              在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)              在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)              在System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,   Int32 msg,IntPtr wparam,IntPtr lparam)              在System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr)   wndProc,IntPtr hWnd,Int32 msg,IntPtr wParam,IntPtr lParam)              在System.Windows.Forms.NativeWindow.DefWndProc(消息& m)              在System.Windows.Forms.Control.DefWndProc(消息& m)              在System.Windows.Forms.Control.WmKeyChar(消息& m)              在System.Windows.Forms.Control.WndProc(消息& m)              在System.Windows.Forms.DateTimePicker.WndProc(消息& m)              在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)              在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)              在System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,   Int32 msg,IntPtr wparam,IntPtr lparam)              在System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)              在System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32)   dwComponentID,Int32原因,Int32 pvLoopData)              在System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32)   原因,ApplicationContext上下文)              在System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32)   原因,ApplicationContext上下文)              在System.Windows.Forms.Application.Run(Form mainForm)              at Attendence_Module.Program.Main()在E:\ HR System \ HRProject \ Attendence_Module \ Attendence_Module \ Program.cs:line   17              在System.AppDomain._nExecuteAssembly(Assembly assembly,String [] args)              在System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args)              在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()              在System.Threading.ThreadHelper.ThreadStart_Context(对象状态)              在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态)              在System.Threading.ThreadHelper.ThreadStart()

3 个答案:

答案 0 :(得分:1)

需要一天来增加一个值。好像它解析了一个日期,并且因为没有一天而无法做到。

答案 1 :(得分:1)

最后我发现了这个错误。

在日期时间选择器中,如果不是,我们会初始化默认日期,即使我们只采用月份和年份,也需要在默认日期内(在今天的情况下,这是我的日期)。

因此,当我更改月份时,所选日期在每个月保持相同。因此今天是2016年3月30日,当我尝试将月份减少1时,它是2月份,日期时间选择器尝试将日期初始化为30日2月,它会产生错误。

就我而言,就我使用月份和年份而言,我将日期分开。

我通过在表单加载事件中初始化月份的第1个月来解决这个问题,其中每个月都有第1天(一个)而不是第29个,第30个,第31个

dtOtMonth.Value = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
dtOtMonth.Format = DateTimePickerFormat.Custom;
dtAdvanceStartDate.CustomFormat = "MM/yyyy";

以下是一些非常有用的链接,我发现这是一个.NET错误。

https://connect.microsoft.com/VisualStudio/feedback/details/553375/system-argumentoutofrangeexception-year-month-and-day-parameters-describe-an-un

https://social.msdn.microsoft.com/Forums/windows/en-US/69b10b5b-a034-426e-a045-2bed8a1637a3/bug-in-datetimepicker-control?forum=winforms

答案 2 :(得分:1)

OP发现,只有月份发生变化时才会发生错误,可能会更改为不存在的日期(例如" 2月31日")。

有几种方法可以防止错误。一种方法是确保DateTimePicker始终使用该月的第一天。这是一个快速示例,可确保Day值的DateTimePicker属性始终设置为1.在此示例中,我使用只读文本框来显示输出:< / p>

public MyTestForm()
{
    InitializeComponent();

    SetDateTimePickerFirstOfMonth();
    UpdateTextbox();
}

private void SetDateTimePickerFirstOfMonth()
{
    DateTime current = dtOtMonth.Value;
    if (current.Day != 1)
    {
        DateTime newValue = new DateTime(current.Year, current.Month, 1);
        dtOtMonth.Value = newValue;
    }
}

private void UpdateTextbox()
{
    int year = dtOtMonth.Value.Year;
    int month = dtOtMonth.Value.Month;

    txtResult.Text = string.Format("Year is {0} and month is {1}", year, month);
}

private void dtOtMonth_ValueChanged(object sender, EventArgs e)
{
    SetDateTimePickerFirstOfMonth();
    UpdateTextbox();
}

使用此代码,我仍然可以使用箭头键更改DateTimePicker中的年份或月份,并确保DateTimePicker值始终设置为所选月份的第一个,即使选择特定日期。

这是演示应用程序的屏幕截图。 DateTimePicker的值更改后,文本框会立即更改其值。

Example Winform