如何获取指定日期范围外的日期并在AspxDateEdit中禁用?
解决方案
方法一:使用AspxDateEdit的EnabledDateRanges(推荐)
DevExpress的AspxDateEdit控件自带EnabledDateRanges属性,直接添加允许的日期区间后,控件会自动禁用所有区间外的日期,无需手动生成每个禁用日期,效率更高。
实现代码
先定义方法获取所有允许的日期区间:
Private Function GetEnabledDateRanges() As List(Of DateRange) Dim enabledRanges As New List(Of DateRange)() ' 添加示例中的三组允许区间 enabledRanges.Add(New DateRange(clsCommon.ToDate("2023-03-01"), clsCommon.ToDate("2023-03-03"))) enabledRanges.Add(New DateRange(clsCommon.ToDate("2023-03-12"), clsCommon.ToDate("2023-03-20"))) enabledRanges.Add(New DateRange(clsCommon.ToDate("2023-04-10"), clsCommon.ToDate("2023-05-15"))) ' 如果区间是从页面控件读取(比如多组隐藏域),可循环添加 ' 示例:enabledRanges.Add(New DateRange(clsCommon.ToDate(lblHiddenRange1From.Text), clsCommon.ToDate(lblHiddenRange1To.Text))) Return enabledRanges End Function
然后在页面加载时赋值:
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load If Not IsPostBack Then datepickerSearchApprovalFrom.EnabledDateRanges.Clear() datepickerSearchApprovalFrom.EnabledDateRanges.AddRange(GetEnabledDateRanges()) End If End Sub
方法二:手动生成禁用日期(适合特殊场景)
如果不能使用EnabledDateRanges,可以手动计算禁用日期:
- 确定控件的有效日期范围(比如控件的
MinDate和MaxDate) - 遍历范围内所有日期,判断是否不在任何允许区间内
- 将符合条件的日期加入
DisabledDates
实现代码
先定义方法判断日期是否在允许区间内:
Private Function IsDateEnabled(targetDate As Date) As Boolean Dim allowedRanges As New List(Of Tuple(Of Date, Date))() allowedRanges.Add(Tuple.Create(clsCommon.ToDate("2023-03-01"), clsCommon.ToDate("2023-03-03"))) allowedRanges.Add(Tuple.Create(clsCommon.ToDate("2023-03-12"), clsCommon.ToDate("2023-03-20"))) allowedRanges.Add(Tuple.Create(clsCommon.ToDate("2023-04-10"), clsCommon.ToDate("2023-05-15"))) ' 检查目标日期是否在任意允许区间内 For Each range In allowedRanges If targetDate >= range.Item1 AndAlso targetDate <= range.Item2 Then Return True End If Next Return False End Function
再生成禁用日期并赋值:
Private Function GetDisabledDates() As IEnumerable(Of Date) Dim disabledDates As New List(Of Date)() ' 用控件的MinDate和MaxDate作为遍历范围,也可自定义 Dim startDate As Date = datepickerSearchApprovalFrom.MinDate Dim endDate As Date = datepickerSearchApprovalFrom.MaxDate Dim currentDate As Date = startDate While currentDate <= endDate If Not IsDateEnabled(currentDate) Then disabledDates.Add(currentDate) End If currentDate = currentDate.AddDays(1) End While Return disabledDates End Function Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load If Not IsPostBack Then datepickerSearchApprovalFrom.DisabledDates.Clear() datepickerSearchApprovalFrom.DisabledDates.AddRange(GetDisabledDates()) End If End Sub
你当前代码的问题
你的getDateRange方法生成的是允许的日期,但你把它加到了DisabledDates集合中,相当于禁用了本该允许的日期,完全搞反了逻辑。如果要沿用原有思路,应该把这些日期加到EnabledDateRanges而非DisabledDates。
内容的提问来源于stack exchange,提问作者CStudent
相关产品推荐
相关产品推荐

