Webテクノロジー ボードリーダー:小川 貢
毎月第2、第4木曜日はボードリーダーからのレポートを掲載いたします。
2003年3月13日
『どっとねっとと雑多な日』
皆さん、.NET Framework をつかってますかぁ?
#何回目なんでしょ?(^_^;)
今回は、和暦についてちと書きたいと思います。
データベース上に必ずあるといっても過言ではない DATETIME 型を和暦表示し たいという話はどこいってもあります。
やり方は SQL Server で変換してしまうのか、クライアントアプリケーション で変換するのかのどちらかだと思います。
で、SQL Server での変換は
[pml-begin,03116] 和暦ユーザー定義関数 (Re: 和暦について
http://www.sqlpassj.org/bbs/ml_disp.aspx?forum_id=1¤t_page=1&disp_mode=0&detail_mode=1&message_id=15212
で述べられている通り、ユーザー定義関数でやるか、もしくは拡張ストアドプ ロシージャを作って、Win32API の機能でやるかのどちらかだと思います。
クライアント側になると話は複雑で、ミドルウェアでやるのか表示でやるのかいろいろあります。
.NET Framework の場合で DataGrid を使い変換する場合は、 DataGrid に TableStyles に DataGridTableStyle を追加します。
追加した DataGridTableStyle に DataGridTextBoxColumn を追加します。 これは必要なだけ追加してください。
で、DateSet などに格納されているデータを対応させるために MappingName をそれぞれ指定します。
#ここまでは Visual Studio .NET の GUI で設定できます。
# DataGrid の TableStyles プロパティから追加できます。
で、和暦表示させたい Column の FormatInfo と Format を指定します。
たとえば、和暦を表示したい DataGridTextBoxColumn が dataGridTextBoxColumn という名前だとします。
System.Globalization.CultureInfo jpCultureInfo = new
System.Globalization.CultureInfo("ja-JP", true);
jpCultureInfo.DateTimeFormat.Calendar = new System.Globalization.JapaneseCalendar
();
dataGridTextBoxColumn.FormatInfo = jpCultureInfo;
dataGridTextBoxColumn.Format = "gg yy'年'MM'月'dd'日'";
こうすることで和暦の表示が可能となります。
#非常に面倒ですが。。。
さて、ここから話をデータベースから離れて、 .NET Framework の世界だけの 話をします。
System.Windows.Forms の DateTimePicker というリッチなコントロールがある のはご存知ですか?
これは Calendar コントロールと ComboBox コントロールを組み合わせたよう なコントロールで、Calendar で表示されている日付を選択すると ComboBox に日付が入るという代物です。
この DateTimePicker コントロールには致命的な弱点があります。
それは何かというと和暦表示がシステムに依存してしまうということです。
具体的にいうと「コントロールパネル」の「地域のオプション」(地域と言語 のオプション)の「日付」の「カレンダーの種類」に依存しているということ です。
和暦を表示したい場合は「カレンダーの種類」を「和暦」にする必要がありま すので注意してください。
※この件は MVP として Microsoft の CLR 開発チームにフィードバックして いますので、今後のバージョンで変更されるかもしれません。
余談ですが、この「カレンダーの種類」を「和暦」に変更する C# のサンプル ソースを書きたいと思います。
using System;
using System.Runtime.InteropServices;
namespace SetCalendars
{
class Console
{
private static int LOCALE_ICALENDARTYPE = 0x1009;
private static string CAL_JAPAN = "3";
[DllImport("kernel32")]
private static extern int GetUserDefaultLCID();
[DllImport("kernel32", CharSet=CharSet.Auto)]
private static extern int SetLocaleInfo(int Locale, int LCType, string LCData);
[STAThread]
static void Main(string[] args)
{
int LCID = GetUserDefaultLCID();
int result = SetLocaleInfo(LCID, LOCALE_ICALENDARTYPE, CAL_JAPAN);
Console.WriteLine("LCID: " + LCID.ToString() + " - " + result.ToString());
}
}
}
このように .NET Framework に関してはいろいろと問題があると思いますので、 ぜひとも皆さん、問題を見つけて Microsoft にフィードバックしましょう。
http://register.microsoft.com/mswish/suggestion.asp
ボードリーダーレポート トップページへ
PASSJメールニュース
著作権ついて
プライバシーポリシー
リンクポリシー
お問い合わせ
(C) 2005 Professional Association for SQL Server Japan. All rights reserved.