DevExpress中GridView的日期编辑器RepositoryItemDateEdit属性VistaCalendarViewStyle失效问题

如果你使用的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;
		}
	}
}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值