Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
1
2
3
4
5
6
| this.cmdClose.Click += new System.EventHandler(this.cmdClose_Click); private void cmdClose_Click(object sender, System.EventArgs e) { // do something } |
[ Voor 30% gewijzigd door Crazy D op 31-10-2006 11:53 ]
Exact expert nodig?
1
2
3
4
5
6
7
8
| button.Click += New EventHandler(button1_Click) ... private void button1_Click(object sender, System.EventArgs e) { MySpecialButton myButton = (MySpecialButton) sender; if (myButton.MyEvent != null) myButton.MyEvent(myButton.EventComando); } |
Dat EventComando is dan natuurlijk een property van je eigen Buttonclass definiëren
Is er geen ander manier om mijn event custom parameters mee te geven? via de EventArgs ofzo?
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Die dingen worden enkel doorgegeven als je event geraised wordt.
Ik denk dat je hier idd zult moeten subclassen van de Button class.
Maak dus je eigen Button class, die je overerft van de System.Windows.Forms.Button, en maak een property in uw eigen class, waarin je die variable set.
Bv, bij het creeëren van je button:
1
2
| MyButtonClass btn = new MyButtonClass(); btn.MyProperty = "bliep"; |
Maak ook je eigen eventhandler:
1
2
3
4
5
6
7
8
| public delegate void MyButtonClickEventHandler( object sender, MyButtonClickEventArgs e); public class MyButtonClickEventArgs : EventArgs { private string _name; public string Name { get { return _name; } } } |
In je overge-erfde Button class raise je dan jouw event:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| public class MyButtonClass : Button { ... private string _myProp; public string MyProperty { get { return _myProp; } set { _myProp = value; } } public event MyButtonClickEventHandler Click; protected void OnMyButtonClickEventHandler() { if( Click != null ) Click (this, new MyButtonClickEventArgs (_myProp)); } .... } } |
Je moet er dan wel nog voor zorgen dat je eigen Click event geraised wordt ipv dat je het 'gewone' click event raised van de System.Windows.Forms.Button class.
Misschien is het daarom gemakkelijker om een UserControl te maken ipv een 'Component'. Bij het maken van een UserControl maak je nl. gebruik van 'composition' ipv inheritance, en op die manier kan je gewoon in het click event van de button die op je user-control staat, je eigen click event raisen, en enkel uw eigen click event beschikbaar stellen aan de buitenwereld.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| public class MyButtonUserControl : UserControl { private Button button1; private string _name; ... public event MyButtonClickEventHandler Click; private void button1_Click( object sender, EventArgs e ) { OnMyButtonClick (new MyButtonClickEventArgs (_name)); } ... } |
[ Voor 23% gewijzigd door whoami op 31-10-2006 12:20 ]
https://fgheysels.github.io/
Ik weet niet of dit heel veel verschil maakt?
Ik heb de button gemaakt dmv Inheritance.Ik heb de originele Click event gehide dmv het new keyword.
Alleen als ik nu op de button klik gaat mijn toegewezen methode niet af.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
| public class MyButtonClickEventArgs : EventArgs { private string _name; public MyButtonClickEventArgs(string name) { this._name = name; } public string Name { get { return _name; } } } public delegate void HandleButtonClick(object o, MyButtonClickEventArgs e); public class MyButton : System.Web.UI.WebControls.Button { private string _imgName; public string ImgName { get { return _imgName; } set { _imgName = value; } } public new event HandleButtonClick Click; protected void OnMyButtonClickEventHandler() { if( Click != null ) Click (this, new MyButtonClickEventArgs (_imgName)); } } public class MyClass { private void MyMethod() { MyButton newButton = new MyButton(); newButton.ImgName = file.Name; newButton.Text = "Selecteer"; newButton.Click += new HandleButtonClick(ButtonClick); } private void ButtonClick(object sender, MyButtonClickEventArgs e) { Response.Write(e.ToString()); } } |
ik doe nog iets verkeerd blijkbaar.
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| public class MyButtonClickEventArgs : EventArgs { private string _name; public MyButtonClickEventArgs(string name) { this._name = name; } public string Name { get { return _name; } } } public class MyButton : System.Web.UI.WebControls.Button { public delegate void MyButtonClickEventHandler(object o, MyButtonClickEventArgs e); public event MyButtonClickEventHandler MyClick; // private Button button1; private string _imgName; public string ImgName { get { return _imgName; } set { _imgName = value; } } protected virtual void OnClick(object o, MyButtonClickEventArgs e) { if (MyClick != null) { MyClick(this,e); // Notify Subscribers } } private void MyButton_Click(object sender, System.EventArgs e) { OnClick(this,new MyButtonClickEventArgs (_imgName)); } } |
en in mijn aanroepende class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| private void MyMethod() { MyButton newButton = new MyButton(); newButton.UseSubmitBehavior = true; newButton.ImgName = file.Name; newButton.ID = "btn_" + file.Name; newButton.Text = "Selecteer"; newButton.MyClick += this.ButtonClicked; } private void ButtonClicked(object sender, MyButtonClickEventArgs e) { Response.Write(e.ToString()); } |
Op het moment dat ik de button klik wordt er geen enkel event getriggerd.
Ik krijg ook geen compile error ofzo. Doe ik nog iets fout?
ps: ik heb o.a naar deze link nog gekeken, samen met jullie tips:
http://www.akadia.com/services/dotnet_user_controls.html
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Edit:
Je gaat er in je code vanuit dat het Click event altijd de OnClick method aanroept. Dit is juist andersom. OnClick veroorzaakt over het algemeen een Click-event.
Je linkt precies verkeerd om. Wat je wilt (alsik het goed begrijp wat je vraag is:)
- User klikt op knop
- Click event van knop vuurt
- Je eigen button class vangt dit af
- Je eigen button class vuurt zijn eigen event
- Je applicatie vangt dit op
1
2
3
4
5
6
7
8
9
10
11
12
13
| in contstructor: base.click += new EventHandler(Button_Clicked); ... private void Button_Clicked(sender,e) { this.OnMyClick(sometext); } private void OnMyClick(string sometext) { eigen event aanroepen. } |
Edit:
Dubbel
[ Voor 77% gewijzigd door PhysicsRules op 31-10-2006 13:53 ]
In de code die je nu hebt, zal je ergens dit moeten doen:
1
2
3
4
5
6
| base.Click += new EventHandler(ButtonClick); private void ButtonClick( object sender, EventArgs e ) { OnClick(); } |
Maar ik zou eens kijken naar WebUserControls oid.
https://fgheysels.github.io/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| public delegate void MyDelegate( string param ); public class MyButton : Button { public event MyDelegate MyOwnClick; public MyButton() { Click += delegate{ OnMyOwnClick(); }; } public void OnMyOwnClick() { if( MyOwnClick != null ) MyOwnClick( Text ); } } |
[edit]
Ow kan voortaan beter even refreshen. Is een beetje hetzelfde als wat de 2 boven me zeggen alleen dan met anonymous delegate
[ Voor 12% gewijzigd door Woy op 31-10-2006 14:03 ]
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Ik moet hem idd nog aan de click event van mijn base classe toevoegen.
Ik ga me nog wat meer verdiepen in events en delegates want ik blijf dat toch moeilijke materie vinden.
hier even de code voor de zoekers:
De classes voor de EventArgs en Button
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| public class MyButtonClickEventArgs : EventArgs { private string _var; public MyButtonClickEventArgs(string var) { this._var = var; } public string Var { get { return _var; } } } public class MyButton : System.Web.UI.WebControls.Button { public delegate void MyButtonClickEventHandler(object o, MyButtonClickEventArgs e); public event MyButtonClickEventHandler MyClick; public MyButton() : base() { base.Click += new EventHandler(this_MyClick); } private string _var; public string Var { get { return _var; } set { _var= value; } } protected virtual void OnClick(object o, MyButtonClickEventArgs e) { if (MyClick != null) { MyClick(this,e); // Notify Subscribers } } private void this_MyClick(object sender, System.EventArgs e) { OnClick(this,new MyButtonClickEventArgs (_var)); } } |
en de aanroepende classe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| private void SomeMethod() { MyButton newButton = new MyButton(); newButton.UseSubmitBehavior = true; newButton.Var= "myString" newButton.Text = "Klik mij"; newButton.MyClick += new MyButton.MyButtonClickEventHandler(this.ButtonClicked); } private void ButtonClicked(object sender, MyButtonClickEventArgs e) { Response.Write(e.Var); } |
dank je wel!
Wat ik me alleen af vraag is of er geen makkelijkere manier is, en of er nog meer mensen zijn die custom arguments mee willen geven aan een event. Ik zal toch niet de enige zijn dit dit wil? Of is mijn ontwerp gewoon broken?
Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...
Overigens heb je in .net 2.0 een handige generic eventhandler waardoor je niet zelf je delegate hoeft te definieren.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| public class MyButton : Button { public event EventHandler<MyButtonEventArgs> MyCustomEvent; protected void OnMyCustomEvent() { if( MyCustomEvent != null ) MyCustomEvent( this, new MyButtonEventArgs() ); } public class MyButtonEventArgs : EventArgs { } } |
Maar je zult altijd een extra event moeten maken als je wat aan de parameters wilt veranderen.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”