Jedna událost pro více tlačítek a zjištění které tlačítko vyvolalo událost   zodpovězená otázka

VB.NET, WinForms

Jedna událost pro více tlačítek a zjištění které tlačítko vyvolalo událost? Pomůže někdo?

    Private Sub JedenKodProViceTlacitek_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click, Button4.Click, Button5.Click
        Dim KtereTlacitkobyloPouzito As String
        KtereTlacitkoByloPouzito = "xxxxxx"
        MessageBox.Show(KtereTlacitkobyloPouzito)
    End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět
Private Sub Buttons_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
  If sender Is Button1 Then
    'Stisknuto tlačítko Button1
  ElseIf sender Is Button2 Then
    'Stisknuto tlačítko Button2
  ElseIf sender Is Button3 Then
    'Stisknuto tlačítko Button3
  End If
End Sub

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

jj dík za pomoc, ale dneska ráno po řádném odpočinku jsem problémek vyřešil, zde je kod.

Jde o to, že mám 12 Pictureboxů a přetahuji do nich obrázky z adresáře a takhle dopadl můj kod. Vše funguje tak jak jsem chtěl.

  Private Sub pDragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) _
    Handles pb1.DragEnter, pb2.DragEnter, pb3.DragEnter, pb4.DragEnter, pb5.DragEnter, pb6.DragEnter _
    , pb7.DragEnter, pb8.DragEnter, pb9.DragEnter, pb10.DragEnter, pb11.DragEnter, pb12.DragEnter
        If (e.Data.GetDataPresent(DataFormats.FileDrop)) Then : e.Effect = DragDropEffects.Copy : End If
    End Sub

    Private Sub pDragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) _
 Handles pb1.DragDrop, pb2.DragDrop, pb3.DragDrop, pb4.DragDrop, pb5.DragDrop, pb6.DragDrop, pb7.DragDrop, pb8.DragDrop, pb9.DragDrop _
 , pb10.DragDrop, pb11.DragDrop, pb12.DragDrop

        VlozObrazekDoPB(sender, e)

        'If sender Is pb1 Then
        '    f(pb1, e)
        'End If

        'If sender Is pb2 Then
        '    f(pb2, e)
        'End If

        'If sender Is pb3 Then
        '    f(pb3, e)
        'End If

    End Sub

    Private Sub VlozObrazekDoPB(ByVal PBx As PictureBox, ByVal e As System.Windows.Forms.DragEventArgs)
        Try
            PBx.Image = Image.FromFile(CType(e.Data.GetData(DataFormats.FileDrop), Array).GetValue(0).ToString)
        Catch ex As Exception
            MessageBox.Show("Nastala chyba při vložení DragDrop")
        End Try
    End Sub

    Private Sub FRM_DragDrop_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        pb1.AllowDrop = True
        pb2.AllowDrop = True
        pb3.AllowDrop = True
        pb4.AllowDrop = True
        pb5.AllowDrop = True
        pb6.AllowDrop = True
        pb7.AllowDrop = True
        pb8.AllowDrop = True
        pb9.AllowDrop = True
        pb10.AllowDrop = True
        pb11.AllowDrop = True
        pb12.AllowDrop = True
    End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kód se dost zjednoduší a zpřehlední, pokud si potřebné Controly vytvoříte dynamicky, pak nemusíte otrocky vypisovat

...Handles pb1.DragDrop, pb2.DragDrop, pb3.DragDrop...

Několikrát se to tady již řešilo, zkuste pro inspiraci kouknout třeba na tuto diskusi: http://www.vbnet.cz/forumthread.aspx?id=...

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

To, které tlačítko bylo stistknuto (vyvolalo událost) je v proměnné sender. Jen je třeba ji přetypovat na Button.

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

Přetypovávat není třeba. Operátor Is přímo zjišťuje zda-li se jedná o referenci na stejný objekt.

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

No to možná jo, ale stejný handler pro víc komponent se typicky používá v případě, že s nima chce člověk udělat stejnou věc. Je otázkou, jak moc je užitečné mít sice 1 handler, ale v něm 3 odlišné větve pro 3 komponenty.

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

Dotaz zněl jak rozlišit které tlačítko bylo stisknuto, tudíž je vysoká pravděpodobnost, že autor chce provádět různé věci v závislosti na stisknutém tlačítku. Pro někoho to může být přehlednější než 3 metody.

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

No a to je třeba i můj případ. Mám devět tlačítek, které po stisku zjišťují někde něco. U sedmi z těch tlačítek je kód prakticky identický, jen u dvou je trochu jiný. V současné době to řeším pro každý button extra a je to šílené, takže výše porazená metoda je mi užitečná. Ale stejně neumím dořešit následující.

Mám pod sebou dva Buttony EDSbutton a SWSbutton (třeba, rád používám i v příkladech něco popisného než but1 a but2 atd.).

A vedle nich jsou dva TextBoxy EDStext a SWStext.

Pokud zmáčknu EDSbutton, chci, aby se výsledek zapsal do EDStext. Ale to EDStext bych chtěl "vytvořit" dynamicky. Tzn. ne pomocí Case Select, např., ale prostě jakoby dynamicky vytvořit název toho textboxu, do kterého chci výsledek zapsat.

Public Class Form1
    
    Dim prefixy() As String = {"EDS", "SWS"}
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For i As Integer = 0 To 1
            Dim but As New Button
            Dim txtbox As New TextBox

            but.Name = prefixy(i) & "button"
            txtbox.Name = prefixy(i) & "text"

            but.Text = prefixy(i)
            txtbox.Text = prefixy(i)

            but.Location = New Point(20, 20 + i * 25)
            txtbox.Location = New Point(73, 20 + i * 25)

            but.Size = New Size(50, 23)
            txtbox.Size = New Size(220, 23)

            Me.Controls.Add(but)
            Me.Controls.Add(txtbox)
            AddHandler but.Click, AddressOf VsechnyButtony_click
        Next
    End Sub
    Private Sub VsechnyButtony_click(ByVal sender As Object, ByVal e As EventArgs)
        ZapisHodnotu(sender.name, "Tohle je " & sender.name & " odpovídající textbox")
    End Sub
    Private Sub ZapisHodnotu(ByVal DoJakehoTextboxu As String, ByVal CoMamZapsat As String)
        DoJakehoTextboxu = DoJakehoTextboxu.ToString.Substring(0, 3) & "text"
        For Each Obj As Control In Me.Controls
            If Obj.Name = DoJakehoTextboxu Then
                Obj.Text = CoMamZapsat
            Else
                Obj.Text = ""
            End If
        Next
        REM

    End Sub
End Class

Opravdu neexistuje způsob, jak dynamicky vytvořit odkaz na ten TextBox z té hodnoty sender.name? To musím kvůli tomu procházet celou kolekci a vybírat to pomocí podmínky? Ono při dvou prvcích dynamicky generovaných se to může zdát zbytečné, ale představte si, kdy chci takhle obsluhovat třeba 30 tlačítek a k nim příslušné textboxy.

Děkuji za nakopnutí správným směrem.

PV

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

Nehledáte http://msdn.microsoft.com/en-us/library/... ?

Použije se to

kontejner.Controls.Find("jméno",true);

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

Ano, to je přesně ono a dokonce nějaká funkcionalita navíc, děkuji uctivě. Musím se naučit lépe hledat.

PV

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

Tlačítko, které bylo stisknuto, zjistíte přetypováním parametru sender na typ Button:

Dim stisknuteTlacitko As Button = CType(sender, Button)

sender je parametr, který procedura události dostane při svém vyvolání, a reprezentuje komponentu, která událost vyvolala.

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