if (File.Exists(settingsFile))
{
string[] lines = File.ReadAllLines(settingsFile);
if (lines.Length > 0)
{
trackBarHours.Value = Convert.ToInt32(optionsfile.GetKey("trackbarhours"));
trackBarMinutes.Value = Convert.ToInt32(optionsfile.GetKey("trackbarminutes"));
trackBarSeconds.Value = Convert.ToInt32(optionsfile.GetKey("trackbarseconds"));
savedMilliseconds = Convert.ToInt32(optionsfile.GetKey("milliseconds"));
dateTimePicker1.Value = Convert.ToDateTime(optionsfile.GetKey("timetargetvalue"));
richTextBox1.Text = optionsfile.GetKey("result");
}
}
因为键“timetargetvalue”还没有在settingsFile中创建,因为我还没有第一次保存它,“timetargetvalue”键的值是'01/01/0001 00:00:00'
如果还没有关键字hwo,我可以处理日期时间异常吗?
dateTimePicker 1是一个日期时间选取器控件。
异常位于以下行:
dateTimePicker1.Value = Convert.ToDateTime(optionsfile.GetKey("timetargetvalue"));
系统参数超出范围异常:''01/01/0001 00:00:00'的值对' Value '无效。'Value'应该介于'MinDate'和' MaxDate '之间。参数名称:值'
我应该检查什么,这样它就不会抛出异常?
2条答案
按热度按时间x7rlezfr1#
DateTimePicker.Value
必须大于DateTimePicker.MinimumDateTime
,即'1753年1月1日'如果您没有设置
timetargetvalue
,它将解析为'01/01/0001 00:00:00',正如您所看到的,这还为时过早。因此,在将其赋值给
DateTimePicker.Value
之前,需要检查该值。您可以这样做:
tyu7yeag2#
当处理一个
Struct
时,比如DateTime
,它没有任何值,我们需要考虑它不是一个class
,不能被设置为空。它必须总是有一些值。(参见https://learn.microsoft.com/en-us/dotnet/api/system.datetime?view=net-7.0)这个例外以一种迂回的方式提到了可接受值的范围是在
dateTimePicker1.MinDate
和dateTimePicker1.MaxDate
之间,所以一个选项是检查你的值是否在这个范围内。但是这不太可能是最好的选项。(参见https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.datetimepicker.mindate?view=windowsdesktop-6.0)我非常肯定
DateTime
的默认值等于DateTime.Min
的默认值,但如果你真的想检查该值是否为默认值,那么我建议将其与default(DateTime)
进行比较会更好。这基本上涵盖了
DateTime
和默认值的使用,当null不是一个选项时。这带来了一个可能更理想的选项。封装。我们可以将
DateTime
结构体封装到Nullable
类中。封装类可以为空,并且可以通过一个名为Value
的属性来表示封装的值。(参见https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/nullable-value-types)声明
Nullable
类有两种方法,这两种方法都编译为相同的内容:由于
DateTime
被封装在Nullable
对象中,我们可以开始使用空引用检查。我们也可以在Nullable
上调用一个名为HasValue
的方法,该方法返回一个bool
(如果它有值,则为True)。编辑:我注意到在尝试解析
DateTime
之前没有做任何检查,然后直接将其设置为可以接受空值的DateTimePicker.Value
。(尽管设置空值不会清除以前设置的值)。因此,您可能希望更好地处理该场景,然后使用
DateTime.TryParse()
来代替。(请参见https://learn.microsoft.com/en-us/dotnet/api/system.datetime.tryparse?view=net-7.0)例如(不是最优化的代码,但我认为以更详细的形式更容易理解)
然后,您可以选择加载值,而不是使用该异常,类似于以下内容: