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

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

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

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

年,月和日参数描述不可表示的日期时间。

System.ArgumentOutOfRangeException未处理消息=“年,月和日参数描述不可表示的DateTime”。 Source =“mscorlib”StackTrace:System.Windows.Forms.DateTimePicker.SysTimeToDateTime(SYSTEMTIME s)在System.Windows.Forms.DateTimePicker.WmDateTimeChange(Message&m)System.DateTime.DateToTicks(Int32年,Int32月,Int32天) )在System.Windows.Forms.DateTimePicker.WmReflectCommand(消息&m)在System.Windows.Forms.DateTimePicker.WndProc(消息&m)在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(消息&m)在System.Windows。在System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWnd,Int32 msg)System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)上的Forms.Control.ControlNativeWindow.WndProc(Message&m) ,IntPtr wParam,IntPtr lParam)System.Windows.Forms.Control.SendMessage(Int32 msg,IntPtr wparam,IntPtr lparam)at System.Windows.Forms.Control.ReflectMessageInternal(IntPtr hWnd,Message&m)at System.Windows.Forms .Control.WmNotify(Message&m)at System.Windows.Forms.Control.WndProc(Message&m )System.Windows.Forms.GroupBox.WndProc(Message&m)at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m)at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&m)at System。 System.Windows.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc,IntPtr hWnd,Int32 msg,IntPtr wParam,IntPtr lParam)上的Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam) 。在System.Windows.Forms.Control.DefWndProc(消息&m)在System.Windows.Forms.Control.WmKeyChar(消息&m)在System.Windows.Forms.Control.WndProc(消息& (System.Windows.Forms.DateTimePicker.WndProc(Message&m)at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m)at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&m)at System .Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)在System.Windows.Forms。 在System.Windows.Forms.Application.ThreadContext处的System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID,Int32 reason,Int32 pvLoopData)中的UnsafeNativeMethods.DispatchMessageW(MSG&msg)。在System.Windows.Forms.Application.Run(Form mainForm)at Attendence_Module.Program.Main()中的System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason,ApplicationContext上下文)中的RunMessageLoopInner(Int32 reason,ApplicationContext context) E: HR System HRProject Attendence_Module Attendence_Module Program.cs: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 executionCon 文本,ContextCallback回调,对象状态)在System.Threading.ThreadHelper.ThreadStart()


正如OP发现的,仅当月份发生变化时发生错误,可以将其更改为不存在的日期(例如“2月31日”)。

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

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的值发生更改,文本框就会更改其值。

示例Winform


它需要一天的时间来增加价值。 看起来像是在解析一个日期,因为没有一天不能这样做。


最后我发现了这个错误。

在日期时间选择器中,如果没有,我们初始化默认日期,即使我们只采取月份和年份,在它内部采用默认日期(这里是今天的日期)。

因此,当我更改月份时,选定的日期每个月保持不变。因此,今天是2016年3月30日,当我尝试将月份减一时是2月,日期时间选择器尝试将日期初始化为30日至2月,生成错误。

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

我通过初始化表单加载事件的每月第一天的日期来解决这个问题,其中每个月的第一天(第一天)不像第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

链接地址: http://www.djcxy.com/p/93509.html

上一篇: C# Date format error in run time VS2005 Application

下一篇: c#