ASP.NET日历始终在7x6网格中显示6周的日期.我的问题是目标月份的第一天不一定出现在第一行......在某些情况下,整个第一行显示上个月的日期.在其他情况下,整个最后一行显示下一行的日期.是否有可靠的方法来查询日历对象以确定特定月/年的42天范围?
例如,考虑2008年6月和2009年2月:
请注意,第一周仅包含上个月的日期http://img371.imageshack.us/img371/2290/datesmq5.png
我假设日历试图避免在网格的顶部或底部聚集所有"其他月份"日期,因此将第一个目标月份放在第二行.我正在寻找一种简单的方法来确定2008年6月的显示范围是5月25日 - 7月5日.
查看ASP.NET日历控件公开的公共成员,我不相信这些信息是您可以从日历控件获得的信息.
虽然不是很好,但你有一些选择作为"变通办法"......但它们会起作用.
您可以手动计算第一周的值
您可以处理"day render"事件来处理各个日期的绑定,并记录最小/最大值.
既不优雅,但AFAIK是唯一真正的选择
编辑
在评论中讨论后,另一个选项是我上面第二个选项的修改版本.基本上第一次调用Day Render时,获取接下来42天的数据块,然后您只需在列表中搜索正确的日值,以便在将来调用DayRender时显示,从而避免每天的数据库命中.这样做是另一个"非优雅"的解决方案,但它可以工作,并减少了DB上的一些负载,但在应用程序方面引入了一些开销.
在此处定义结构良好的页面级别属性以在绑定事件期间保存项目非常重要,但要确保如果一个月更改等,则表明未正确加载等.
我写了几个方法来帮助解决这个问题.只需传入Calendar.VisibleDate:
public static DateTime GetFirstDateOfMonth(DateTime date) { return new DateTime(date.Year, date.Month, 1); } public static DateTime GetFirstDisplayedDate(DateTime date) { date = GetFirstDateOfMonth(date); return date.DayOfWeek == DayOfWeek.Sunday ? date.AddDays(-7) : date.AddDays((int)date.DayOfWeek * -1); } public static ListGetDisplayedDates(DateTime date) { date = GetFirstDisplayedDate(date); List dates = new List (); for (int i = 0; i < 42; i++) { dates.Add(date.AddDays(i)); } return dates; }