65.9K
CodeProject 正在变化。 阅读更多。
Home

Farsi 库 - 处理日期、日历和日期选择器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (224投票s)

2006年4月3日

MIT

8分钟阅读

viewsIcon

3040505

downloadIcon

95607

一个用于处理“波斯历”、“伊斯兰历”和“公历”的库,提供 WinForms GUI 控件,专为波斯(Farsi)或阿拉伯语应用程序设计,但也可用于任何使用日历和日期的 Windows 应用程序。

Sample Image - Farsi Library Control

引言

波斯历在大多数使用波斯语的国家使用,尽管有些地区使用不同的月份名称。波斯历是伊朗和阿富汗的官方日历,也是哈萨克斯坦和塔吉克斯坦等地区的替代日历之一。波斯历基于太阳年,长度约为 365 天。一年有四个季节,当太阳从南半球穿越赤道进入北半球时,新的一年开始。新年标志着法瓦尔丁月的第一天,这是北半球春天的第一天。

波斯历的前六个月每月有 31 天,接下来的五个月每月有 30 天,最后一个月在平年有 29 天,在闰年有 30 天。闰年是指除以 33 后余数为 1、5、9、13、17、22、26 或 30 的年份。例如,1370 年是闰年,因为除以 33 的余数为 17。在每 33 年的周期中大约有 8 个闰年。

由于 .NET Framework 1.0 和 1.1 均未提供任何波斯历,而 .NET 2.0 中的波斯历存在错误且无法使用,因此在此我将展示如何编写所需的 DataType 和 GUI 控件来处理此 DataType

波斯历类

看起来微软忘记在 .NET 1.1 中提供“波斯历”,虽然他们在 Framework 的第二个版本中确实为这种特殊日历提供了一个类,但他们却以某种方式计算错误。我们将编写一个波斯历,以及一个 DataType 来替代标准的 DateTime 类,同时保持相同的结构。由于需要将标准的 DateTime 转换为 PersianDate,我还会提供一个转换器类。由于这些类与 GUI 控件结合使用可以最大化其用途,因此我还将提供一个 MonthView 和一个 DatePicker 控件。

设计时集成

我对设计时集成进行了一些更改。由于一些开发人员喜欢使用 PersianDate,而另一些开发人员则使用 DateTime 类来处理这些库,因此我将这两个属性都公开为 SelectedDateSelectedDateTime。对于具有 PersianDate 类型的 SelectedDate,有一个 TypeConverter 可以在设计时将文本转换为 PersianDate 实例。

主题支持

我使用了 .NET 2.0 的 VisualStyleRenderer,它是 XP 样式的托管包装器。此外,还有一些类用于模拟 Office 2003 渲染。还提供了一个 Office 2000 样式。如果禁用了主题支持或操作系统不支持,控件将使用 Office 2000 样式进行渲染。

弹出窗口和阴影

弹出窗口应带有阴影。对于 RTL(从右到左)控件,阴影应位于控件的左下方。控件中使用的所有字符串都使用本地化管理器类,根据 StringID 枚举获取字符串。要使用本地化版本,您应该将当前线程的 CultureCultureUI 属性更改为定义的区域设置之一:(AR-SA 用于阿拉伯语,FA-IR 用于波斯语,InvariantCulture 用于英语或中性文化。以下是在应用程序的 Main() 方法中进行设置的方法:

//
// The main entry point for the application.
//
[STAThread]
static void Main()
{
    Thread.CurrentThread.CurrentUICulture =
            new System.Globalization.CultureInfo("fa-IR");
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

这是具有标准字符串和 FA-IR 区域设置本地化版本的弹出窗口的正确行为。

使用阿拉伯语和中性区域设置

我主要使用 AR-AE 区域设置处理阿拉伯语,但在版本 1.3.1.0 中,我不得不将其更改为 AR-SA。这是因为伊斯兰历不是 AR-AE 区域设置的默认日历,而它 AR-SA 区域设置的默认日历。现在,当您将区域设置设置为阿拉伯语时,控件会以正确的方式绘制。

在中性区域设置中,现在是按从左到右的顺序渲染。通常,控件根据当前区域设置的阅读顺序决定是按 RTL 还是 LTR 渲染。

Using the Code

您可以使用 PersianDate 类,其方式与使用 DateTime 类几乎相同。以下是一些示例:

//
// Use of Persian date class
//
PersianDate pd1 = PersianDate.Now.ToString(); // prints 1385/01/13
// constructs a new instance with the specified vales
PersianDate pd2 = new PersianDate(1386, 4, 26); 

// You can use operator overloading, too!
if(pd1 >= pd2)
   MessageBox.Show("Date is greater or equal");

// Use of normal DateTime and Conversion
PersianDate pd3 = PersianDateConverter.ToPersianDate(DateTime.Now);
DateTime dt1 = PersianDateConverter.ToGregorianDate(PersianDate.Now);

关注点

请将任何建议/评论/反馈发送到我的电子邮件地址,或使用页面底部的论坛。有关未来的版本或其他库,请访问我的网站

.NET 1.1 和 VisualStudio .NET 2003 支持

此库已在 VS.NET 2005 和 .NET Framework 2.0 版本上进行了测试。因此,它无法在 VS.NET 2003 上运行。如果您真的需要使其运行,您将不得不将其移植到 VS.NET 2003,并且您将不得不更改代码的绘制部分,因为它实际上使用了 .NET 2.0 的托管类来以 WindowsXP 风格进行绘制。您将不得不使用 Theme API 的包装器(CodeProject 上已有一个项目)来完成这项工作。为了简化移植,您还可以删除 WindowsXP 和 Office 2003 风格的所有绘制,并坚持使用传统的 Office2000 主题,该主题使用 GDI+ 类进行绘制。

WPF 版本

WPF 版本已发布。您可以在 The Code Project 网站的 Vista(Windows Presentation Foundation)部分找到它。我们非常感谢您的反馈和评论。

历史

版本 1.9.0.0

  • 已修复:关于波斯/阿拉伯星期几与公历星期几映射错误的错误,这导致了公历中星期几显示错误。
  • 已添加:更好地处理多选模式。您可以添加/删除 SelectedDateRange 属性,更改将反映在 UI 上。
  • 已添加:PersianDayOfWeek 枚举,具有正确的日期顺序。
  • 已添加:PersianDate 类的 DayOfWeek 属性,用于返回正确的星期几。

版本 1.6.0.0

  • 已修复:通过反馈报告的一些错误。
  • 已添加:MessageBox 控件,支持 RTL 和 LTR 视图,并能够记住选定的值,提供标准和自定义 MessageBox 按钮。
  • 已添加:PersianDate.ToString() 方法的自定义格式化(类似于 DateTime 控件),它提供了返回格式化字符串的功能,例如长日期、长时间、DateTime 等。
  • 已添加:自定义绘制每个首选日期。可以与 SelectedDateTimeChanging 事件一起使用,以禁用格式绘制某些日期。

版本 1.5.0.0

  • 已修复:FAMonthView 控件在选择小于 MinValue 和大于 MaxValue 的日期时发生的异常。
  • 已修复:扩大了 PersianDate MinValueMaxValue 类的范围。
  • 已修复:Invariant Culture 的 MonthNames 是一个零基索引。Invariant Culture 中的第一个月份名称现在是正确的。
  • 已修复:在设置 PersianDate 属性时检查 Year、Month、Day 等值。
  • 已修复:在 PersianDate!=== 运算符上检查 null 值。
  • 已修复:移除了 GUI 控件中重复的 DateTimePersianDate 属性和事件。您可以直接将 DateTime 实例转换为 PersianDate
  • 已修复:DatePicker 的验证过程。
  • 已添加:与任何数据源进行完整的双向绑定。
  • 已添加:允许在控件中使用其他区域设置和日历。
  • 已添加:DateTimePersianDate 的隐式转换。
  • 已添加:向 PersianDate 类添加了 Millisecond 属性,以提高精度。
  • 已添加:PersianDate 类现在是可序列化的,并实现了以下接口:ICloneableIComparableIComparable<T>IComparerIComparer<T>IEquatable<T>
  • 已添加:允许选择 FAMonthView 的滚动功能。您可以按天、月或年滚动。
  • 已添加:FAThemeManager 类,负责处理所有控件的选定主题。要全局更改主题,只需设置该类的 Theme 属性。
  • 已添加:FALocalizeManager 类,负责处理其他区域设置。您现在可以将字符串本地化为任何区域设置。
  • 已添加:ToolStrip 支持。现在您可以将控件集成到 ToolStripMenuStrip 等中。
  • 已添加:Microsoft DataGridView 自定义列和编辑器支持。

版本 1.4.0.0

  • 已添加:包含库提供的功能的完整测试和演示,附带源代码。
  • 已添加:文档
  • 已添加:PopupFormsControls 层次结构和 Painter 类的图表。
  • ComboBox 控件上实现了正确的 Office 2003 外观和感觉。
  • 实现了 FADatePickerConverter 的正确 RTL 和 LTR 视图。
  • Bug 修复:FADatePicker 控件现在根据其主题显示弹出日历。
  • Bug 修复:RTL 和 LTR 模式下弹出控件的正确方向。
  • Bug 修复:RTL 和 LTR 模式下弹出控件的正确阴影位置。
  • Bug 修复:FADatePicker 控件未能正确显示文本属性。
  • 更改:命名空间的重新定位。
  • 已知问题:阿拉伯语字符串的本地化。(有人能帮我一下吗?)

版本 1.3.1.0

  • 在非 Windows XP 计算机上或视觉样式被禁用时实现 Windows 2000 绘制。
  • 更好地绘制 Windows XP 和 Office 2003 样式。
  • 根据用户的区域设置绘制控件。目前允许的区域设置有:中性(公历)、AR-SA(伊斯兰历)和 FA-IR(波斯历)。
  • 更好的本地化。您可以使用 Localizer 类来更新字符串。
  • 支持公历(中性区域设置)和伊斯兰历。
  • 对非从右到左的区域设置(例如,中性区域设置、英语区域设置等)进行从左到右渲染。
  • 新的 DatePickerConverter 控件,通过按按钮来转换选定的日期。

版本 1

  • 提供用于处理“波斯日期”的基础类和 GUI 控件。某些功能(例如,Office 2000 绘制)尚未实现。

© . All rights reserved.