Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#] Complete Panel "Clickable"

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een C# Project waarin ik in runtime panels aanmaak met daarin labels en een picturebox. De panels krijgen een click event handler toegewezen.

Alles werkt helemaal goed, zodra ik op het panel klik, doet hij wat hij moet doen. Maar zodra een andere control aangeklikt wordt (dus één van de labels of de picturebox), werkt de click handler van de panel niet.

Is er een manier om het "hele" panel clickable te maken (dus ook zodra je op een label klikt, die in het panel zit)? Of moet ik aan elke control dezelfde click event handler toewijzen?

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Aan alle sub-controls op het panel een Click eventhandler hangen dmv een loop?

  • Spiral
  • Registratie: December 2005
  • Niet online
Het hangt van de functionaliteit van de labels en pictureboxes af. Zijn deze niet uitgebreid dan zou ik al deze controls aan hetzelfde event hangen en d.m.v. het object Sender het control identificeren.

To say of what is that it is not, or of what is not that it is, is false, while to say of what is that it is, and of what is not that it is not, is true. | Aristoteles


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 19-11 19:37
Gewoon zo:

C#:
1
foreach (Control c in panel.Controls) c.Click += new EventHandler(clickEvent);

Verwijderd

Topicstarter
Duidelijke taal :)
Thanks voor de input, gaat wel lukken zo.

  • Storme
  • Registratie: December 2004
  • Laatst online: 18-06 16:41
Mastermind schreef op dinsdag 12 februari 2008 @ 12:47:
Gewoon zo:

C#:
1
foreach (Control c in panel.Controls) c.Click += new EventHandler(clickEvent);
Indien je in je panel nog eens container controls hebt (zoals ander panels) met daarin controls ga je recursief moeten gaan werken.

  • Spiral
  • Registratie: December 2005
  • Niet online
Mastermind schreef op dinsdag 12 februari 2008 @ 12:47:
Gewoon zo:

C#:
1
foreach (Control c in panel.Controls) c.Click += new EventHandler(clickEvent);
offtopic:
Denk hierbij aan dat het PANEL zelf met deze regel code niet geregistreerd wordt bij het Click event.

[ Voor 4% gewijzigd door Spiral op 12-02-2008 13:50 ]

To say of what is that it is not, or of what is not that it is, is false, while to say of what is that it is, and of what is not that it is not, is true. | Aristoteles


  • PaulZ
  • Registratie: Augustus 2004
  • Laatst online: 21-05-2024
Hier ben ik ook al een tijdje mee bezig geweest, maar heb het een tijdje in de ijskast gezet, tot dit topic opdook.
Ik kan alles gewoon met het handje toevoegen in de code (VB.Net trouwens), maar ik kan het ook dynamisch doen. Wat ik voor ogen heb is om het click-event van een label aan het click-event van het parent-panel toe te wijzen via een addhandler (zoals je dat ook handmatig kan doen).
Nou is alleen nergens goed te vinden hoe je nou aan het adres van de procedure behorend bij het click-event van het panel komt. Ben al aan het stoeien geweest met delegates, eventhandlerlist, eventdescriptors etc. en het wordt niet écht duidelijk. Ook op internet en de help word je niet écht wijzer, want er zijn óf helemaal geen voorbeelden of iets compleet anders. Iemand een kleine hint hoe ik verder kan? Of is dit helemaal niet te doen?

Vlinders moet je volgen, niet vangen...


  • Spiral
  • Registratie: December 2005
  • Niet online
Ik begrijp zo niet wat je met adres bedoeld, maar ik neem gemakshalve bedoeld dat je wilt weten welk control het event getriggerd heeft.

code:
1
2
IF(TypeOf (Sender) Is Label)
IF(TypeOf (Sender) Is Panel)

To say of what is that it is not, or of what is not that it is, is false, while to say of what is that it is, and of what is not that it is not, is true. | Aristoteles


  • PaulZ
  • Registratie: Augustus 2004
  • Laatst online: 21-05-2024
Nee, dat dus niet. Ik ben dus helaas niet echt duidelijk geweest.

Procedure PNL_CLICK wordt uitgevoerd bij een PNL.Click() event

Nu wil ik deze procedure ook aan het Click-event van de labels in dat panel hangen. Dat kan gewoon door die procedure met het handje aan het Label.Click event te hangen (makkelijke manier). Maar ik dacht dat dit misschien ook dynamisch kon omdat dit het onderhoud vergemakkelijkt.
Wat ik dus wil is voor alle labels een click-event toewijzen dat naar dezelfde procedure verwijst als die van het PNL-Click event.
Dat kan met een addhandler, maar daar heb je dus een adres voor nodig van de procedure. En naar dát adres ben ik op zoek.

Vlinders moet je volgen, niet vangen...


  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Wat bedoel je met adres van de procedure? Je kunt gewoon recursief over alle controls binnen het panel itereren en daar hetzelfde click event aanhangen.

https://niels.nu


  • PaulZ
  • Registratie: Augustus 2004
  • Laatst online: 21-05-2024
Wil je met een AddHandler een procedure toevoegen aan een event, dan is moet je toevoegen
code:
1
AddHandler Label.Click, [b]AddressOf[/b] PNLClickProcedure

Op zich lukt t me wel om alle panels en onderliggende labels af te lopen, maar het is nergens duidelijk hoe ik aan de procedure kom die aan het click-event van het panel hangt.
Ben gisteren lang aan het zoeken geweest, maar ik geef 't maar op denk ik.

Vlinders moet je volgen, niet vangen...


Verwijderd

Topicstarter
Ik verwijs met mijn labels en picturebox naar dezelfde eventhandler als de panel-click-handler. Dat ziet er bij mij ongeveer zo uit:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Panel myPanel = new Panel();
myPanel.Location = new Point(0,0);
myPanel.Width = 200;
myPanel.Height = 100;
myPanel.MouseClick += new MouseEventHandler(MouseClickHandler);

Label myLabel = new Label();
myLabel.Text = "Test";
myLabel.Location = new Point(0,0);
myLabel.MouseClick += new MouseEventHandler(MouseClickHandler);

Label myLabel2 = new Label();
myLabel2.Text = "Test2";
myLabel2.Location = new Point(0,20);
myLabel2.MouseClick += new MouseEventHandler(MouseClickHandler);

myPanel.Controls.Add(myLabel);
myPanel.Controls.Add(myLabel2);

Form1.Controls.Add(myPanel);


en verderop:
C#:
1
2
3
4
void MouseClickHandler(object sender, MouseEventArgs e)
{
    MessageBox.Show("Clicked");
}


In mijn clickhandler kijk ik overigens wel op welk panel is geklikt (sender), als er op een label of picturebox is geklikt, moet ik vervolgens de parent bekijken. Works like a charm :)

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Verwijderd schreef op woensdag 13 februari 2008 @ 12:01:
Ik verwijs met mijn labels en picturebox naar dezelfde eventhandler als de panel-click-handler. Dat ziet er bij mij ongeveer zo uit:
Ja, dat is hoe de gegenereerde code eruit ziet als je dat via de GUI doet. Maar hij wil dus niet elke control met de hand aan die handler hangen, dus dan itereer je gewoon recursief over alle controls in de control collection van die panel.

https://niels.nu


  • PaulZ
  • Registratie: Augustus 2004
  • Laatst online: 21-05-2024
En daarnaast zit ik in VB.Net te klooien, dus dat werkt dan weer net ff anders dan C++ :p

Vlinders moet je volgen, niet vangen...


  • Spiral
  • Registratie: December 2005
  • Niet online
Op zich lukt t me wel om alle panels en onderliggende labels af te lopen, maar het is nergens duidelijk hoe ik aan de procedure kom die aan het click-event van het panel hangt.
Ben gisteren lang aan het zoeken geweest, maar ik geef 't maar op denk ik.
In C# ziet het als volgt eruit. De procedure is de procedure die jezelf hebt aangemaakt. In dit geval Geklikt.

C#:
1
2
3
4
5
6
7
8
9
10
public void MakeHandles(Panel p)
{
    foreach(Control c in p.Controls)
         c.<eventyouwant> += new EventHandler(Geklikt);
}

private void Geklikt(object sender, EventArgs e)
{
    Console.WriteLine("Handled");
}

To say of what is that it is not, or of what is not that it is, is false, while to say of what is that it is, and of what is not that it is not, is true. | Aristoteles


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 19-11 19:37
PaulZ schreef op woensdag 13 februari 2008 @ 11:18:
Wil je met een AddHandler een procedure toevoegen aan een event, dan is moet je toevoegen
code:
1
AddHandler Label.Click, [b]AddressOf[/b] PNLClickProcedure

Op zich lukt t me wel om alle panels en onderliggende labels af te lopen, maar het is nergens duidelijk hoe ik aan de procedure kom die aan het click-event van het panel hangt.
Ben gisteren lang aan het zoeken geweest, maar ik geef 't maar op denk ik.
C#:
1
2
3
4
5
6
7
8
9
button1.Click += new EventHandler(button1_Click); // Voeg event to aan button
// Wil je button2 nu naar dezelfde event als button1 verwijzen:
EventHandler theEvent = button1.Click;
button2.Click += theEvent;

// Als je het via de Methodenaam wilt doen:
System.Reflection.MethodInfo methodInfo = theEvent.Method;
string methodNameOfButton1Event = methodInfo.Name;
button2.Click += new EventHandler(methodNameOfButton1Event)

  • PaulZ
  • Registratie: Augustus 2004
  • Laatst online: 21-05-2024
Bedankt :) , ik ga eens kijken wat voor VB-equivalenten hiervoor beschikbaar zijn...

Vlinders moet je volgen, niet vangen...

Pagina: 1