获取上个月选中的复选框

时间:2010-08-12 10:01:49

标签: c# winforms date

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

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

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

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

例如,StartDate = 1st September 2010,Checked Boxes是4月,10月和12月。

结果应该是2010年9月1日至2011年4月1日之间的日子。

如果StartDate = 2010年11月1日,则结果将是2010年11月1日至2011年10月1日之间的天数。

我觉得我很挣扎,因为循环从jan到dec。如果它从开始月份开始我就没事了。

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

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

int num=0,currentyear=2010;
for(i=startmonth;i<endmonth;i++)
{
if(i=13)
{
i=1;
currentyear++
}
num+=datetime.daysinmonth(currentyear,i);
}

我认为它会对你有用

答案 2 :(得分:0)

  • 搜索所选月份 距离月份的startDate。所以基本上只是在前几个月才进行搜索。

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