我有一个日期时间选择器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()
答案 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错误。
答案 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的值更改后,文本框会立即更改其值。