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

问题描述 投票:2回答:2

我正在开发一个应用程序,我在其中为整个应用程序设置了默认文化。

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
    }
    ....
}

日期时间格式不适用于datatablesdatatables中的日期列具有计算机中设置的日期格式,如果用户更改计算机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格式。

c# winforms datatables cultureinfo
2个回答
1
投票

您可以将您的自定义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;
        }
    } 
}

但第一个例子更好。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.