Dotaz ohledně datumu   otázka

VB.NET, WinForms

Zdravíčko.

1. Zajímala by mě určitá věc ohledně datumu. Možná má na to VB.NET mnoho užitečných funkcí, ale já je bohužel určitě neznám.

V aplikaci mám dva Comboboxy. První obsahuje seznam měsíců a druhý obsahuje seznam roků (2009-2019)

Co se týče počtu dní každého měsíce, to je "pro mě a mé znalosti" jednoduše vyřešitelné podmínkou, protože každý měsíc má přesně daný počet dnů.....kromě únoru.

Samozřejmě v takto krátkém seznamu roků mohu udělat další podmínku, kdy při únoru toho a toho roku bude koncový den 29 else 28.

Ale spíš by mě zajímalo, zda jsou na toto nějaké užitečné funkce.

Nějaký zajímavý zdroj, protože jsem teprve na začátku tvorby aplikace a v průběhu budu řešit další složitější věci.

např.

V aplikaci má uživatel na výběr zadat buďto konkrétní měsíc(combobox) a rok (combobox) a nebo se přepne do druhé záložky (tabcontrol) kde zadá (ze dvou monthcalendarů) počáteční a koncové datum.

Na základě tohoto výběru se nače do (ListView) obsah jednoduchých textových souborů. Jako v jednom díle seriálu "vb.net od začátku" s rozdílem, že každý řádek bude jeden textový soubor a v každém sloupci bude určitá část textového souboru (to zvládnu, jednoduché)

Textové soubory generuji jinou aplikací a jsou ukládány ve formátu rrrr_mm_dd-21_59.txt nebo rrrr_mm_dd-13_59.txt či vygenerován operátorem v kterýkoliv čas pak je formát rrrr_mm_dd-hh_mm_temp.txt

Ale toto jen na okraj a pro orientaci.

2. dotaz: čirou náhodou nevíte kod pro určení který TabPage uživatel zrovna vybral? Tzn. která část kodu po zmačknutí tlačítka mimo TabControl bude probíhat? Něco na způsob:

if tabcontrol1.tabpage1.selected = true then ....

jenže tato možnost bohužel není a na po hodinovém hledání na MSDN nejsem o moc chytřejší a řešit to přes eventy mi přijde jako nej nej poslední možnost

Předem děkuji všem, co mi pomohou při vývoji této interní firemní aplikace.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

add 1]

    System.DateTime.DaysInMonth(Rok, Mesic)

Pro praci s datumem a casem se podivejte na tridu DateTime a jeji metody.

add2]

Napriklad takto:

if (tabControl1.SelectedTab.Name == "Tab1") return;

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Hm DaysInMonth-užitečná funkce. Já používám řešení viz. níže ale tohle je více čisté. To se bude hodit:)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den, k prvnímu dotazu s datem:

Poslední den února zjistíte velice jednoduše. Vždy si vezmete datum 1.3. v daném roce a odečtete od něj jeden den. Tak máte záruku že se Vám vždy vrátí správný počet dnů. Nastavovat cokoliv natvrdo je nesmysl a zaděláváte si akorát na spoustu problémů v budoucnu. Řešení by mělo být vždy univerzální.

Mohlo by to vypadat např. takto:

        Dim nejakeDatum As Date
        Dim posledniDen As Integer


        nejakeDatum = "1.3.2014"

        posledniDen = nejakeDatum.Date.AddDays(-1).Day



        MsgBox("Počet dní: " & posledniDen)

Funkce Date.AddDays odečte jeden den (-1) a to Day na konci Vám vrátí aktuální den po odečtení (v tomto případě 28).

Velmi užitečná funkce.

K Vašemu druhému dotaz:

Nevím zda jsem to dobře pochopil, potřebujete zjistit která tabPage z tabControlu je zrovna aktivní?

Pokud ano tak to zjistíte přes vlastnost SelectedIndex

MsgBox(Me.TabControl01.SelectedIndex)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji. Vyzkouším.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak půlka programu už je hotová. Pro aktuálně vybraný měsíc a rok mi to projde všechny dny a vyhledá všechny dostupné soubory k tomu dnu a vypíše.

Problém mi vyvstal v druhé půlce, kdy uživatel bude vybírat ze dvou datumů.

Chci omezit vypisování pouze na datumy v jednom roce.

Tzn. třeba od 1.1.2010 do 31.7.2010

Zároveň upravuji druhý DatetimePicker tak, aby nikdy konečný datum nebyl menší než počáteční

Bohužel se mi program zacyklí jakmile překliknu do následujícího roku.

Private Sub DateTimePicker2_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DateTimePicker2.ValueChanged
        If DateTimePicker2.Value < DateTimePicker1.Value Then
            DateTimePicker2.Value = DateTimePicker1.Value
        End If
        If DateTimePicker2.Value.Year <> DateTimePicker1.Value.Year Then
            MsgBox("Lze vypočítat pouze mezi dvěmi datumy ve stejném roce", MsgBoxStyle.OkOnly, "Omezení programu")
            DateTimePicker2.Value = DateTimePicker1.Value
            Exit Sub
        End If
    End Sub

    Private Sub DateTimePicker1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DateTimePicker1.ValueChanged
        If DateTimePicker2.Value < DateTimePicker1.Value Then
            DateTimePicker2.Value = DateTimePicker1.Value
        End If
    End Sub

Teď mě sice napadla jedna věc, druhý DateTimePicker vytvářet až za běhu vždy po změně datumu prvního DateTimePickeru druhý vymazat a nahradit novým s novým nastavením hodnot minimální a maximální datum. --- to by asi šlo že? Ale pokud lze udělat nějaký krok v ukázaném kousku kódu, byl bych taky rád.

Už jen pro to, že člověk pak vidí různé možnosti.

Předem děkuji.

PS: jen tak mimochodem jak je zhruba náročný následující dotaz(ta první část)

čtení několikabytového souboru je ok - když už existuje

                    If Not System.IO.File.Exists(CelaCesta3) Then
                    Else
                        Dim rr2 As New Cteni(CelaCesta3)
                        rr2.cist(soubor3.Substring(0, 10))
                        rr2.zavrit()
                    End If

Jde o to že tento krok proběhne pro každý den zhruba 1440x

Tak zda bych neměl hledat jinou možnost jak najít soubor, který "mohl" být v tom dni vygenerován jiným způsobem, než klasickým a to v přesně danou dobu dvakrát za den = jméno toho souboru je pak známé.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback