Dev·2022年终活动火热开启,欢迎抢购

DevExpress控件使用交流,DevExpress中国社区Dev联系电话 联系电话:18100878085

WinForm应用实战开发指南 - 如何使用DevExpress日程控件XtraScheduler(一)

来源:   发布时间:2022-09-09   浏览:340次

在一些应用场景中,我们可能需要记录某一天,某个时段的日程安排,那么这个时候就需要引入了DevExpress的日程控件XtraScheduler了,这个控件功能非常强大,提供了很好的界面展现方式,以及很多的事件、属性给我们定制修改,能很好满足我们的日程计划安排的需求,本文全面分析并使用这个控件,希望把其中的经验与大家分享。

DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!

点击获取DevExpress v22.1正式版

日程控件的表现效果

整个日程控件,可以分为日视图、周视图、月视图等等,当然还有一些不常用的时间线、甘特图等,本例我们来关注控件的使用以及这几个视图的处理。先来看看他们的界面效果,如下所示。

日视图:

DevExpress日程控件使用效果图

在视图里面,默认可以打开响应的日程事件进行编辑的。

DevExpress日程控件使用效果图

周视图:

DevExpress日程控件使用效果图

月视图:

DevExpress日程控件使用效果图
日程控件XtraScheduler的使用

我们在上面展示了这个控件的几个视图的界面,一般情况下的控件使用还是很方便的,也就是直接拖拉SchedulerControl到WinForm界面即可,但是我们为了符合我们的使用需求,还是需要设置不少属性或者事件的处理的。

1. 几种视图的切换

由于控件,默认也是提供右键菜单,对几种控件视图进行切换的,如下菜单所示。

DevExpress日程控件使用效果图

但是我们也可以通过代码进行切换处理,具体代码很简单,该控件已经进行了很好的封装,直接使用即可。

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. 设置禁用编辑、新增等功能处理

该日程控件,可以通过控件属性,对日程记录的新增、编辑、删除等菜单功能进行屏蔽或者开放(默认是开放的)。

通过控件属性的方式,操作如下所示。

DevExpress日程控件使用效果图

当然我们也可以通过代码对这些属性进行设置,如下代码所示。

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. 日程控件的头部日期显示处理

默认的日程控件,其日视图、周视图的头部默认显示的是日期,如下所示。

DevExpress日程控件使用效果图

如果需要把它修改为我们想要的头部内容(如加上星期几),那么就需要对这个头部显示进行自定义的处理才可以了。

DevExpress日程控件使用效果图

有两种方式可以实现这个功能, 其一是引入一个自定义类,如下所示。

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("测试菜单功能");
}

本文转载自:博客园 - 伍华聪


DevExpress技术交流群6:600715373      欢迎一起进群讨论

更多DevExpress线上公开课、中文教程资讯请上中文网获取

DevExpress技术套包全新上线,冰点折扣有优惠
本站文章除注明转载外,均为本站原创或翻译
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果
转载请注明:文章转载自:DevExpress控件中文网 [https://www.devexpresscn.com/]
本文地址:https://www.devexpresscn.com/post/3277.html

相关产品: DevExpress Universal Subscription,


联系我们
  • 重庆总部
  • 18100878085
  • 18100878085
购买
  • sales@evget.com
合作
  • business@evget.com


在线
客服
微信
QQ 电话
023-68661681
返回
顶部