[C#] Usuwanie kontrolki / delgat

0

Witam :)

Bede wdzieczna za pomoc w problemie:

w C# na biezaco w trakcie trwania programu tworze sobie panele. ergo - nie wiem ile ich jest ergo - nie znam ich nazw.

        private void btnAdd_Click(object sender, EventArgs e)
        { <ble ble new panel... 
            this.Controls.Add(panel);
            panel.MouseClick += new MouseEventHandler(panel.Usun);
}

w klasie:

     public void Usun(object sender, MouseEventArgs e)
        {
            Controls.Remove(?);
        }

i nie wiem co mam wpisac w znak zapytania.. probowalam z this i na kilka innych sposobow, ale najwidoczniej umknal mi jakis wazny szczegol :P

bede wdzieczna za pomoc :)

PS. oczywiscie tam w Usun() bedzie jeszcze sprawdzanie czy jakis panel jest w ogole itd. ale to nie jest teraz wazne.

0

Ktory konkretnie panel chcesz usunac?

0

A jeśli wpiszesz "this" to co dokładnie się dzieje?
Sprawdź jakie argumenty pobiera funkcja Remove() (wpisz nazwę funkcji i otwórz nawias w VC#), to może okazać się pomocne.

..swoją drogą widzę tam pewną sprzeczność. W jednej linijce piszesz "new panel..." tak jakby był typem, a w drugiej podajesz "panel" jako argument funkcji. Jeszcze nigdy nie spotkałem się z podawaniem klasy jako argumentu.

0

my bad. podaje wiecej kodu. panel to instancja.

private void btnAdd_Click(object sender, EventArgs e)
        {
            MovablePanel panel = new MovablePanel();

            panel.Name = "panel" + i;
            panel.Width = (int)num11.Value;
            panel.Height = (int)num12.Value;
            panel.Location = new Point(10, 10);
            panel.BackColor = Color.DarkOrange;
            panel.BorderStyle = BorderStyle.FixedSingle;
            panel.MoveTarget = MoveTarget.Self;

            Label label = new Label();
            label.Parent = panel;
            label.Text = (int)num11.Value + " x " + (int)num12.Value;

            this.Controls.Add(panel);
            panel.Controls.Add(label);

            panel.MouseDoubleClick += new MouseEventHandler(panel.Odwroc);
            panel.MouseClick += new MouseEventHandler(panel.Usun);

            i++;                       

        }

przy czy, Odwroc() wywolywane w analogiczny sposob dziala bez zarzutu.

a Remove() z tego co widzialam dziala jak sie poda konkretna nazwe obiektu.. VC# podaje ze nalezy tam wpisac "Control value".
this nie robi nic.. ani bledu nie generuje ani nie dziala poprawnie. ale porbowalam tez dac osobny przycisk i wywolac zdarzenie, ze jak sie ten konkretny nacisnie to Controls.Remove(this) tez nie dziala. nie wiem czy nie odnosi sie wtedy do calej formatki?

0

Movable panel dziedziczy z panelu i rozni sie tylko tym ze mozna nim ruszac.

chce usuwac panel, na ktory sie kliknie myszka. (docelowo nie bedzie wywolywane przez MouseClick ale to nie jest teraz istotne).

0

Nie czytałem całości, ale jeśli chcesz

usuwac panel, na ktory sie kliknie myszka
to dodaj mu takie zdarzenie Click:

Control c = (Sender as Control);
c.Parent = null;
c.Dispose();

I wyczyść wszystkie dodatkowe referencje do tego panelu jakie przechowujesz (np. jak trzymasz te panele w jakiejś tablicy to je z niej usuwaj).

0

ha, dziala ;D

tylko, jesli bylbys tak mily i powiedzialby mi co to dokladnie robil albo odeslal na strone, gdzie wyjasniona jest skladnia (sender as Control) byloby super.

dzieki wielkie.

0

Sender to referencja na obiekt wywołujący zdarzenie. Domyślnie przekazywany jest on sam, więc jak klikniesz panel, to dostaniesz do niego referencję.

(Sender as Control) to po prostu rzutowanie typu Sender'a na typ Control.

0

Dodam, że każdy 'Sender' jest przekazywany jako 'System.Object' więc jest potrzeba rzutowania. Można było rzutować na 'Panel', ale wystarczy na 'Control', bo własność 'Parent' do której chcemy się dobrać jest zdefiniowana w klasie 'Control', po której 'Panel' dziedziczy.

Podpinaj pod każdy panel jedną i tą samą procedurę kliknięcia. Zawsze 'Sender'em będzie ten panel, na który kliknięto.

0

Dzieki, odpowiedz byla bardzo pomocna :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1