WinForm应用实战开发 - 如何开发一个日程视图?(Part 1) 在一些应用场景中我们可能需要记录某一天某个时段的日程安排那么这个时候就需要引入了DevExpress的日程控件XtraScheduler了这个控件功能非常强大提供了很好的界面展现方式以及很多的事件、属性给我们定制修改能很好满足我们的日程计划安排的需求本文全面分析并使用这个控件希望把其中的经验与大家分享。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序无论是Office风格的界面还是分析处理大批量的业务数据它都能轻松胜任DevExpress新旧版本帮助文档下载 可进QQ qun获取169725316日程控件的表现效果整个日程控件可以分为日视图、周视图、月视图等等当然还有一些不常用的时间线、甘特图等本例我们来关注控件的使用以及这几个视图的处理。先来看看他们的界面效果如下所示。日视图在视图里面默认可以打开响应的日程事件进行编辑的。周视图月视图日程控件XtraScheduler的使用我们在上面展示了这个控件的几个视图的界面一般情况下的控件使用还是很方便的也就是直接拖拉SchedulerControl到WinForm界面即可但是我们为了符合我们的使用需求还是需要设置不少属性或者事件的处理的。1. 几种视图的切换由于控件默认也是提供右键菜单对几种控件视图进行切换的如下菜单所示。但是我们也可以通过代码进行切换处理具体代码很简单该控件已经进行了很好的封装直接使用即可。private void btnDayView_Click(object sender, EventArgs e) { //需要为日视图类型 this.schedulerControl1.ActiveViewType SchedulerViewType.Day; } private void btnWeekView_Click(object sender, EventArgs e) { //需要为周视图类型 this.schedulerControl1.ActiveViewType SchedulerViewType.FullWeek; } private void btnMonthView_Click(object sender, EventArgs e) { //需要为周视图类型 this.schedulerControl1.ActiveViewType SchedulerViewType.Month; }2. 设置禁用编辑、新增等功能处理该日程控件可以通过控件属性对日程记录的新增、编辑、删除等菜单功能进行屏蔽或者开放默认是开放的。通过控件属性的方式操作如下所示。当然我们也可以通过代码对这些属性进行设置如下代码所示。SchedulerControl control this.schedulerControl1; //禁用日程增加、删除、修改、拖拉等操作 control.OptionsCustomization.AllowAppointmentCreate DevExpress.XtraScheduler.UsedAppointmentType.None; control.OptionsCustomization.AllowAppointmentDelete DevExpress.XtraScheduler.UsedAppointmentType.None; control.OptionsCustomization.AllowAppointmentEdit DevExpress.XtraScheduler.UsedAppointmentType.None; control.OptionsCustomization.AllowAppointmentDrag DevExpress.XtraScheduler.UsedAppointmentType.None; control.OptionsCustomization.AllowAppointmentMultiSelect false; control.OptionsRangeControl.AllowChangeActiveView false; control.Views.MonthView.CompressWeekend false; control.OptionsBehavior.ShowRemindersForm false;3. 日程控件的头部日期显示处理默认的日程控件其日视图、周视图的头部默认显示的是日期如下所示。如果需要把它修改为我们想要的头部内容如加上星期几那么就需要对这个头部显示进行自定义的处理才可以了。有两种方式可以实现这个功能 其一是引入一个自定义类如下所示。public class CustomHeaderCaptionService : HeaderCaptionServiceWrapper { public CustomHeaderCaptionService(IHeaderCaptionService service) : base(service) { } public override string GetDayColumnHeaderCaption(DayHeader header) { DateTime date header.Interval.Start.Date; return string.Format({0:M}({1}), date, date.ToString(dddd,new System.Globalization.CultureInfo(zh-cn))); } }然后在控件初始化后添加对这个处理实现即可。//重载头部显示 IHeaderCaptionService headerCaptionService (IHeaderCaptionService)control.GetService(typeof(IHeaderCaptionService)); if (headerCaptionService ! null) { CustomHeaderCaptionService customHeaderCaptionService new CustomHeaderCaptionService(headerCaptionService); control.RemoveService(typeof(IHeaderCaptionService)); control.AddService(typeof(IHeaderCaptionService), customHeaderCaptionService); }或者也可以重载CustomDrawDayHeader事件进行修改处理如下所示。推荐采用上面一种private void schedulerControl1_CustomDrawDayHeader(object sender, CustomDrawObjectEventArgs e) { //重绘Header部分,设置日程头部显示格式 SchedulerControl control this.schedulerControl1; SchedulerViewType svt control.ActiveViewType; if (svt SchedulerViewType.Day || svt SchedulerViewType.FullWeek || svt SchedulerViewType.Week || svt SchedulerViewType.WorkWeek) { DayHeader header e.ObjectInfo as DayHeader; DateTime date header.Interval.Start; header.Caption string.Format({0}({1}), date.ToString(MM月d日), date.ToString(dddd, new System.Globalization.CultureInfo(zh-cn))); } }4. 自定义菜单的处理在日程控件XtraScheduler的使用中我们也可以获取到控件的菜单对象并对它进行修改、删除或者新增自己的菜单事件也是可以的我们实现事件PopupMenuShowing即可这个事件在菜单显示前进行处理如下面所示代码。private void schedulerControl1_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e) { //对日程的右键菜单进行修改 SchedulerControl control this.schedulerControl1; if (e.Menu.Id DevExpress.XtraScheduler.SchedulerMenuItemId.DefaultMenu) { //隐藏【视图更改为】菜单 SchedulerPopupMenu itemChangeViewTo e.Menu.GetPopupMenuById(SchedulerMenuItemId.SwitchViewMenu); itemChangeViewTo.Visible false; //删除【新建所有当天事件】菜单 e.Menu.RemoveMenuItem(SchedulerMenuItemId.NewAllDayEvent); //设置【新建定期日程安排】菜单为不可用 e.Menu.DisableMenuItem(SchedulerMenuItemId.NewRecurringAppointment); //改名【新建日程安排】菜单为自定义名称 SchedulerMenuItem item e.Menu.GetMenuItemById(SchedulerMenuItemId.NewAppointment); if (item ! null) item.Caption 新建一个计划; //创建一个新项用内置的命令 ISchedulerCommandFactoryService service (ISchedulerCommandFactoryService)control.GetService(typeof(ISchedulerCommandFactoryService)); SchedulerCommand cmd service.CreateCommand(SchedulerCommandId.PrintPreview);//打印预览 SchedulerMenuItemCommandWinAdapter menuItemCommandAdapter new SchedulerMenuItemCommandWinAdapter(cmd); DXMenuItem menuItem (DXMenuItem)menuItemCommandAdapter.CreateMenuItem(DXMenuItemPriority.Normal); menuItem.BeginGroup true; e.Menu.Items.Add(menuItem); //创建一个新的自定义事件菜单 DXMenuItem menuTest new SchedulerMenuItem(测试菜单); menuTest.Click menuItem2_Click; menuTest.BeginGroup true; e.Menu.Items.Add(menuTest); } } void menuItem2_Click(object sender, EventArgs e) { MessageDxUtil.ShowTips(测试菜单功能); }本文转载自博客园 - 伍华聪

相关新闻

最新新闻

流水线组件的最小职责划分

流水线组件的最小职责划分

流水线组件的最小职责划分明确问题边界 “最小可运行架构与组件职责拆分”放在CI/CD 流水线与云原生自动化运维中讨论,重点不是堆砌工具名,而是让代码仓库、构建任务、制品库、部署控制器在明确约束下可验证地协同工作。本文只描述可以落地的检查和操作&…

2026/8/28 14:00:09
漏洞分析环境升级的核查

漏洞分析环境升级的核查

漏洞分析环境升级的核查讨论二进制漏洞挖掘:Fuzzing 实战与崩溃复现链路分析时,面向新版本的升级风险评估常被写成一串工具或原则,读完仍不知道该先检查什么。更实用的起点是把当前任务限定下来:样本、语料和构建产物应有明确来源…

2026/8/28 14:00:09
用Python模拟一场注定崩溃的经济系统:从信贷扩张到债务通缩

用Python模拟一场注定崩溃的经济系统:从信贷扩张到债务通缩

如果我告诉你,有一个不到 300 行的 Python 脚本,能让一个虚拟经济体从繁荣、过热、滞涨走到全面崩盘,你信不信?更“反直觉”的是,这个崩溃并不是程序 bug,而是设计者故意埋进去的核心规则。 这篇文章就来拆…

2026/8/28 14:00:09
逆向协作的责任边界

逆向协作的责任边界

逆向协作的责任边界AI 增强型 逆向工程:IDA / Ghidra 静态分析与动态调试实战:Agent 工作流、工具调用与任务拆解的实践里,跨团队协作中的 API 与责任边界应服务于一个具体决定:继续、限制、回退,或补充证据。把它写成…

2026/8/28 14:00:09
医疗AI新方向:实时视频问诊如何逼近专家级水平

医疗AI新方向:实时视频问诊如何逼近专家级水平

医疗 AI 的下一站:实时视频问诊如何逼近"专家级"水平? 如果说过去五年医疗 AI 的关键词是"读图",那未来五年的关键词可能是"看视频"。 你大概已经见过不少医疗 AI 产品:输入一张 CT 影像&#xf…

2026/8/28 14:00:09
深度学习遥感影像分割:从UNet模型到工程化系统全流程解析

深度学习遥感影像分割:从UNet模型到工程化系统全流程解析

简介:语义分割是计算机视觉的核心任务之一,旨在对图像中的每个像素进行分类,实现像素级的场景理解。其原理基于编码器-解码器架构,通过卷积神经网络提取多尺度特征并重建高分辨率分割图。这项技术的价值在于能够自动化、精细化地解…

2026/8/28 13:55:09