我正在开发一个应用程序,我在其中为整个应用程序设置了默认文化。
static void Main()
{
try
{
#region set date pattern for whole application
try
{
CultureInfo culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
culture.DateTimeFormat.ShortDatePattern = System.Configuration.ConfigurationManager.AppSettings["ShortDateFormat"];
culture.DateTimeFormat.LongDatePattern = System.Configuration.ConfigurationManager.AppSettings["LongDateFormat"];
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;
}
catch (Exception ex)
{
RCOP.SmartClient.General.SaveLog(ex);
}
#endregion
}
....
}
日期时间格式不适用于datatables
,datatables
中的日期列具有计算机中设置的日期格式,如果用户更改计算机datetime
格式,则会导致例外。所以我必须使用以下代码为个人datatables
dataTable.Locale.DateTimeFormat.ShortDatePattern = Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern;
dataTable.Locale.DateTimeFormat.LongDatePattern = Thread.CurrentThread.CurrentCulture.DateTimeFormat.LongDatePattern;
问题是我必须在整个应用程序中应用上述设置(因为win app非常大,超过200个地方)我使用了datatables
。
如何在一个地方应用datetime
设置,以便所有datatables
具有与默认文化中设置的相同的datetime
格式。
您可以将您的自定义DataTable
与您的自定义culture
设置为ShortDatePattern
,因为您的DataTable
格式仅用于显示,日期和Locale
不是static
它不能在应用程序中全局继承或覆盖,每个DataTable
都有它自己的DateTimeFormat
。
所以做以下事情:
[Serializable]
public class MyDataTable : DataTable
{
void SetCulture()
{
this.Locale.DateTimeFormat.ShortDatePattern = Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern;
this.Locale.DateTimeFormat.LongDatePattern = Thread.CurrentThread.CurrentCulture.DateTimeFormat.LongDatePattern;
}
public MyDataTable()
: base()
{
SetCulture();
}
public MyDataTable(string tableName)
: base(tableName)
{
SetCulture();
}
public MyDataTable(string tableName, string tableNamespace)
: base(tableName, tableNamespace)
{
SetCulture();
}
/// <summary>
/// Needs using System.Runtime.Serialization;
/// </summary>
public MyDataTable(SerializationInfo info, StreamingContext context)
: base(info, context)
{
SetCulture();
}
}
并在整个申请中用DataTable
替换所有MyDataTable
。
或者这样做:
public interface ISource
{
DataTable Table { get; }
}
public class MySource : ISource
{
private DataTable table;
public DataTable Table
{
get
{
if (table == null)
{
table = new System.Data.DataTable();
table.Locale.DateTimeFormat.ShortDatePattern = Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern;
table.Locale.DateTimeFormat.LongDatePattern = Thread.CurrentThread.CurrentCulture.DateTimeFormat.LongDatePattern;
}
return table;
}
private set
{
this.table = value;
}
}
}
但第一个例子更好。
有很多方法可以声明可以在整个应用程序中使用的数据表。您可以使用Singleton,通过创建具有DataTable属性的静态类,并在appplication中的任何位置访问它。另一个是您可以使用依赖注入,方法是将包含DataTable属性的类的实例注入到类构造函数中。 See Dry Principles explained