#c# #winforms #datatables #cultureinfo
#c# #winforms #таблицы данных #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;
Проблема в том, что я должен применить вышеуказанную настройку во всем приложении (более 200 мест, поскольку приложение win очень большое), где я использовал datatables
.
Как применить datetime
настройку в одном месте, чтобы все datatables
имели одинаковый datetime
формат, установленный в языке по умолчанию.
Ответ №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;
}
}
}
но первый пример лучше.
Ответ №2:
Существует много способов объявления таблицы данных, которая может использоваться во всем вашем приложении. Вы можете использовать Singleton, создав статический класс со свойством DataTable и получить к нему доступ в любом месте вашего приложения. Другой способ заключается в том, что вы можете использовать внедрение зависимостей, введя экземпляр класса, который содержит свойство DataTable, в конструктор вашего класса. Смотрите объясненные принципы Dry