如何在C#的DataGridView中显示未来一年的所有周一?
解决DataGridView显示未来一年所有周一的问题
嘿,刚学C#就能动手写功能超棒!你的代码现在重复显示同一个周一,是因为每次循环都在重新计算当前周的周一,没有往后推进时间,而且固定50次循环也不够精准(一年其实约52周)。我帮你调整一下代码,完美实现需求:
问题分析
你的现有代码里,这行是核心问题:
string monday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Monday).ToString("dd-MM-yyyy");
每次循环都会重新计算「今天所在周的周一」,没有累加周数,所以50次循环都是同一个日期。另外格式用了dd-MM-yyyy,和你要的dd/MM/yyyy不符,固定50次也不如按日期范围生成准确。
修正后的代码
// 先清空DataGridView现有行,避免重复添加数据 metroDataGrid1.Rows.Clear(); // 获取当前周的周一:如果今天是周一就取今天,否则取本周一 DateTime currentMonday = DateTime.Today; if (currentMonday.DayOfWeek != DayOfWeek.Monday) { currentMonday = currentMonday.AddDays(-(int)currentMonday.DayOfWeek + (int)DayOfWeek.Monday); } // 计算一年后的日期,作为循环终止条件 DateTime oneYearLater = DateTime.Today.AddYears(1); // 循环生成每个周一,直到日期超过一年后 while (currentMonday <= oneYearLater) { // 按dd/MM/yyyy格式转换日期为字符串 string mondayStr = currentMonday.ToString("dd/MM/yyyy"); metroDataGrid1.Rows.Add(mondayStr); // 往后推7天,得到下一个周一 currentMonday = currentMonday.AddDays(7); } // 设置所有行的高度,排除最后一行的空行(如果开启了允许新增行) foreach (DataGridViewRow row in metroDataGrid1.Rows) { if (!row.IsNewRow) { row.Height = 60; } }
代码细节解释
- 清空现有行:避免重复运行代码时,DataGridView里堆积重复数据
- 精准获取起始周一:判断今天是否为周一,确保起始日期符合「当前周周一」的要求
- 按日期范围循环:用「当前周一 ≤ 一年后日期」作为循环条件,比固定50次更贴合“未来一年”的需求
- 每周递进一次:每次循环后用
AddDays(7)跳转到下一个周一,避免重复日期 - 格式修正:用
dd/MM/yyyy生成你需要的日期字符串格式 - 跳过空行:如果你的DataGridView开启了允许用户新增行的功能,设置行高时自动跳过最后一行的空白行
这样就能完美显示从当前周一开始,未来一年的所有周一啦~
内容的提问来源于stack exchange,提问作者WilliamArm
相关产品推荐
相关产品推荐

