开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 3120|回复: 3

XAF TimeSpan Editor

[复制链接]

0

精华

0

贡献

74

赞扬

帖子
74
软币
717
在线时间
55 小时
注册时间
2013-8-2
发表于 2016-8-11 13:48:02 | 显示全部楼层 |阅读模式
Here's a simple solution for entering TimeSpan data in a casual style : " 1 day 39 hours 78 min"



The Solutions is to create a prpoperty editor that hosts simple Text editor, with some custom logic undeneath, that parses the string and converts it to TimeSpan after entering the string. And also Convert the timespan form the database to string, to be displayed in the casual format.


using System;using System.Text.RegularExpressions;using DevExpress.ExpressApp.Editors;using DevExpress.ExpressApp.Model;using DevExpress.ExpressApp.Win.Editors;using DevExpress.XtraEditors.Mask;using DevExpress.XtraEditors.Repository; namespace Solution2.Module.Win{    [PropertyEditor(typeof(TimeSpan))]    public class DurationPropertyEditor : DXPropertyEditor    {        public DurationPropertyEditor(Type objectType, IModelMemberViewItem model)            : base(objectType, model)        {                    }         protected override object CreateControlCore()        {            return new StringEdit();        }         protected override void SetupRepositoryItem(RepositoryItem item)        {            base.SetupRepositoryItem(item);             ((RepositoryItemStringEdit)item).Mask.MaskType = MaskType.RegEx;            ((RepositoryItemStringEdit)item).Mask.EditMask                = @"\s*((\d?\d?\d?\s*(d(ays?)?)))?\s*((\d?\d?\s*(h(ours)?)?))?\s*(\d?\d?\s*(m(in(utes)?)?)?)?";             if (Control == null) return;             Control.ShowToolTips = true;            Control.ToolTip =                " Examples:  " + Environment.NewLine +                " 1d                     = 1 Day" + Environment.NewLine +                " 1 day                  = 1 Day" + Environment.NewLine +                " 2d 5h 45 m             = 2 Days 5 Hours 45 minutes" + Environment.NewLine +                " 2 days 4 hours 25 min  = 2 Days 4 Hours 25 minutes" + Environment.NewLine;            Control.EditValueChanged += Control_EditValueChanged;        }         void Control_EditValueChanged(object sender, EventArgs e)        {            WriteValue();            OnControlValueChanged();        }         protected override object GetControlValueCore()        {            return ParseTimeSpan(Control.Text);        }                protected override void ReadValueCore()        {            Control.EditValue = DecodeTimeSpan((TimeSpan) PropertyValue);                    }              public static TimeSpan ParseTimeSpan(string s)        {            const string Quantity = "quantity";            const string Unit = "unit";             const string Days = @"(d(ays?)?)";            const string Hours = @"(h((ours?)|(rs?))?)";            const string Minutes = @"(m((inutes?)|(ins?))?)";            const string Seconds = @"(s((econds?)|(ecs?))?)";             var timeSpanRegex = new Regex(                string.Format(@"\s*(?<{0}>\d+)\s*(?<{1}>({2}|{3}|{4}|{5}|\Z))",                              Quantity, Unit, Days, Hours, Minutes, Seconds),                              RegexOptions.IgnoreCase);            var matches = timeSpanRegex.Matches(s);             var ts = new TimeSpan();            foreach (Match match in matches)            {                if (Regex.IsMatch(match.Groups[Unit].Value, @"\A" + Days))                {                    ts = ts.Add(TimeSpan.FromDays(double.Parse(match.Groups[Quantity].Value)));                }                else if (Regex.IsMatch(match.Groups[Unit].Value, Hours))                {                    ts = ts.Add(TimeSpan.FromHours(double.Parse(match.Groups[Quantity].Value)));                }                else if (Regex.IsMatch(match.Groups[Unit].Value, Minutes))                {                    ts = ts.Add(TimeSpan.FromMinutes(double.Parse(match.Groups[Quantity].Value)));                }                else if (Regex.IsMatch(match.Groups[Unit].Value, Seconds))                {                    ts = ts.Add(TimeSpan.FromSeconds(double.Parse(match.Groups[Quantity].Value)));                }                else                {                    // Quantity given but no unit, default to Hours                    ts = ts.Add(TimeSpan.FromHours(double.Parse(match.Groups[Quantity].Value)));                }            }            return ts;        }         public static string DecodeTimeSpan(TimeSpan timeSpan)        {             var time = string.Empty;             if (timeSpan.Days > 0)                time = timeSpan.Days + " Days";                                    if (timeSpan.Hours > 0)                time += (time != string.Empty ? " " : "") + timeSpan.Hours + " Hours";                         if (timeSpan.Minutes > 0)                time += (time != string.Empty ? " " : "") + timeSpan.Minutes + " Minutes";             return time;        }    }}

评分

参与人数 2赞扬 +2 收起 理由
jht2800 + 1 感谢分享
pretyboy + 1 很给力

查看全部评分

回复

使用道具 举报

0

精华

677

贡献

767

赞扬

帖子
273
软币
11235
在线时间
1122 小时
注册时间
2013-6-9
发表于 2016-8-11 14:45:29 | 显示全部楼层
大侠,看起来很费劲。能否作为附件传上来?
回复

使用道具 举报

0

精华

0

贡献

74

赞扬

帖子
74
软币
717
在线时间
55 小时
注册时间
2013-8-2
 楼主| 发表于 2016-8-11 21:00:55 | 显示全部楼层
nickcole 发表于 2016-8-11 14:45
大侠,看起来很费劲。能否作为附件传上来?

重拍版:http://www.dxper.net/thread-6658-1-1.html
回复

使用道具 举报

0

精华

0

贡献

74

赞扬

帖子
74
软币
717
在线时间
55 小时
注册时间
2013-8-2
 楼主| 发表于 2016-8-11 21:32:03 | 显示全部楼层
nickcole 发表于 2016-8-11 14:45
大侠,看起来很费劲。能否作为附件传上来?

能否帮忙下载下下面链接中的附件?谢谢!
http://www.dxper.net/thread-6619-1-1.html
回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-12-23 07:29

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表