2016-01-08 4 views
0

Начну с того, что я не так разбираюсь в C#, и я пишу приложение Windows Forms, которое записывает в файл XML, который PowerShell может позже читать элементы из разных точек конфигурации.Получить стандартное имя часового пояса

Я создал ComboBox, который перечисляет TimeNames DisplayNames, который отлично работает.

ReadOnlyCollection<TimeZoneInfo> systemTimeZones; 
systemTimeZones = TimeZoneInfo.GetSystemTimeZones(); 
cbTimeZone.DataSource = systemTimeZones; 
cbTimeZone.BindingContext = new BindingContext(); 

Я пытаюсь получить стандартное имя выбранного часового пояса DisplayName в ComboBox. Я нашел TimeZoneInfo.Local.StandardName, но это не то, что я ищу, поскольку меня не интересует текущая системная информация. Я хочу использовать событие SelectedIndexChanged для ComboBox для отображения стандартного имени в ярлыке. Кажется, должен быть простой способ, которым я просто пропустил последние 2 дня чтения.

+0

Wanderlust - Вы сказали, что используете WPF, но 'DataSource' и' BindingContext' являются свойствами combobox WinForms. Они не существуют в WPF. Что он? –

+0

Мэтт: часовой пояс не требуется, если передача осуществляется с использованием UTC. Отвечая на вопросы, вы должны убедиться, что дизайн кода правильный, а также синтаксис и использование. Не имеет смысла исправлять проблему кодирования, если приложение не будет работать. – jdweng

+0

@jdweng - ОП не задал * о передаче значений времени или времени преобразования вообще. Вы, кажется, предполагаете, что они вообще не создают сборщик часовых поясов, но для этого нет оснований, поскольку у нас нет никакой информации о том, как этот сборщик будет использоваться. UTC не является панацеей. Есть действительно сценарии, где вам нужно спросить пользователя о своем часовом поясе. Что касается вопроса WPF vs WinForms, это действительно важно, так как нельзя правильно ответить на вопрос без него. –

ответ

1

использовать класс TimeZoneInfo, например.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     foreach (var zone in TimeZoneInfo.GetSystemTimeZones()) 
     { 
      cbTimeZones.Items.Add(zone.DisplayName); 
     } 
    } 

    private void cbTimeZones_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     var zone = TimeZoneInfo.GetSystemTimeZones().Single(x => x.DisplayName == ((ComboBox)sender).SelectedItem.ToString()); 
     lblTimeZone.Text = TimeZoneInfo.FindSystemTimeZoneById(zone.Id).StandardName; 
    } 
} 
+0

Спасибо за ответ, Мэтт. Мне не хватает того, как получить этот FindSystemTimeZoneById, поскольку, насколько я знаю, это то же самое, что и стандартное имя. Кажется, я получаю DisplayName, когда использую TimeZoneInfo. Я видел довольно много примеров для вывода Console.WriteLine, но я не уверен, как изменить это на форму. – John9241

+0

@Wanderlust - ваш combobox должен * показать * 'DisplayName' и использовать' Id' для связанного * значения * элемента. –

+0

Спасибо, Мэтт! Это отлично работает при получении стандартного имени из ID! Я просто пытаюсь выяснить, как заставить ComboBox показать DisplayName, чтобы было легче выбрать из списка. Я бы подумал, что он должен преобразовать ComboBox (DisplayName) в ID, а затем из ID в StandardName, если это возможно. – John9241

Смежные вопросы