2014-03-26 46 views
0

我需要實現的是, 使用組合框(包含所有時區)和複選框下方的複選框顯示UI。 僅當時區(選定的組合框項目)支持夏令時時,才應顯示覆選框。當UI控件呈現時,還可以根據上次配置選中/取消選中複選框。在C中處理時區#

現在C#中的TimeZoneInfo類允許我獲得時區列表(Combobox的數據)。 但TimeZoneInfo類中的SupportsDayLightSaving屬性在複選框選中時指示爲true,在存在時不指定複選框或複選框未選中。

那麼,如何經由,

1.Whether的時區支持DayLightSavingTime C#決定(例如爲:印度標準時間犯規支持DST) 2.Whether DST的使能(複選框被選中/如果時區支持DST,則不選中)。

編輯: 如果我以前沒有正確解釋過,這裏是更詳細的信息。 我想要做什麼:

  1. 顯示/隱藏複選框(是什麼,如果條件做出這一決定)
  2. 如果顯示覆選框,選中/取消選中該複選框(是什麼,如果條件藉此決定)。

PS:根據MSDN SupportsDaylightSavingTime屬性,如果選中該複選框,則該值爲true,如果取消選中該複選框或者該時區不支持DST,則該值爲false。使用此屬性,如果該值爲false,則無法確定是隱藏複選框還是顯示它並取消選中該複選框。 例如:對於印度標準時間,我不應該顯示覆選框,因爲如果我必須依靠屬性值,那麼我會把它看作是假的,我可以隱藏它。 但考慮我們有柏林時區(+ 1 UTC)與複選框未選中使用控制面板設置,然後我會檢索屬性值爲false,應用上述邏輯將隱藏複選框,而是在這裏我想顯示覆選框的狀態未選中。

編輯回答: 看起來我無法正確解釋問題,我很抱歉。 經過長時間的搜索和搜索,我可以看到.NET不提供API來支持我的需要。因此,有一個解決方案,

檢查SupportsDaylightSavingsTime屬性是否爲真, 如果然後顯示覆選框狀態選中。如果上述屬性值爲false,則檢查註冊表中的DynamicDaylightTimeDisabled值(HKLM \ System \ CurrentControlSet \ Control \ TimeZoneInformation)。因爲這裏的錯誤並不意味着時區不支持DST,它也可以被禁用。如果值爲1,則顯示未選中狀態的複選框(因爲它支持DST但此時被禁用)。如果該值爲0,則不顯示覆選框(因爲時區不支持DST)。

//get the time zone info for the currently selected time zone. 
     if (timeZoneInfo.SupportsDaylightSavingsTime) 
     { 
      //Show the checkbox. 
      //Mark the checkbox state as checked. 
     } 
     else 
     { 
      //doesnt mean that the timezone doesnt support DST. 
      int regValue;//Get the reg value of DynamicDaylightTimeDisabled in 
      //location HKLM\System\CurrentControlSet\Control\TimeZoneInformation\ 

      if(regValue == 0) 
      { 
       //Donot show the checkbox. 
      } 
      if(regValue == 1) 
      { 
       //show the checkbox. 
       //Mark the checkbox state as unchecked. 
      } 

     } 
+0

您使用贏dows-Form,WPF,ASP.NET? –

+0

它是一個wpf應用程序。但沒關係,因爲我只是爲了理解才解釋了用戶界面。我的疑問是我需要使用什麼API來檢查我的兩個條件。 1.顯示/隱藏複選框。 2.選中/取消選中複選框。 – srsyogesh

回答

4

什麼是從你的解釋失蹤,但我想我可以從評論推斷是你這個複選框具體講:

                        Time Zone Setting

那只有在使用TimeZoneInfo.Local時纔會發揮作用。換句話說,我總是可以做到這一點:

var tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 
Debug.WriteLine(tzi.SupportsDaylightSavingTime); 

而且無論該複選框是否被設置,tzi.SupportsDaylightSavingTime將返回true,因爲該區域的數據支持它。

但使用

var tzi = TimeZoneInfo.Local; 
Debug.WriteLine(tzi.SupportsDaylightSavingTime); 

結果如果沒有選中該複選框,即使區域數據支持也可能是假的。這是討論in the MSDN,還in this excellent article

如果我理解正確,您希望明確知道「自動調整夏時制時鐘」是否已被清除,以便您可以構建一個模仿Windows的UI?

正如你在其中一個編輯中指出的那樣,如果你喜歡,你可以從註冊表中得到這個,但是你需要檢查兩個不同的鍵,而不僅僅是一個。每the article

根據Windows的版本中使用,此複選框將設置無論是 「DisableAutoDaylightTimeSet」 或 「DynamicDaylightTimeDisabled」 註冊表項值一(1):

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation 
    "DynamicDaylightTimeDisabled"=dword:00000001` 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation 
    "DisableAutoDaylightTimeSet"=dword:00000001 

然而,還有探測這一情況,更簡單的方法:

static bool LocalDstDisabled() 
{ 
    TimeZoneInfo localZone = TimeZoneInfo.Local; 
    TimeZoneInfo realZone = TimeZoneInfo.FindSystemTimeZoneById(localZone.Id); 

    return realZone.SupportsDaylightSavingTime && 
      !localZone.SupportsDaylightSavingTime; 
} 
+1

此外,將來您可能會考慮省略關於您自己的本地用戶界面的部分,因爲我不認爲您真的在尋求關於如何顯示覆選框的幫助。問題範圍越窄,您就越有可能獲得相關答案。 –

+0

馬特,我很困惑,因爲他最後的評論我放棄了這個q現在我認爲:) –

+0

哦馬特:)最後這是我一直在尋找的答案。可能是我從一開始就可以更好地解釋它,抱歉沒有把它放在正確的方式。儘管如此,你指出了正確的答案。感謝您的鏈接了。 – srsyogesh

1

1。無論是時區支持DayLightSavingTime(用於如:印度標準時間犯規支持DST)

使用TimeZoneInfo.SupportsDaylightSavingTime屬性來測試它。

例如:

ReadOnlyCollection<TimeZoneInfo> zones = TimeZoneInfo.GetSystemTimeZones(); 
foreach(TimeZoneInfo zone in zones) 
{ 
    if (! zone.SupportsDaylightSavingTime) 
     Console.WriteLine(zone.DisplayName); 
} 

2.Whether DST被啓用與否(複選框被選中/未選中)如果時區支持DST。

我假設你使用的是Windows窗體應用程序與ListBox控制你的GUI,在這種情況下,掛接到OnSelectedIndexChanged事件您ListBox的,讓你的DayLightSupport測試就在那裏。

+0

感謝您的回答。但是,我發現可以使用SupportDaylightSavingTime來確定TimeZone是否支持DST。但這並非總是如此。因爲例如:如果我們從控制面板設置中取消選中柏林時區(支持夏令時的+1 UTC)複選框,並且如果我們編寫代碼以獲取此時區的SupportDayLightSavingTime值,那麼我們將得到一個值false(as每個MSDN文檔),但是如果你看到這個時區支持dst。 – srsyogesh

+0

爲了更清楚起見,我想首先顯示或隱藏複選框(基於它是否支持dst),其次複選框應該被選中或取消選中(基於之前的配置),那麼兩個條件(即如果檢查我需要使用)。如果您清楚地看到我有兩個條件,但.NET只提供一個支票SupportsDaylightSavingTime,那麼可以通過其他方式進行檢查? – srsyogesh

0

也許這段代碼會有所幫助,但它是所有的代碼和簡單的事情。

評論後更新。

一些XAML:

<Window x:Class="TimeZoneDaylightTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Loaded="MainWindow_OnLoaded" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <StackPanel> 
      <ListBox Height="200" Name="TimeZonesListBox" SelectionChanged="TimeZonesListBox_OnSelectionChanged"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <TextBlock Text="{Binding DisplayName}" /> 
         </StackPanel> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
      <CheckBox Height="30" Name="SupportsDaylightCheckBox">Supports DayLightSaving</CheckBox> 
     </StackPanel> 
    </Grid> 
</Window> 

和後面的代碼:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void MainWindow_OnLoaded(object sender, RoutedEventArgs e) 
    { 
     TimeZonesListBox.ItemsSource = TimeZoneInfo.GetSystemTimeZones(); 
    } 

    private void TimeZonesListBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     var tz = TimeZonesListBox.SelectedItem as TimeZoneInfo; 
     if (tz != null) 
      SupportsDaylightCheckBox.Visibility = tz.SupportsDaylightSavingTime ? Visibility.Visible : Visibility.Hidden; 
    } 
} 
+0

你快要近了。在選擇改變後,我想要的是,隱藏或顯示覆選框,我該如何做到這一點。好的,這個我怎麼表達,我將用什麼來確定是否顯示或隱藏複選框? – srsyogesh

+0

啊,堅持下去,我認爲這是複選框的可見性屬性,你應該尋找,我會在一分鐘內更新示例... –

+0

現在你處於正確的軌道,那麼應該是什麼條件我應該用來檢查/取消選中控件? – srsyogesh

0

複選框應顯示僅在時區(所選擇的組合框項目)支持夏令時。當UI控件呈現時,還可以根據上次配置選中/取消選中複選框。

如果我正確理解你的情況,這裏有兩件事情。爲了顯示/隱藏複選框,您需要檢查所選時區是否支持DST,然後設置其可見性。但爲了根據以前的配置將其設置爲checked/unchecked,您需要以某種方式存儲 - 很可能在數據庫中存儲,但我不確定實際情況。

由於你的代碼將如何看的想法,它可能類似於此:

private void TimeZonesListBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    TimeZoneInfo info = (TimeZoneInfo)timeZoneListBox.SelectedItem; 
    dstCheckBox.Visible = info.SupportsDaylightSavingTime; 
    dstCheckBox.Checked = GetPreviousConfiguration(info); 
} 

private bool GetPreviousConfiguration(TimeZoneInfo timezone) 
{ 
    //Code to lookup previous config. 
} 

希望這點你在正確的方向。