Jak seríově vytvořit obsluhu události s parametry?   otázka

VB.NET, WinForms

Dobrý den,

dělám úprogram který má spoustu pictureboxů (ictureboxi se vytváří v kódu a může jich být až 6400, ale to je celkem nepodstatné) a každému chci přidat obsluhu události, obsluze chci ale přidat parametry.

Mám toto:

Public Class myEventArgs
    Inherits EventArgs

    Public Property i As Integer
    Public Property u As Integer
End Class

Sub zavolejclick(ByVal sender As Object, ByVal e As myEventArgs)
        Dim i = e.i
        Dim u = e.u
        For ii = 0 To 79
            For uu = 0 To 79
                picturb(ii, uu).BorderStyle = BorderStyle.FixedSingle
            Next
        Next
        picturb(i, u).BorderStyle = BorderStyle.Fixed3D
    End Sub

For i = 0 To NumericUpDown1.Value - 1
            For u = 0 To NumericUpDown2.Value - 1
                picturb(i, u) = New PictureBox
                picturb(i, u).Width = 20
                picturb(i, u).Height = 20
                picturb(i, u).Top = 75 + (i * 21)
                picturb(i, u).Left = 3 + (u * 21)
                picturb(i, u).BorderStyle = BorderStyle.FixedSingle

                Dim argumenty As New myEventArgs
                argumenty.i = i
                argumenty.u = u

                AddHandler picturb(i, u).Click, AddressOf zavolejclick


                Me.Controls.Add(picturb(i, u))

            Next
        Next

Já potřebuji ale dostat ty argumenty s proměnnými i a u do toho éčka v metodě zavolejclick.

Dále mi toto nefunguje protože když kliknu na picturebox zobrazí se mi chyba:

Unable to cast object of type 'System.Windows.Forms.MouseEventArgs' to type 'muj_projekt.myEventArgs'.

Co to je za chybu, jak ji odstranit, jak předat ty parametry a jak to celé vyřeším?

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

Že na formuláři může být až 6 400 PictureBoxů problém je, a to velmi podstatný. Předělejte to například s použitím DataGridViewu, protože ve stávajícím stavu nemá cenu jakkoliv pokračovat a tudíž ani radit vám, jak vyřešit tento problém...

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

má cenu pokračovat jelikož to je takový krajní příklad běžně jich tam bude něcom kolem 25.

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

Nemáte pravdu. I 25 PictureBoxů je množství, které neospravedlní žádný argument. Pokud chcete zobrazovat větší množství obrázků, použijte k tomu určené, skrolovatelné ovládací prvky, jako např. výše zmiňovaný DataGridView. Řešil jsem stejnou problematiku již mnohokrát a mám s tím praktické zkušenosti. Pokud o tom nevíte nic, nehádejte se. Vaše řešení je špatné, a proto vám nic jiného poradit nemohu.

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

Ale já nechci ty obrázky zobrazovat! Já tam chci přidat Click a tomu clicku něco předat.

...
AddHandler picturb(i, u).Click, AddressOf zavolejclick
...

Vidíš tam to click.

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

Ještě jinak:

Na tomto kódu:

AddHandler picturb(i, u).Click, AddressOf zavolejclick

je při kliku na picturb(cislo, cislo) volána metoda zavolejclick jenže já te metodě potřebuji předat i a u jenže udělám-li to takhle:

AddHandler picturb(i, u).Click, AddressOf zavolejclick(i, u)

nefunguje to.

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

Zaprvé mi netykejte, husy jsem s vámi nepásl a za druhé mi řekněte důvod dvaceti pěti (nebo až 6 400) PictureBoxů na formuláři.

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

Mám to chápať tak, že potrebujete PictureBox na to, aby ste zachytili kliknutie? To je dosť blbé riešenie.

V tom prípade nastavte vo formulári Me.KeyPreview = True (aby zachytilo aj kliknutie na Control umiestený na formulári). Kliknutie na formulár pomocou myši vyvolá událosť MouseClick . V nej v argumente e máte popis, kde a ktorým tlačítkom myši nastalo kliknutie. X súradnica bude v e.X, Y v e.Y, spolu súradnice v e.Location . Ktorým tlačítkom uživateľ klikol bude v e.Button .

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

1)Do události nemôžete pridať vlastné parametre, ani zmeniť dátový typ akéhokoľvek argumentu události. Môžete však tieto hodnoty uložiť do PictureBox.Tag .

2)Také množstvo obrázkov ani podľa mňa nie je vhodné. Zvážte, či by sa nedalo spraviť jeden vlastný Control(trieda dediaca z System.Windows.Forms.Control, príp. System.Windows.Forms.UserControl, alebo inej), a v danej triede vložiť do handlera události .Paint vykresľovanie tých 6400 obrázkov pomocou e.Graphics.DrawImage( http://msdn.microsoft.com/en-us/library/... ). Bude to určite rýchlejšie, ako vykresľovanie jednotlivých PictureBoxov, a událosť .Click má dokonca aj System.Windows.Forms.Control

P.S.: Zaujímavá mi príde trieda System.Windows.Forms.ScrollableControl

http://msdn.microsoft.com/en-us/library/...

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

Já ale potřebuji v té jedné metodě zjistit který ten pictbox to byl a v té metodě mu budu měnit vlastnosti a tak se tam snažím dostat i a u.

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

Potom pretypujte argument sender na System.Windows.Forms.PictureBox . Každopádne, mať na formulári takýto počet PictureBoxov nie je vhodné, ako povedal p. Linhart.

nahlásit spamnahlásit spam 2 / 2 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