Как установить формат даты и времени для таблиц данных, используемых во всем приложении winform? - PullRequest
2 голосов
/ 12 марта 2019

Я работаю над приложением, в котором я установил культуру по умолчанию для всего приложения.

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;

Проблема в том, что я должен применить вышеуказанные настройки во всем приложении (более 200 мест, поскольку win-приложение очень большое), где я использовал datatables.

Как применить настройку datetime в одном месте, чтобы все datatables имели такой же формат datetime, как установлено в культуре по умолчанию.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Вы можете иметь свой пользовательский 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 голосов
/ 12 марта 2019

Существует множество способов объявления таблицы данных, которую можно использовать во всем приложении.Вы можете использовать Singleton, создав статический класс со свойством DataTable и получить к нему доступ в любом месте приложения.Во-вторых, вы можете использовать Dependency Injection, внедрив экземпляр класса, который содержит свойство DataTable, в конструктор вашего класса. См. Принципы сухости, объясненные

...