如何为整个Winform应用程序中使用的数据表设置日期时间格式?

时间:2019-03-12 05:50:10

标签: c# winforms datatables cultureinfo

我正在开发一个为整个应用程序设置默认区域性的应用程序。

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;

问题是我必须在使用datatables的整个应用程序中应用上述设置(超过200个位置,因为Win应用程序非常大)。

如何在一处应用datetime设置,以使所有datatables都具有与默认区域性设置相同的datetime格式。

2 个答案:

答案 0 :(得分:1)

您可以将自定义DataTable的自定义culture始终设置为ShortDatePattern,因为您的DataTable格式仅用于显示日期和{{1} }不是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

但第一个示例更好。

答案 1 :(得分:0)

有很多方法可以声明可以在整个应用程序中使用的数据表。您可以通过创建具有DataTable属性的静态类并在应用程序中的任何位置访问它来使用Singleton。另一个是可以通过将包含DataTable属性的类的实例注入到类构造函数中来使用依赖注入。 See Dry Principles explained