winforms “01/01/0001 00:00:00”的csharp值无效如何处理?

eiee3dmh  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(217)
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 '之间。参数名称:值'
我应该检查什么,这样它就不会抛出异常?

x7rlezfr

x7rlezfr1#

DateTimePicker.Value必须大于DateTimePicker.MinimumDateTime,即'1753年1月1日'
如果您没有设置timetargetvalue,它将解析为'01/01/0001 00:00:00',正如您所看到的,这还为时过早。
因此,在将其赋值给DateTimePicker.Value之前,需要检查该值。
您可以这样做:

DateTime tempDateTime = Convert.ToDateTime(optionsfile.GetKey("timetargetvalue");
dateTimePicker1.Value = tempDateTime >= DateTimePicker.MinimumDateTime ? tempDateTime : DateTimePicker.MinimumDateTime;
tyu7yeag

tyu7yeag2#

当处理一个Struct时,比如DateTime,它没有任何值,我们需要考虑它不是一个class,不能被设置为空。它必须总是有一些值。(参见https://learn.microsoft.com/en-us/dotnet/api/system.datetime?view=net-7.0
这个例外以一种迂回的方式提到了可接受值的范围是在dateTimePicker1.MinDatedateTimePicker1.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类有两种方法,这两种方法都编译为相同的内容:

Nullable<DateTime> myNullableDate = null;
DateTime? anotherNullableDate = null;

由于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
例如(不是最优化的代码,但我认为以更详细的形式更容易理解)

private DateTime? LoadDateFromOptions(string key)
{
    var rawValue = optionsfile.GetKey(key);

    if (!string.IsNullOrEmpty(rawValue))
    {
        return null;
    }

    DateTime dateValue;
    bool isSuccess = DateTime.TryParse(rawValue, out dateValue);

    if (isSuccess)
    {
        return dateValue;
    }
    else 
    {
        return null;
    }
}

然后,您可以选择加载值,而不是使用该异常,类似于以下内容:

var timeTarget = LoadDateFromOptions("timetargetvalue");
if (timeTarget != null)
{
    dateTimePicker1.Value = timeTarget;
}

相关问题