如果你使用的DevExpress套件、Vs的版本较低(像我的是Vs2010+DevExpress13.1),可能会出现:在你为GridView的日期字段绑定RepositoryItemDateEdit型编辑器,当这个日期字段只需要精确到月份,此时,你当然希望RepositoryItemDateEdit编辑器在用户使用时,弹出PopupMenu时,显示的月份的选择界面,如:
但是,当我们设置好如下代码:
RepositoryItemDateEdit nRide = new RepositoryItemDateEdit();
nRide.VistaCalendarViewStyle = DevExpress.XtraEditors.VistaCalendarViewStyle.YearView;
string sYm= "yyyy年MM月";
nRide.DisplayFormat.FormatString = sYm;
nRide.EditMask = sYm;
gridView1.Columns[0].ColumnEdit = nRide;
可能会显示出这个样子:
也就是它还是精确到日,而不是月份。实际上,DevExpress官方已经注意到,这是个bug,那么,如果我们不想升级DevExpress套件的版本,如何解决这个问题呢?
实际上,我们可以继承RepositoryItemDateEdit,并做一部分的改写,就可以做到,定义两个类,一个继承于RepositoryItemDateEdit,我们称之为gRide,代码如下:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualBasic;
using System.ComponentModel;
using DevExpress.XtraEditors.Drawing;
using DevExpress.XtraEditors.Registrator;
using DevExpress.XtraEditors.Repository;
using DevExpress.XtraEditors.ViewInfo;
namespace CustomEditor
{
[System.ComponentModel.DesignerCategory("")]
[UserRepositoryItem("Register")]
public class gRide : RepositoryItemDateEdit
{
static gRide()
{
Register();
}
public gRide()
: base()
{
}
internal const string EditorName = "CustomDateEdit";
public static void Register()
{
EditorRegistrationInfo.Default.Editors.Add(new EditorClassInfo(EditorName, typeof(gDateEdit), typeof(gRide), typeof(DateEditViewInfo), new ButtonEditPainter(), true));
}
public override string EditorTypeName
{
get
{
return EditorName;
}
}
public override void Assign(RepositoryItem item)
{
this.VistaCalendarViewStyle = (item as RepositoryItemDateEdit).VistaCalendarViewStyle;
base.Assign(item);
}
}
}
然后,再定义一个类,叫gDateEdit,继承于DateEdit,用来设置RepositoryItemDateEdit或gRide的编辑器,代码如下:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraEditors.Popup;
using DevExpress.XtraEditors.Repository;
using DevExpress.Utils.Drawing;
using DevExpress.XtraEditors.ViewInfo;
using DevExpress.XtraEditors.Drawing;
using DevExpress.XtraEditors.Calendar;
using DevExpress.Skins;
namespace CustomEditor
{
[ToolboxItem(true)]
[System.ComponentModel.DesignerCategory("")]
public class gDateEdit : DateEdit
{
static gDateEdit()
{
gRide.Register();
}
public gDateEdit()
: base()
{
}
public override string EditorTypeName
{
get
{
return gRide.EditorName;
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public new gRide Properties
{
get
{
return base.Properties as gRide;
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
}
public override void ShowPopup()
{
base.ShowPopup();
}
protected override void DoShowPopup()
{
base.DoShowPopup();
}
}
}
这样在使用时,按如下代码即可。
List<MyClass> list = new List<MyClass>();
list.Add(new MyClass() { Time = DateTime.Today });
gridControl1.DataSource = list;
gRide nRide = new gRide(); //此处要注意,不要使用RepositoryItemDateEdit,而应使用改写后的gRide
nRide.VistaCalendarViewStyle = DevExpress.XtraEditors.VistaCalendarViewStyle.YearView;
string sYm= "yyyy年MM月";
nRide.DisplayFormat.FormatString = sYm;
nRide.EditMask = sYm;
gridView1.Columns[0].ColumnEdit = nRide;
其中的gridControl1及gridView1,请自己从工具箱中添加到窗体中哦,MyClass类的定义如下:
public class MyClass
{
private DateTime privateTime;
public DateTime Time
{
get
{
return privateTime;
}
set
{
privateTime = value;
}
}
}