Pořadí událostí   zodpovězená otázka

VB.NET, WinForms

Dobrý den,

potřeboval bych vyřešit provedení událostí v jiném pořadí.

Jedná se mi o události:

- MouseDown

- ListView.ItemSelectionChanged

potřebuji nejdříve vykonat proceduru pro událost ItemSelectionChanged a potom pro MouseDown.

funkce má být taková, že po kliknutí pr.tl.myši se má nejdříve provést procedura ItemSelectionChange a potom další požadovaná procedura (zobrazení detailů vybraného řádku LV)

Nemáte prosím někdo nějaký typ ?

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

A čím se ItemSelectionChange vyvolá? Myší? Vezměte vejce a ukažte na slepici, která ho má snést.

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

Díky, že se mi snažíte napovědět, ale nejspíš bych potřeboval trknout :-)

nepřišel jsem stále na to, jak v události MouseDown zjistit z jakého řádku LV to bylo kliknuto, nebo jak vyvolat nejdříve změnu položky. V tu chvíli totiž je hodnota vybraného řádku stále ta původní.

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

A proč nepoužijete tu událost ItemSelectionChanged a cpete to do MouseDown?

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

Nebyla to nápověda, spíš kopanec, abyste si uvědomil nesmyslnost požadavku: "potřebuji nejdříve vykonat proceduru pro událost ItemSelectionChanged a potom pro MouseDown"

Promiňte ironii, teď bez ní:

Chcete-li měnit vybranou položku myší, musí být vyvolána událost myši, teprve potom změna vybrané položky LV. Jak by LV dostal informaci, že má vybrat položku, na kterou bylo klepnuto myší, aniž by myš nejprve vyvolala událost?

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

Rozumím, že logika postupu je jak zmiňujete. Pořadí událostí je danné. Nešlo mi o to otočit sled událostí, ale jak si s tím poradit.

Patrně je cesta jak píše p.Linhart, nicméně tady si nevím rady jak v události ItemSelectionChanged zjistit jestli ta událost byla vyvolána pr.tl.myši. Proto jsem chtěl zkombinovat událost MouseDown, ze které bych zjistil jestli se jednalo o pr.tl.myši.

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

A k čemu to potřebujete vědět? Událost ItemSelectionChanged informuje o změně vybraných položek. Je jedno jestli změna byla provedena myší nebo klávesnicí, z uživatelského hlediska někdo k ovládání používá myš, jiný klávesnici.

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

Protože pomocí Right Click myši vyvolávám svoji požadovanou fci.

V tomto případě tedy zobrazení detailů řádku LV.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
Private Sub ListView1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseDown
  'Akceptovat pouze pravé tlačítko myši.
  If e.Button <> Windows.Forms.MouseButtons.Right Then Return
  'Získat položku na aktuální souřadnici
  'kurzoru myši.
  Dim selectedItem = ListView1.GetItemAt(e.X, e.Y)
  'Pokud byla položka na aktuální souřadnici
  'kurzoru myši nalezena...
  If selectedItem IsNot Nothing Then
    '...provést něco s vybranou položkou.
  End If
End Sub

Všeho všudy 3 řádky kódu...

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

Váš návrh aplikace je tady bohužel špatný. Musíte vycházet z toho, co framework a jeho komponenty nabízí. Prvek ListView je navržen tak, aby nejdřív informoval o kliknutí a až potom o akci, kterou to vyvolá.

Určitě tak můžete vaši aplikaci předělat. Ono nic jiného ani nezbývá.

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

Nakonec jsem přeci jenom řešení našel.

Přikládám ukázku kódu (přepisoval jsem to z C#)

Public Class Form1

    Dim rightClick As Boolean
    Dim frmDetail As FormDetail


    Private Sub ListView1_ItemSelectionChanged(ByVal sender As Object, ByVal e As ListViewItemSelectionChangedEventArgs) _
      Handles ListView1.ItemSelectionChanged
        If ListView1.SelectedItems.Count = 1 Then
            ' neco
        End If

        If frmDetail IsNot Nothing Then
            If ListView1.SelectedItems.Count = 1 Then
                Dim mujObjekt As New MujObjekt()
                Dim n As Integer = CInt(ListView1.SelectedIndices(0)) + 1
                Dim lviEdit As ListViewItem = ListView1.SelectedItems(0)
                mujObjekt = DirectCast(lviEdit.Tag, MujObjekt)
                frmDetail.Update(mujObjekt, n)
            End If
        End If
    End Sub

    Private Sub ListView1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseDown
        If e.Button = MouseButtons.Right Then
            rightClick = True
            ListView1RightClick()
        Else
            rightClick = False
            If frmDetail IsNot Nothing Then
                frmDetail.Close()
            End If
        End If
    End Sub

    Private Sub ListView1RightClick()
        If rightClick Then
            If frmDetail IsNot Nothing Then
                frmDetail.Close()
            End If

            Dim n As Integer = 0
            Dim mujObjekt As New MujObjekt()
            If ListView1.SelectedItems.Count = 1 Then
                n = CInt(ListView1.SelectedIndices(0)) + 1
                Dim lviEdit As ListViewItem = ListView1.SelectedItems(0)
                mujObjekt = DirectCast(lviEdit.Tag, MujObjekt)
            End If

            frmDetail = New FormDetail(mujObjekt, n)
            frmDetail.Show()
        Else
            If frmDetail IsNot Nothing Then
                frmDetail.Close()
            End If
        End If
    End Sub


End Class

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

Že si v MouseDown zapíšete tlačítko myši je pokrok. Ostatnímu nerozumím. K čemu máte ListView s jednou položkou?

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

Zápis stavu tlačítka myši je v podstatě možné vynechat. Dalo by se to vložit přímo do procedury MouseDown.

Při každém kliknutí pr.tl.myši na řádek LV se provede zobrazení formu pro detail řádku. Problém byl se získanou hodnotou pro detail po tom, když dojde k přesunu na jiný řádek, ale tento byl vybrán právě pouze pr.tl.myši. V tu chvíli jsem totiž ještě neměl aktualizovanou hodnotu v ListView.SelectedItems. Otevření formu proběhlo před procedurou ItemSelectionChanged.

Řešením je následný updatu hodnot formu po proběhnutí ItemSelectionChanged.

Jinak LV samozřejmě není pouze s jednou položkou, nevím podle čeho tak usuzujete.

Každpodáně díky za všechny odpovědi.

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

Skutečně jsem se v kódu neorientoval a navíc jsem u Items.Count přehlédl, že jde o Selected - omlouvám se.

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