用户提供"from"和"to"月份来生成报告(例如,从1个月回到13个月前;如果他们在2016年2月15日选择此选项,则返回值为1/1/2015和1/1/2016(。
我想允许用户从"从"或"到"组合框中选择最远或最近的月份。我只想使用最远的时间作为"从",用最接近的时间作为"到",以避免他们的混淆(他们可以做任何对他们来说很自然的事情(。
所以我从这段代码开始:
int fromMonths = Convert.ToInt32(comboBoxProduceUsageFrom.Text);
DateTime RptParamsNominalFromDate = ReportSchedulerConstsAndUtils.SubtractMonthsFrom(fromMonths, nextGenerateAndSendDate);
int toMonths = Convert.ToInt32(comboBoxProduceUsageTo.Text);
DateTime RptParamsNominalToDate = ReportSchedulerConstsAndUtils.SubtractMonthsFrom(toMonths, nextGenerateAndSendDate);
..然后我想将"开始"日期设置为最远的时间,将"到"设置为较近的时间。我首先尝试了这个:
DateTime RptParamsFromDate;
DateTime RptParamsToDate;
if (RptParamsNominalFromDate > RptParamsNominalToDate)
{
RptParamsFromDate = RptParamsNominalToDate;
RptParamsToDate = RptParamsNominalFromDate;
}
else if (RptParamsNominalToDate > RptParamsNominalFromDate)
{
RptParamsFromDate = RptParamsNominalFromDate;
RptParamsToDate = RptParamsNominalToDate;
}
。但失败了,">使用未赋值的局部变量'RptParamsFromDate'"(以及"RptParamsToDate"的相同错误(。
所以我尝试给日期时间一个值/非值,如下所示:
DateTime RptParamsFromDate = null;
DateTime RptParamsToDate = null;
。但这给了我,">无法将 null 转换为'System.DateTime',因为它是不可为空的值类型">
所以我再次动了手指,并尝试将日期时间清零:
DateTime? RptParamsFromDate = null;
DateTime? RptParamsToDate = null;
。但后来我得到,">'System.Nullable' 不包含 'ToLongDateString' 的定义,并且找不到接受类型为 'System.Nullable' 的第一个参数的扩展方法'ToLongDateString'(您是否缺少 using 指令或程序集引用?
这是由于以下代码:
RptParamsFromDate.ToLongDateString()
在此块中:
MessageBox.Show(string.Format(
"Using the current configuration, the Produce Usage report would next be sent on {0} and emailed to {1}; the report would cover data from {2} to {3}",
nextGenerateAndSendDate.ToLongDateString(),
emailRecipients,
RptParamsFromDate.ToLongDateString(),
RptParamsToDate.ToLongDateString()));
那么我该怎么做才能显示日期时间值,同时仍然安抚这只脾气暴躁的野兽呢?
更新
结合来自 SLaks 和 crashmstr 的信息,我最终得到了以下工作方法:
private void buttonTestProdUsageSettings_Click(object sender, EventArgs e)
{
// Show example of when the report will run, and using which parameters,
// using the current configuration
DateTime nextGenerateAndSendDate = GetNextProduceUsageGenerateAndSendDate();
string emailRecipients = string.Join(",", emailAddresses.ToArray());
int fromMonths = Convert.ToInt32(comboBoxProduceUsageFrom.Text);
DateTime RptParamsNominalFromDate = ReportSchedulerConstsAndUtils.SubtractMonthsFrom(fromMonths, nextGenerateAndSendDate);
int toMonths = Convert.ToInt32(comboBoxProduceUsageTo.Text);
DateTime RptParamsNominalToDate = ReportSchedulerConstsAndUtils.SubtractMonthsFrom(toMonths, nextGenerateAndSendDate);
if (RptParamsNominalFromDate.Equals(RptParamsNominalToDate))
{
MessageBox.Show("The "from" and "to" values must differ; please try again.");
return;
}
// Allow user to enter either the nearest or furthest value in either the "from" or the "to":
DateTime? RptParamsFromDate = null;
DateTime? RptParamsToDate = null;
if (RptParamsNominalFromDate > RptParamsNominalToDate)
{
RptParamsFromDate = RptParamsNominalToDate;
RptParamsToDate = RptParamsNominalFromDate;
}
else if (RptParamsNominalToDate > RptParamsNominalFromDate)
{
RptParamsFromDate = RptParamsNominalFromDate;
RptParamsToDate = RptParamsNominalToDate;
}
MessageBox.Show(string.Format(
"Using the current configuration, the Produce Usage report would next be sent on {0} and emailed to {1}; the report would cover data from {2} to {3}",
nextGenerateAndSendDate.ToLongDateString(),
emailRecipients,
RptParamsFromDate.HasValue ? RptParamsFromDate.Value.ToLongDateString() : "No "from" Date",
RptParamsToDate.HasValue ? RptParamsToDate.Value.ToLongDateString() : "No "to" Date"));
}
您正在尝试使用可为空类型的值。
为此,您需要访问其 .Value
属性,该属性返回常规DateTime
值。
请注意,如果它实际上是 null,这将引发异常。
为了补充 Slaks 的原始答案,您获得第一个答案的原因是您必须尝试在代码后面引用RptParamsFromDate
或其亲属。 问题是因为这个:
您已完成:
- 创建变量
- 事情是真的吗? 不?...好
- 还有别的事情是真的吗? 不? ...好
- 变量仍未设置为任何内容。 (因为
RptParamsNominalFromDate == RptParamsNominalToDate
( - (假设(您尝试访问该变量。
使用未赋值的局部变量'RptParamsFromDate'"(以及"RptParamsToDate"的相同错误
将其设置为DateTime?
会在某种程度上解决这个问题,但您需要首先研究逻辑问题。 请确保稍后在尝试使用它之前检查此值是否为 null。