【问题标题】:Get last Month of selected check boxes获取选定复选框的上个月
【发布时间】:2010-08-12 10:01:49
【问题描述】:

我有一个 for 循环来检查是否选中了某些复选框

foreach (CheckBox chk in this.Controls.OfType<CheckBox>())
{
    if (chk.Checked)
    {
        //Some code here
    }
}

有 12 个复选框,每个月 1 个。

我想要的是计算变量 StartDate 和上个月之间的天数。很难解释对不起。

例如,StartDate = 1st September 2010,选中的框是四月、十月和十二月。

结果应该是 01/09/2010 和 01/04/2011 之间的天数。

如果 StartDate = 2010 年 11 月 1 日,则结果将是 01/11/2010 和 01/10/2011 之间的日期。

我觉得我在挣扎,因为循环从一月到十二月。如果它是从 startdate 月份开始的,我会没事的。

如果我需要解释更多,请提出一些问题。

【问题讨论】:

  • 当您选择超过 2 个月时,我不明白您在 2 个日期之间是如何做到的??
  • 如果我理解正确:从开始日期开始,我会记下日历,往前看几个月——可能到下一年——当我到了一个名字被打勾的月份时,我就会停下来在复选框列表中。然后我计算开始日期和那个月之间的天数。问题:如果这是真的,我理解你的第一个例子,但不是第二个。我希望第二个示例计算从 2010 年 11 月 1 日到 2011 年 4 月 1 日的天数(因为也检查了 4 月)。请澄清,因为也许我没有完全理解算法。
  • 对不起,我无法解释清楚。在第二个示例中,我应该从 startdate 到 october,因为 oct 在 april 之后但在 nov(startdate) 之前。希望这更清楚。
  • @w69rdy - 最近一个月我唯一感兴趣的月份。其他的在一些不同的代码中使用,这是有效的。
  • ................(评论已删除)

标签: c# winforms date


【解决方案1】:

假设您对 DateTime 逻辑感兴趣,应该这样做:

private static TimeSpan GetLatestSpan(IEnumerable<int> monthNumbers, DateTime startDate)
{
  var candidateDates = monthNumbers
                    .Select(month => GetNearestDateInDifferentMonthWithSameDay(startDate, month));

  return candidateDates.Max() - startDate;
}

private static DateTime GetNearestDateInDifferentMonthWithSameDay(DateTime startDate, int month)
{
 return new DateTime(month > startDate.Month ? startDate.Year : startDate.Year + 1, month, startDate.Day);
}

用你的例子,

var checkedMonthNumbers = new List<int>();

foreach (CheckBox chk in this.Controls.OfType<CheckBox>())
       {
         if (chk.Checked)
                {
                    checkedMonthNumbers.Add(GetMonthNumberFromCheckBox(chk));
                }
       }

MessageBox.Show("Required timespan is " + GetLatestSpan(checkedMonthNumbers, StartDate));

编辑:

请注意,我可能会将循环重写为:

var checkedMonthNumbers = Controls.OfType<CheckBox>()
                                  .Where(chk => ck.Checked)
                                  .Select(chk => GetMonthNumberFromCheckBox(chk));

【讨论】:

    【解决方案2】:
    int num=0,currentyear=2010;
    for(i=startmonth;i<endmonth;i++)
    {
    if(i=13)
    {
    i=1;
    currentyear++
    }
    num+=datetime.daysinmonth(currentyear,i);
    }
    

    我认为它对你有用

    【讨论】:

    • 我知道如何计算月份之间的差异。问题正在解决哪个是月底。
    【解决方案3】:
    • 在选定月份中搜索 离开始日期最近的上一个月。所以基本上只搜索前几个月。

    • 如果没有,请选择上个月 从列表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-08
      • 2018-02-19
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 2021-10-07
      • 2020-02-03
      • 1970-01-01
      相关资源
      最近更新 更多