DialogResult reaguje az napodruhe   otázka

VB.NET, Komponenty, .NET

Ahoj. Tento kód vyhodnocuje formulář a zavírá jej. Ověření chyby funguje. ale poslední IF proběhne až na drué kliknutí na tlačítko. Zkoušel jsem přidat za nastavení DialogResultu příkaz Me.close(), ale ten formulář zavře, bez toho, aniž by proběhlo zpracování v nadřazeném formuláři. Bohužel se mi nepodařilo nikde najít řešení.

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim chyba As Boolean = False
        Dim msg As String = "chyba"
        Dim pocet_polozek As Integer = polozky.Items.Count


        For i As Integer = 0 To pocet_polozek - 1
            If polozky.Items(i).BackColor = Drawing.Color.LightGray Then
                msg = "Chybová hláška"
                chyba = True
            End If
        Next

        If chyba = True Then
            MsgBox(msg)
        Else
            Button1.DialogResult = DialogResult.OK
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            'incicializace polí atd
            '...
            '...


            'zpracovani
            If instance_formulare.ShowDialog() = DialogResult.OK Then
                MsgBox("zpracovani formulare")
            End If
    End Sub

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

V prvé řadě používáte DialogResult na něco, k čemu vůbec není určen.

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

vycházel jsem z článku na tomto serveru, kde byl naprosto stejně použit

http://vbnet.cz/clanek--34-vb_net_od_zac...

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

V tom případě jste nepochopil funkci DialogResultu.

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

Je to možné, ale domnívám se, že způsob použití je totožný s příkladem v článku.

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

DialogResult se nepoužívá ke zjištění, zda-li došlo k chybě, ale ke zjištění, jakou akci uživatel s formulářem provedl. Předělejte to, například můžete přidat read-only vlastnost Errors typu Boolean.

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

Přesně tak, DialogResult se typicky používá u dialogových oken, kde máte tlačítka Ano, Ne, OK, Cancel atd. V nich nastavíte různé dialog resulty a z okna, které dialog vyvolalo, pak DialogResult přečtete a zjistíte, jestli akci uživatel povolil nebo zamítnul atd.

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

děkuji za odpovědi, přepsal jsem to jiným způsobem a už to funguje

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

Všimnul jsem si, že DialogResult nastavuje tlačítku a nikoliv formuláři. Zkuste jej nastavovat přímo formuláři:

Me.DialogResult = DialogResult.OK

Jinak na použití DialogResult nevidím problém, pokud tím dáváte najevo, že byl formulář ukončen klepnutím na tlačítko akce potvrzující uložení / změnu. Validaci přes nastavením této hodnoty je tak také v pořádku.

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

To že se DialogResult nastavuje tlačítkům je normální postup. Pokud budete mít na formuláři např. OK a Storno, stačí v návrhovém režimu nastavit DialogResult těmto dvěma tlačítkům a příslušná hodnota se vrátí v metodě ShowModal. Rovněž není nutné ošetřovat zavření formuláře při stisknutí tlačítek u kterých je nastaven DialogResult.

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

To ano. Ale takto to chcete udělat, pokud ty tlačítka mají funkci uzavření formuláře a nastavení DialogResult formuláře vždy. V tomto případě jde o validaci uvnitř toho potvrzovacího tlačítka a nechceme tak nastavovat DialogResult stisknutému tlačítku, ale přímo formuláři, aby se rovnou uzavřet a nastavil výsledek. Díky tomu, že se hodnota nastaví tlačítku, tak při prvním stisknu se pouze tlačítko aktivuje jako potvrzovací a až při druhém se takto použije.

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

To nějak nechápu. Pokud chci na formuláři tlačítka typu DialogResult, nastavím jim ho už v návrhovém režimu a tyto tlačítka pak mají jasný význam a funkci a není třeba DialogResult měnit za běhu.

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

To je jistě jeden postup. Představte si, že ale data validujete a nechcete dovolit uzavření dokud nejsou pole na formuláři validní. V tom případě se potvrzení formuláře a jeho uzavření řídí nějakou rozhodovací logikou. Takže DialogResult nenastavíte tlačítku při návrhu, ale až za běhu v události kliknutí na tlačítko přímo formuláři, pokud je validace v pořádku. Pokud není, formuláři nic nenastavíte a ten se tam sám automaticky neukončí. Pokud nastavíte hodnotu formuláři z kódu, sám se uzavře a hodnota DialogResult je pak dostupná jako veřejná vlastnost.

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

No tak potom snad u příslušných ovládacích prvků zajistím kontrolu platnosti dat v události Validating a pokud data nebudou validní, nastavím e.Cancel = True a je to. Vlastnost DialogResult se v žádném případě nenastavuje za běhu.

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

Zajímalo by mě, kde jste na to zase přišel. DialogResult na formuláři se za běhu nastavuje zcela běžně, pokud chceme najednou nastavit DialogResult a ukončit formulář uzavřít.

Viz MSDN: "If the form is displayed as a dialog box, setting this property with a value from the DialogResult enumeration sets the value of the dialog box result for the form, hides the modal dialog box, and returns control to the calling form."

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

Mě ale nezajímá co je napsáno v MSDN, ale jak se to používá v praxi. A v praxi to nastavovat za běhu je naprosto zbytečné a bezúčelné.

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

Nejen já to v projektech používám zcela běžně, jinak bych to tu nepsal. To že jste nenarazil na použití, kvůli kterému je tato funkce dostupná ještě neznamená, že se v praxi nepoužívá. Dál je tahle diskuse zbytečná, nechci se bavit o tom, jestli si myslíte, že se to používá nebo ne.

K čemu to je a jak se toho dá využít jsem již popsal.

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