You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为DevExpress ASPxDateEdit添加JS快捷键遇跨年异常求解决

问题分析与解决方案

核心问题原因

你的代码中所有日期修改操作都错误地基于当前系统时间(new Date())而非控件中的目标日期(currdate),导致跨年时日期被重置到当前年份。此外还存在以下问题:

  • Y键逻辑未处理控件已有日期的情况,且直接加365天会忽略闰年问题
  • 事件阻止方法的参数错误,未传入正确的e.htmlEvent
  • 日期修改的API使用方式不符合JavaScript Date对象的正确用法

修正后的完整代码

function DateHotKey(s, e) {
    var c = e.htmlEvent.code;
    var k = e.htmlEvent.key;

    if (isNaN(parseFloat(k))) {
        switch (c) {
            case "KeyT":
                // 设置今日日期
                var today = new Date();
                s.SetDate(today);
                ASPxClientUtils.PreventEventAndBubble(e.htmlEvent);
                break;

            case "KeyM":
                // 空值时设为今日+1个月,否则当前日期+1个月
                var currdate = s.GetDate();
                if (currdate === null) {
                    currdate = new Date();
                }
                var newDate = new Date(currdate);
                newDate.setMonth(newDate.getMonth() + 1);
                s.SetDate(newDate);
                ASPxClientUtils.PreventEventAndBubble(e.htmlEvent);
                break;

            case "KeyQ":
                // 空值时设为今日+3个月,否则当前日期+3个月
                var currdate = s.GetDate();
                if (currdate === null) {
                    currdate = new Date();
                }
                var newDate = new Date(currdate);
                newDate.setMonth(newDate.getMonth() + 3);
                s.SetDate(newDate);
                ASPxClientUtils.PreventEventAndBubble(e.htmlEvent);
                break;

            case "KeyY":
                // 空值时设为今日+1年,否则当前日期+1年
                var currdate = s.GetDate();
                if (currdate === null) {
                    currdate = new Date();
                }
                var newDate = new Date(currdate);
                newDate.setFullYear(newDate.getFullYear() + 1);
                s.SetDate(newDate);
                ASPxClientUtils.PreventEventAndBubble(e.htmlEvent);
                break;

            default:
                switch (k) {
                    case "+":
                        // 空值时设为今日,否则当前日期+1天
                        var currdate = s.GetDate();
                        if (currdate === null) {
                            currdate = new Date();
                        }
                        var newDate = new Date(currdate);
                        newDate.setDate(newDate.getDate() + 1);
                        s.SetDate(newDate);
                        ASPxClientUtils.PreventEventAndBubble(e.htmlEvent);
                        break;

                    case "-":
                        // 空值时设为今日,否则当前日期-1天
                        var currdate = s.GetDate();
                        if (currdate === null) {
                            currdate = new Date();
                        }
                        var newDate = new Date(currdate);
                        newDate.setDate(newDate.getDate() - 1);
                        s.SetDate(newDate);
                        ASPxClientUtils.PreventEventAndBubble(e.htmlEvent);
                        break;
                }
                break;
        }
    }
}

关键修正点说明

  1. 基于目标日期创建副本:
    所有日期修改操作都先通过new Date(currdate)创建目标日期的副本,再对副本进行月份/年份/天数调整,确保修改基于控件中的日期而非当前系统时间。

  2. 修复Y键逻辑:

    • 新增对控件已有日期的判断,符合需求中“已有日期则增加1年”的规则
    • 使用setFullYear方法替代加365天,自动处理闰年问题
  3. 修正事件阻止参数:
    将ASPxClientUtils.PreventEventAndBubble(htmlEvent)改为ASPxClientUtils.PreventEventAndBubble(e.htmlEvent),确保正确阻止事件冒泡和默认行为

  4. 统一使用SetDate方法:
    对DevExpress ASPxDateEdit控件统一使用SetDate方法设置日期,与控件API保持一致

内容的提问来源于stack exchange,提问作者Gary Jorgenson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:54:54