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

HijriDateView ASP.NET 控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.58/5 (9投票s)

2009年3月17日

CPOL

3分钟阅读

viewsIcon

43288

downloadIcon

1455

一个 ASP.NET 控件,允许在 ASP.NET 页面上以字符串格式绘制当前的 Hijri 日期。

引言

不久前,在做一个项目时,我需要将日期以 Hijri 格式(伊斯兰历)显示在 ASP.NET 页面上。虽然 FCL 包含一个 HijriCalendar 类,但它仅对应于计算算法,并不允许格式化输出以字符串形式显示日期。因此,本文介绍的 HijriDateView 控件应运而生。

它看起来的样子

HijriDateView 是一个 ASP.NET 复合控件,由一个 Panel(对应于 HTML Div)和一个 Panel 内部的纯文本组成。默认情况下,在页面上,它看起来是这样的:

由于 Panel 类用作容器,因此可以对控件应用任何视觉样式,使其看起来像这样:

或者这个

或者这个

如何使用该控件

只需编译附加的项目,或使用 IslamicTools_bin.zip 文件中已编译的程序集。在您的 ASP.NET WebForms 项目中引用 IslamicTools.dll,您的 Visual Studio 工具箱中就会出现一个新项。只需将其拖到 ASP.NET 页面上的合适位置,就会生成类似以下的代码:
<IslamicTools:HijriDateView ID="hijriDateView" runat="server">
</IslamicTools:HijriDateView>

现在,您可以设置控件的一些属性:

  • Language - 用于阿拉伯月份名称音译的语言。目前,可能的值是英语和俄语。
  • IncludeArabic - 指示是否在生成的铭文(inscription)中显示阿拉伯文本。
  • Date - 用于转换和显示的日期。如果未指定,则使用当前日期(DateTime.Now)。

所有常规的 ASP.NET 控件视觉属性也可以在这里设置。现在,只需编译并运行您的页面即可看到结果。

工作原理

有四个文件与此控件相关。

  • HijriDate.cs - 包含 HijriDate 类,该类封装了 FCL 中的 HijriCalendar 类。
  • HijriDate.xml - 包含不同的月份音译,包括阿拉伯语。
  • HijriDateView.bmp - 工具栏的位图。
  • HijriDateView.cs - 包含在 ASP.NET 页面上使用的 HijriDateView Web 控件。

在 ASP.NET 页面的生命周期中,会创建一个 HijriDateView 控件的新实例。我们在构造函数中设置 DateLanguageIncludeArabic 属性的默认值。如果用户手动设置它们的值,这些值将被覆盖。在页面生命周期的 LoadComplete 阶段,将调用 HijriDateViewCreateChildControls 方法。它将准备一个容器(Panel)和一个文本占位符(LiteralControl),同时创建一个 HijriDate 类的新实例并使用定义的属性。

protected override void CreateChildControls()
{
  Panel pnl = new Panel();
  HijriDate hd = new HijriDate(dt);
  string label = String.Format("<nobr>{0}</nobr>", 
                               hd.ToString(language, includeArabic));
  LiteralControl lc = new LiteralControl(label);
  Controls.Add(pnl);
  pnl.Controls.Add(lc);
  base.CreateChildControls();
}

HijriDate 类接受一个 DateTime 对象作为输入。在构造函数中,会为指定日期创建一个新的 HijriCalendar 实例,以及对应于年份、月份编号和月份天数的私有数字字段,并进行填充。此外,字符串资源从 HijriDate.xml 文件加载。

public HijriDate()
   : this(DateTime.Now)
{
}
public HijriDate(DateTime dt)
{
  hijriCalendar = new HijriCalendar();
  hijriYearNumber = hijriCalendar.GetYear(dt);
  hijriMonthNumber = hijriCalendar.GetMonth(dt);
  hijriDayNumber = hijriCalendar.GetDayOfMonth(dt);
  LoadHijriDateXml();
}

HijriDate.xml 的格式如下:

<?xml version="1.0" encoding="utf-8" ?>
<Months>
  <month number="1">
    <English>Muharram</English>
    <Arabic>محرم</Arabic>
    <Russian>Мухаррам</Russian>
  </month>
  <month number="2">
    <English>Safar</English>
    <Arabic>صفر</Arabic>
    <Russian>Сафар</Russian>
  </month>
    ...
  <month number="12">
    <English>Dhu al-Hijja</English>
    <Arabic>ذو الحجة</Arabic>
    <Russian>Зуль-Хиджа</Russian>
  </month> 
</Months>

HijriDate 类有一个重写的 ToString() 方法,该方法负责将日期的数字表示转换为字符串。

public override string ToString()
{
  return ToString(SupportedLanguages.English, true);
}

public string ToString(SupportedLanguages language, 
                       bool includeArabicInscription)
{
  return String.Format("{0} {1} {2}", hijriDayNumber.ToString(), 
  GetMonthName(language, includeArabicInscription),
  hijriYearNumber.ToString());
}

就是这样。您可能已经注意到,这里没有提供所有代码,特别是 LoadHijriDateXml()GetMonthName() 方法甚至没有被描述。但从它们的名称应该可以清楚它们的行为,并且它们的代码可以在 HijriDateView_src.zip 文件中找到。

示例

可以在 http://www.russian-mosques.com 找到一个可用的控件。**IslamicTools** 库目前只包含一个 HijriDateView 控件。它将很快扩展其他控件。如果您有任何想法或建议,非常欢迎您与我联系。

© . All rights reserved.