Útmutató: A számítógépen található időzónák számbavétele
A kijelölt időzóna sikeres használatához az adott időzónával kapcsolatos információknak elérhetővé kell lenniük a rendszer számára. A Windows XP és a Windows Vista operációs rendszerek ezeket az információkat a beállításjegyzékben tárolják. Bár az egész világon található időzónák teljes száma nagy, a beállításjegyzék csak részhalmazukról tartalmaz információkat. Emellett maga a beállításjegyzék egy dinamikus struktúra, amelynek tartalma szándékos és véletlen változásnak is ki van téve. Ennek eredményeképpen az alkalmazás nem mindig feltételezi, hogy egy adott időzóna definiálva van, és elérhető egy rendszeren. Az időzóna-információs alkalmazásokat használó alkalmazások első lépése annak meghatározása, hogy a szükséges időzónák elérhetők-e a helyi rendszerben, vagy hogy a felhasználónak adja meg azoknak az időzónáknak a listáját, amelyek közül választani szeretne. Ehhez egy alkalmazásnak számba kell helyeznie a helyi rendszeren definiált időzónákat.
Feljegyzés
Ha egy alkalmazás egy adott időzóna jelenlétére támaszkodik, amely nem határozható meg egy helyi rendszeren, az alkalmazás az időzónára vonatkozó információk szerializálásával és deszerializálásával biztosíthatja annak jelenlétét. Az időzóna ezután hozzáadható egy listavezérlőhöz, hogy az alkalmazás felhasználója kijelölhesse. További részletekért lásd : Időzónák mentése beágyazott erőforrásba és útmutató: Időzónák visszaállítása beágyazott erőforrásból.
A helyi rendszeren található időzónák számbavétele
Hívja meg a metódust TimeZoneInfo.GetSystemTimeZones . A metódus általános ReadOnlyCollection<T> objektumgyűjteményt TimeZoneInfo ad vissza. A gyűjtemény bejegyzései a tulajdonságuk DisplayName szerint vannak rendezve. Példa:
ReadOnlyCollection<TimeZoneInfo> tzCollection; tzCollection = TimeZoneInfo.GetSystemTimeZones();
Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
A gyűjtemény egyes TimeZoneInfo objektumainak számbavétele hurok
foreach
(C#-ban) vagyFor Each
... használatávalNext
ciklust (a Visual Basicben), és végezze el az összes szükséges feldolgozást az egyes objektumokon. Az alábbi kód például számba adja az ReadOnlyCollection<T> 1. lépésben visszaadott objektumok gyűjteményét TimeZoneInfo , és felsorolja a konzolon lévő egyes időzónák megjelenítendő nevét.foreach (TimeZoneInfo timeZone in tzCollection) Console.WriteLine($" {timeZone.Id}: {timeZone.DisplayName}");
For Each timeZone As TimeZoneInfo In tzCollection Console.WriteLine(" {0}: {1}", timeZone.Id, timeZone.DisplayName) Next
A felhasználó bemutatása a helyi rendszeren található időzónák listájával
Hívja meg a metódust TimeZoneInfo.GetSystemTimeZones . A metódus általános ReadOnlyCollection<T> objektumgyűjteményt TimeZoneInfo ad vissza.
Rendelje hozzá az 1
DataSource
. lépésben visszaadott gyűjteményt egy Windows-űrlap vagy ASP.NET listavezérlő tulajdonságához.Kérje le a TimeZoneInfo felhasználó által kijelölt objektumot.
A példa egy Windows-alkalmazás illusztrációja.
Példa
A példa elindít egy Windows-alkalmazást, amely megjeleníti a rendszerben definiált időzónákat egy listamezőben. A példa ezután egy párbeszédpanelt jelenít meg, amely a felhasználó által kiválasztott időzóna-objektum tulajdonságának értékét DisplayName tartalmazza.
private void Form1_Load(object sender, EventArgs e)
{
ReadOnlyCollection<TimeZoneInfo> tzCollection;
tzCollection = TimeZoneInfo.GetSystemTimeZones();
_timeZoneList.DataSource = tzCollection;
}
private void OkButton_Click(object sender, EventArgs e)
{
TimeZoneInfo? selectedTimeZone = (TimeZoneInfo?)_timeZoneList.SelectedItem;
MessageBox.Show($"You selected the {selectedTimeZone?.ToString()} time zone.");
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo)
tzCollection = TimeZoneInfo.GetSystemTimeZones()
Me.timeZoneList.DataSource = tzCollection
End Sub
Private Sub OkButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OkButton.Click
Dim selectedTimeZone As TimeZoneInfo = DirectCast(Me.timeZoneList.SelectedItem(), TimeZoneInfo)
MsgBox("You selected the " & selectedTimeZone.ToString() & " time zone.")
End Sub
A legtöbb listavezérlő (például a System.Windows.Forms.ListBox vezérlő) System.Web.UI.WebControls.BulletedList lehetővé teszi, hogy objektumváltozók gyűjteményét rendelje hozzá a tulajdonságához DataSource
, amíg a gyűjtemény megvalósítja az interfészt IEnumerable . (Az általános ReadOnlyCollection<T> osztály ezt teszi.) Ha egy objektumot szeretne megjeleníteni a gyűjteményben, a vezérlő meghívja az objektum metódusát ToString
az objektum megjelenítéséhez használt sztring kinyerésére. Objektumok esetén TimeZoneInfo a metódus visszaadja ToString
az TimeZoneInfo objektum megjelenítendő nevét (a tulajdonság értékét DisplayName ).
Feljegyzés
Mivel a listavezérlők meghívják egy objektum metódusát ToString
, objektumgyűjteményt TimeZoneInfo rendelhet a vezérlőhöz, a vezérlő minden objektumhoz megjeleníthet egy értelmes nevet, és lekérheti a TimeZoneInfo felhasználó által kijelölt objektumot. Így nincs szükség sztring kinyerésére a gyűjtemény minden objektumához, hozzárendelni a sztringet egy olyan gyűjteményhez, amely viszont a vezérlő tulajdonságához DataSource
van rendelve, lekérni a felhasználó által kijelölt sztringet, majd ezzel a sztringgel kinyerni az általa leírt objektumot.
A kód fordítása
Ehhez a példához a következőre van szükség:
A következő névterek importálása:
System (C#-kódban)