RadioBox, ComboBox - User Modified?   zodpovězená otázka

VB.NET, WinForms

Zdravím,

volně navazuji na toto téma:

http://vbnet.cz/forum-tema--4204-ud_225_...

Potřeboval bych udělat stejnou funkci i u RadioBoxu a SelectBoxu, ale u nich vlastnost modified chybí.

Díky

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

Zrovna u RadioButtonu je to zcela zbytečné a u ComboBoxu to lze v případě potřeby dopsat.

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

Není, při načtení formuláře mi to vždy vyhodí event RadioButton1_CheckedChanged. A to mi jaksi kazí plány. Samozřejmě můžu místo zachytávat událost click, ale myslel jsem že je lepší řešení.

Děkuji

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

Jestliže nastává událost CheckedChanged, pak byla hodnota RadioButtonu změněna programově, nebo uživatelem - a to je špatně. Je potřeba řešit příčinu problému a ne hovadiny.

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

Tak ted nevim jestli neco delam spatne:

Proste vytvorim novy formular, do neho dam jeden prvek - radioBox. Vlastnost checked dam na true. Do kodu dam:


    Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged
        MsgBox("Hej")
    End Sub

Kdyz spustim aplikaci jeste pred zobrazenim formulare mi vyhodi msgBox, moje osobni teorie je, ze se napred vytvori radiobox a pak se do nej doplni hodnota true a to mi zavola vyse uvedenou udalost checkedChanged jeste pred tim nez se vubec nacte formular.

To ja ale samozrejme nechci...

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

Nastavení hodnoty RadioButtonu se děje v metodě InitializeComponent volané v konstruktoru formuláře, tedy v momentě, kdy formulář ještě není úplně inicializován. Proto nastává událost CheckedChanged. Předejít se tomu dá například testováním, zda-li je vytvořené handle formuláře:

Private Sub RadioButtons_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles RadioButton1.CheckedChanged
  If Me.IsHandleCreated Then
    MsgBox("Hej")
  End If
End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím,

bohužel zdá se že to nefunguje. MessageBox se pořád vypisuje.

Public Sub New()

        ' This call is required by the Windows Form Designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        MsgBox("loaded")
        loaded = True
    End Sub

Loaded se vypíše dříve než Hej takže v době eventu už je asi formulář načten...

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

Vy jste to evidentně nepochopil. Testování handle má být v obslužné metodě události CheckedChanged - vyzkoušeno, funguje.

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

Ale pochopil...

    Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged
        If Me.IsHandleCreated Then
            MsgBox("hej")
        End If
    End Sub

Mám to přesně tak jak jste napsal a přesto se při spuštění formuláře ukáže message box. Mám Visual Studio 2008 Express, nevím jak Vy.

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

K čemu jako mají sloužit řádky "MsgBox("loaded")" a "loaded = True"?

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

To byl pouze test toho jestli se napred provede InitializeComponent nebo událost checkedChanged... a napred se vypsalo loaded a pak teprve hej. Tzn. ze handle uz je vytvoren a nema cenu ho testovat.

Omlouvám se, neměl jsem to postovat... akorát jsem téma zamotal. Pro jistotu jsem udělal ještě jeden test s prázdným projektem a pouze Vaším kódem a docházím pořád ke stejným výsledkům.

Ale nechapu jaktoze me to nefunguje a vam ano.

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

Přestańte se prosím zabývat věcmi, které nejste schopen pochopit a používejte IsHandleCreated jako by to bylo Modified.

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

Nemluvte se mnou jako s pitomcem. Udělal jsem to a NEFUNGUJE TO.

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

Co používáte přesně za systém a jakou přesně verzi Frameworku a Studia?

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

Je to Windows7 Professional (64bit), Net Framework 3.5 a Visual Studio 2008 Express.

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

Pošlete sem celý kód formuláře v tom jednoduchém testovacím projektu.

InitializeComponent je volána z konstruktoru, který se spouští při vytváření instance třídy formuláře, tedy ještě před samotným zobrazením okna. V této metodě se vytvoří všechny komponenty, nastaví se jejich vlastnosti a event handlery.

Kód metody InitializeComponent je vygenerován Visual Studiem a je v souboru Form1.designer.cs. Podívejte se tam, ať víte, jak to funguje. VS se to před začátečníky snaží skrýt.

Ale jinak tento soubor neměňte, VS by vám ho při nejbližší příležitosti přepsalo.

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