如何使用过去 30 天的日期填充下拉列表

本文关键字:日期 填充 下拉列表 何使用 过去 | 更新日期: 2023-09-27 18:32:07

我正在尝试使用过去 30 个日期填充下拉列表,但收到错误:

mscorlib 中发生了类型为"System.OutOfMemoryException"的异常.dll但未在用户代码中处理

这是我填充下拉列表的函数:

public void FillDates(int NumDaysBack)
{
    for (DateTime d = DateTime.Now.AddDays(-NumDaysBack); d < DateTime.Now; d.AddDays(1))
    {
        ddMiscDateList.Items.Add(d.ToShortDateString());
    }
    ddMiscDateList.Items.Add("Other");
}

我在加载时调用此函数,并将 30 用于 NumDaysBack。 如何更有效地编写此内容以不收到此错误?

如何使用过去 30 天的日期填充下拉列表

DateTime.AddDays() 返回 DateTime 的新实例。它不会更改 d 变量。因为它,你有无限循环。你可以修复它

public void FillDates(int NumDaysBack)
{
    for (DateTime d = DateTime.Now.AddDays(-NumDaysBack); d < DateTime.Now; d = d.AddDays(1))
    {
        ddMiscDateList.Items.Add(d.ToShortDateString());
    }
    ddMiscDateList.Items.Add("Other");
}
public void FillDates(int NumDaysBack)
{
    for (DateTime d = DateTime.Now.AddDays(-NumDaysBack); d < DateTime.Now; d = d.AddDays(1))
    //----------------------------------------------------------------------^^^^-fixed here
    {
        ddMiscDateList.Items.Add(d.ToShortDateString());
    }
    ddMiscDateList.Items.Add("Other");
}

当你调用 d.AddDays(1) 时,它会返回 DateTime 的新实例(不更新 d)

调用d.AddDays(1),您将获得DateTime的新实例,即您没有对DateTime d对象应用任何更改。因此,您的循环永远不会终止,并且您最终会耗尽内存。

解决方案是改为编写d = d.AddDays(1)

从 MSDN 文档:

返回一个新的 DateTime,该时间将指定的天数添加到此实例的值中。

此外,如果您只对实际日期的算术(在您的例子中添加)感兴趣,那么您可能希望省略实际时间部分,而是使用:

DateTime.Now.Date

或简化:

DateTime.Today

您仍将拥有时间部分,但它将设置为

00:00:00

日期时间今日属性:

设置为当前日期的对象,时间组件设置为

00:00:00。

由于 Today 属性返回的当前日期不包含当前时间,因此适用于仅使用日期的应用程序。

相反,如果您只想使用一天中的时间,请使用 DateTime.TimeOfDay 返回一个没有当前日期的DateTime对象。

有时生成序列时,Enumerable.Range 可能是一个不错的选择。类似的东西。

    public void FillDates(int NumDaysBack)
    {
        ddMiscDateList.Items = Enumerable.Range(0, NumDaysBack).Select(x => DateTime.Now.AddDays(-NumDaysBack + x));
    }