How to add postback function in Custom Server Controls

T

ton

In the procedure CreateChildControls I add several controls like check and
textboxes, button link and so on. How can I get the postback respons on the
button link:
The functions:
lblButtonLink_Command and lblButtonLink_Click will not be executed

Please help

Ton
 
A

Alessandro Zifiglio

ton,
what do you want to do with the caputred event ?
If all you need to do is capture it and take action in your control itself
then you can easily do this :
1.In createchildcontrols as you add your control that posts back, a button
control for example :
Dim button1 As New Button()
button1.Text = "Submit"
Controls.Add(button1)
'Notice the event handler defined below
AddHandler button1.Click, AddressOf Me.ButtonClicked

now define the buttonclicked sub in your control and take action there,
everytime the button is clicked this will fire :
Private Sub ButtonClicked(sender As [Object], e As EventArgs)
'What to do when button is clicked
End Sub
Should work for you, however I havent tested, but theorically this is all
you need if this is your requirement. This is useful if you need to take
action without exposing the event to the container page, giving the
consumers of your control no control, as this event is not exposed to them.

for a complete example that digs deeper into this you might want to look at
the following link :
http://msdn.microsoft.com/library/d.../cpguide/html/cpconcompositecontrolsample.asp


Instead if you need to expose this event to the page where your control
sits, and exposed to the end users of your control then you will need to
bubble it up .
Here is a very nice example of how this can be done for composite controls
on MSDN.
http://msdn.microsoft.com/library/d...uide/html/cpconeventbubblingcontrolsample.asp
 
T

ton

Thanks for you reply

I've used the code you've send me. It did not work. I made my control a lot
simpeler and the result was the same.
It looked as if the button click event were not handled by te procedure of
the addresoff statement:

The code looks now like: (And I'm sure that the createchildcontrols is
called instaed of the the buttonclick procedure)

Protected Overrides Sub CreateChildControls()
If Me.Page.IsPostBack Then ' this is what runs after the button click
''Exit Sub '' (if I use Exit sub, no control is displayed)

End If

But = New Button

But.Text = "Submit"

But.ID = ClientID & "X"

Controls.Add(But)

AddHandler But.Click, AddressOf Me.ButtonClick

ChildControlsCreated = True

end Sub

Private Sub ButtonClick(ByVal sender As Object, ByVal e As System.EventArgs)

But = FindControl(ClientID & "X")

But.Text = "xxxx"

Controls.Add(But)

End Sub

I've dimensioned the button But as a private control, did not help
íve done this with the withevents keyword, no difference
and i've dimensioned them in the procedures createchildrecords and
buttonclick

no differences

Ton

Alessandro Zifiglio said:
ton,
what do you want to do with the caputred event ?
If all you need to do is capture it and take action in your control itself
then you can easily do this :
1.In createchildcontrols as you add your control that posts back, a button
control for example :
Dim button1 As New Button()
button1.Text = "Submit"
Controls.Add(button1)
'Notice the event handler defined below
AddHandler button1.Click, AddressOf Me.ButtonClicked

now define the buttonclicked sub in your control and take action there,
everytime the button is clicked this will fire :
Private Sub ButtonClicked(sender As [Object], e As EventArgs)
'What to do when button is clicked
End Sub
Should work for you, however I havent tested, but theorically this is all
you need if this is your requirement. This is useful if you need to take
action without exposing the event to the container page, giving the
consumers of your control no control, as this event is not exposed to them.

for a complete example that digs deeper into this you might want to look at
the following link :
http://msdn.microsoft.com/library/d.../cpguide/html/cpconcompositecontrolsample.asp


Instead if you need to expose this event to the page where your control
sits, and exposed to the end users of your control then you will need to
bubble it up .
Here is a very nice example of how this can be done for composite controls
on MSDN.
http://msdn.microsoft.com/library/d...uide/html/cpconeventbubblingcontrolsample.asp

ton said:
In the procedure CreateChildControls I add several controls like check and
textboxes, button link and so on. How can I get the postback respons on the
button link:
The functions:
lblButtonLink_Command and lblButtonLink_Click will not be executed

Please help

Ton
 
A

Alessandro Zifiglio

Should fire. It works for me. However i have noticed that you are trying to
add controls in your button click. This will not work for you because during
postback those controls wont be recreated. so set a flag in viewstate as you
add the control.
Also I have noticed that you are trying to retrieve the same button, the one
that fired the event in its event click and add it to the controls
collection. This is not what what you need to do, but simply have the same
code run after postback. Whatever code you have in your createchildcontrols
method will run after postback, so let it all run as is and remove the
ispostback check in there --If that code is not run your event will never
fire, this is because the viewstate of the control is restored when the
control is reloaded into its container.

Private Sub ButtonClick(ByVal sender As Object, ByVal e As System.EventArgs)
Dim MyButton As New Button()
MyButton = CType(sender, Button)
context.response.write("Click event for " & MyButton.id & "Fired")
End Sub

http://samples.gotdotnet.com/quicks...mposition2.src&file=VB\Composition2.vb&font=3

This is another example :
http://samples.gotdotnet.com/quicks...mposition3.src&file=VB\Composition3.vb&font=3


ton said:
Thanks for you reply

I've used the code you've send me. It did not work. I made my control a lot
simpeler and the result was the same.
It looked as if the button click event were not handled by te procedure of
the addresoff statement:

The code looks now like: (And I'm sure that the createchildcontrols is
called instaed of the the buttonclick procedure)

Protected Overrides Sub CreateChildControls()
If Me.Page.IsPostBack Then ' this is what runs after the button click
''Exit Sub '' (if I use Exit sub, no control is displayed)

End If

But = New Button

But.Text = "Submit"

But.ID = ClientID & "X"

Controls.Add(But)

AddHandler But.Click, AddressOf Me.ButtonClick

ChildControlsCreated = True

end Sub

Private Sub ButtonClick(ByVal sender As Object, ByVal e As System.EventArgs)

But = FindControl(ClientID & "X")

But.Text = "xxxx"

Controls.Add(But)

End Sub

I've dimensioned the button But as a private control, did not help
íve done this with the withevents keyword, no difference
and i've dimensioned them in the procedures createchildrecords and
buttonclick

no differences

Ton

Alessandro Zifiglio said:
ton,
what do you want to do with the caputred event ?
If all you need to do is capture it and take action in your control itself
then you can easily do this :
1.In createchildcontrols as you add your control that posts back, a button
control for example :
Dim button1 As New Button()
button1.Text = "Submit"
Controls.Add(button1)
'Notice the event handler defined below
AddHandler button1.Click, AddressOf Me.ButtonClicked

now define the buttonclicked sub in your control and take action there,
everytime the button is clicked this will fire :
Private Sub ButtonClicked(sender As [Object], e As EventArgs)
'What to do when button is clicked
End Sub
Should work for you, however I havent tested, but theorically this is all
you need if this is your requirement. This is useful if you need to take
action without exposing the event to the container page, giving the
consumers of your control no control, as this event is not exposed to them.

for a complete example that digs deeper into this you might want to look at
the following link :
http://msdn.microsoft.com/library/d.../cpguide/html/cpconcompositecontrolsample.asp
Instead if you need to expose this event to the page where your control
sits, and exposed to the end users of your control then you will need to
bubble it up .
Here is a very nice example of how this can be done for composite controls
on MSDN.
http://msdn.microsoft.com/library/d...uide/html/cpconeventbubblingcontrolsample.asp
 
A

Alessandro Zifiglio

ton, Look at the post "No events are fired in child controls". Jeffery has
just pointed out how useful Implementing the InamingContainer interface
really is, especially when you need events in child controls routed. This is
why your events werent firing.

Iimplement this interface, and do not try passing an explicit id to your
control if you dont need it.

At the moment i myself am having problems passing an explict id to child
controls and i'm working on a workaround. Will postback when I do find a
way. One good reason to want to pass an explicit id is when using a
validator control and as you already know you need to pass your controls id
to its "controlToValidate" property.

If this is not your case then i dont see why it is important to pass an
explicit ID

Alessandro Zifiglio said:
Should fire. It works for me. However i have noticed that you are trying to
add controls in your button click. This will not work for you because during
postback those controls wont be recreated. so set a flag in viewstate as you
add the control.
Also I have noticed that you are trying to retrieve the same button, the one
that fired the event in its event click and add it to the controls
collection. This is not what what you need to do, but simply have the same
code run after postback. Whatever code you have in your createchildcontrols
method will run after postback, so let it all run as is and remove the
ispostback check in there --If that code is not run your event will never
fire, this is because the viewstate of the control is restored when the
control is reloaded into its container.

Private Sub ButtonClick(ByVal sender As Object, ByVal e As System.EventArgs)
Dim MyButton As New Button()
MyButton = CType(sender, Button)
context.response.write("Click event for " & MyButton.id & "Fired")
End Sub

http://samples.gotdotnet.com/quicks...mposition2.src&file=VB\Composition2.vb&font=3

This is another example :
http://samples.gotdotnet.com/quicks...mposition3.src&file=VB\Composition3.vb&font=3


ton said:
Thanks for you reply

I've used the code you've send me. It did not work. I made my control a lot
simpeler and the result was the same.
It looked as if the button click event were not handled by te procedure of
the addresoff statement:

The code looks now like: (And I'm sure that the createchildcontrols is
called instaed of the the buttonclick procedure)

Protected Overrides Sub CreateChildControls()
If Me.Page.IsPostBack Then ' this is what runs after the button click
''Exit Sub '' (if I use Exit sub, no control is displayed)

End If

But = New Button

But.Text = "Submit"

But.ID = ClientID & "X"

Controls.Add(But)

AddHandler But.Click, AddressOf Me.ButtonClick

ChildControlsCreated = True

end Sub

Private Sub ButtonClick(ByVal sender As Object, ByVal e As System.EventArgs)

But = FindControl(ClientID & "X")

But.Text = "xxxx"

Controls.Add(But)

End Sub

I've dimensioned the button But as a private control, did not help
íve done this with the withevents keyword, no difference
and i've dimensioned them in the procedures createchildrecords and
buttonclick

no differences

Ton

"Alessandro Zifiglio" <[email protected]> schreef in
bericht news:[email protected]...
ton,
what do you want to do with the caputred event ?
If all you need to do is capture it and take action in your control itself
then you can easily do this :
1.In createchildcontrols as you add your control that posts back, a button
control for example :
Dim button1 As New Button()
button1.Text = "Submit"
Controls.Add(button1)
'Notice the event handler defined below
AddHandler button1.Click, AddressOf Me.ButtonClicked

now define the buttonclicked sub in your control and take action there,
everytime the button is clicked this will fire :
Private Sub ButtonClicked(sender As [Object], e As EventArgs)
'What to do when button is clicked
End Sub
Should work for you, however I havent tested, but theorically this is all
you need if this is your requirement. This is useful if you need to take
action without exposing the event to the container page, giving the
consumers of your control no control, as this event is not exposed to them.

for a complete example that digs deeper into this you might want to
look
at
the following link :
http://msdn.microsoft.com/library/d...uide/html/cpconeventbubblingcontrolsample.asp
check
and
 
A

Alessandro Zifiglio

oops, no workaround. That InamingContainer Interface had me a little
confused ;P
Since this interface already makes control ids unique you just need to pass
your id as is like

button1.id = "button1"
textbox1.id = "textbox1"
and so forth.
When trying to reference textbox1 for example just simply use its id
Alessandro Zifiglio said:
ton, Look at the post "No events are fired in child controls". Jeffery has
just pointed out how useful Implementing the InamingContainer interface
really is, especially when you need events in child controls routed. This is
why your events werent firing.

Iimplement this interface, and do not try passing an explicit id to your
control if you dont need it.

At the moment i myself am having problems passing an explict id to child
controls and i'm working on a workaround. Will postback when I do find a
way. One good reason to want to pass an explicit id is when using a
validator control and as you already know you need to pass your controls id
to its "controlToValidate" property.

If this is not your case then i dont see why it is important to pass an
explicit ID

Alessandro Zifiglio said:
Should fire. It works for me. However i have noticed that you are trying to
add controls in your button click. This will not work for you because during
postback those controls wont be recreated. so set a flag in viewstate as you
add the control.
Also I have noticed that you are trying to retrieve the same button, the one
that fired the event in its event click and add it to the controls
collection. This is not what what you need to do, but simply have the same
code run after postback. Whatever code you have in your createchildcontrols
method will run after postback, so let it all run as is and remove the
ispostback check in there --If that code is not run your event will never
fire, this is because the viewstate of the control is restored when the
control is reloaded into its container.

Private Sub ButtonClick(ByVal sender As Object, ByVal e As System.EventArgs)
Dim MyButton As New Button()
MyButton = CType(sender, Button)
context.response.write("Click event for " & MyButton.id & "Fired")
End Sub
http://samples.gotdotnet.com/quicks...mposition2.src&file=VB\Composition2.vb&font=3
This is another example :
http://samples.gotdotnet.com/quicks...mposition3.src&file=VB\Composition3.vb&font=3
procedure
of
the addresoff statement:

The code looks now like: (And I'm sure that the createchildcontrols is
called instaed of the the buttonclick procedure)

Protected Overrides Sub CreateChildControls()
If Me.Page.IsPostBack Then ' this is what runs after the button click
''Exit Sub '' (if I use Exit sub, no control is displayed)

End If

But = New Button

But.Text = "Submit"

But.ID = ClientID & "X"

Controls.Add(But)

AddHandler But.Click, AddressOf Me.ButtonClick

ChildControlsCreated = True

end Sub

Private Sub ButtonClick(ByVal sender As Object, ByVal e As System.EventArgs)

But = FindControl(ClientID & "X")

But.Text = "xxxx"

Controls.Add(But)

End Sub

I've dimensioned the button But as a private control, did not help
íve done this with the withevents keyword, no difference
and i've dimensioned them in the procedures createchildrecords and
buttonclick

no differences

Ton

"Alessandro Zifiglio" <[email protected]> schreef in
bericht ton,
what do you want to do with the caputred event ?
If all you need to do is capture it and take action in your control itself
then you can easily do this :
1.In createchildcontrols as you add your control that posts back, a button
control for example :
Dim button1 As New Button()
button1.Text = "Submit"
Controls.Add(button1)
'Notice the event handler defined below
AddHandler button1.Click, AddressOf Me.ButtonClicked

now define the buttonclicked sub in your control and take action there,
everytime the button is clicked this will fire :
Private Sub ButtonClicked(sender As [Object], e As EventArgs)
'What to do when button is clicked
End Sub
Should work for you, however I havent tested, but theorically this
is
all
you need if this is your requirement. This is useful if you need to take
action without exposing the event to the container page, giving the
consumers of your control no control, as this event is not exposed to
them.

for a complete example that digs deeper into this you might want to look
at
the following link :
http://msdn.microsoft.com/library/d.../cpguide/html/cpconcompositecontrolsample.asp need
http://msdn.microsoft.com/library/d...uide/html/cpconeventbubblingcontrolsample.asp
respons
on
 
T

ton

thank you
the event is fired now but what I had in my does not occur:
What I do is the following:
- I show a record contains of 10 fields. The properties are:
Tablename, RecordID, ShowFields (just a list of the fields to show)
now pressing a button should replace the existing recordcard by another
record card. For example a record contains a Contact. One of the field is
the (database)-link to the Customer. To click on that buttonlink, should
replace the form with for example 10 fields of the customer. You can say it
is a zoom function to the toplevel of the database.
For me this is inportant because it let me navigate in the database.
Another example:
when I want to modify the link I want to replace the control with a search
screen to show a list of customers, where the user can select one. Or to add
a complete knew one.

The question is: "Is this possible". I do not want the webdesigner to add
several controls on the form or to add several forms to the project to
handle these evenst.

Ton


Alessandro Zifiglio said:
oops, no workaround. That InamingContainer Interface had me a little
confused ;P
Since this interface already makes control ids unique you just need to pass
your id as is like

button1.id = "button1"
textbox1.id = "textbox1"
and so forth.
When trying to reference textbox1 for example just simply use its id
Alessandro Zifiglio said:
ton, Look at the post "No events are fired in child controls". Jeffery has
just pointed out how useful Implementing the InamingContainer interface
really is, especially when you need events in child controls routed.
This
is
why your events werent firing.

Iimplement this interface, and do not try passing an explicit id to your
control if you dont need it.

At the moment i myself am having problems passing an explict id to child
controls and i'm working on a workaround. Will postback when I do find a
way. One good reason to want to pass an explicit id is when using a
validator control and as you already know you need to pass your controls id
to its "controlToValidate" property.

If this is not your case then i dont see why it is important to pass an
explicit ID

trying
to as
you the
one
http://samples.gotdotnet.com/quicks...mposition3.src&file=VB\Composition3.vb&font=3 control
a
lot
simpeler and the result was the same.
It looked as if the button click event were not handled by te
procedure
of
the addresoff statement:

The code looks now like: (And I'm sure that the createchildcontrols is
called instaed of the the buttonclick procedure)

Protected Overrides Sub CreateChildControls()
If Me.Page.IsPostBack Then ' this is what runs after the button click
''Exit Sub '' (if I use Exit sub, no control is displayed)

End If

But = New Button

But.Text = "Submit"

But.ID = ClientID & "X"

Controls.Add(But)

AddHandler But.Click, AddressOf Me.ButtonClick

ChildControlsCreated = True

end Sub

Private Sub ButtonClick(ByVal sender As Object, ByVal e As
System.EventArgs)

But = FindControl(ClientID & "X")

But.Text = "xxxx"

Controls.Add(But)

End Sub

I've dimensioned the button But as a private control, did not help
íve done this with the withevents keyword, no difference
and i've dimensioned them in the procedures createchildrecords and
buttonclick

no differences

Ton

"Alessandro Zifiglio" <[email protected]>
schreef
in
bericht ton,
what do you want to do with the caputred event ?
If all you need to do is capture it and take action in your control
itself
then you can easily do this :
1.In createchildcontrols as you add your control that posts back, a
button
control for example :
Dim button1 As New Button()
button1.Text = "Submit"
Controls.Add(button1)
'Notice the event handler defined below
AddHandler button1.Click, AddressOf Me.ButtonClicked

now define the buttonclicked sub in your control and take action there,
everytime the button is clicked this will fire :
Private Sub ButtonClicked(sender As [Object], e As EventArgs)
'What to do when button is clicked
End Sub
Should work for you, however I havent tested, but theorically this is
all
you need if this is your requirement. This is useful if you need
to
take
action without exposing the event to the container page, giving the
consumers of your control no control, as this event is not exposed to
them.

for a complete example that digs deeper into this you might want
to
look
at
the following link :
http://msdn.microsoft.com/library/d.../cpguide/html/cpconcompositecontrolsample.asp
http://msdn.microsoft.com/library/d...uide/html/cpconeventbubblingcontrolsample.asp
 
A

Alessandro Zifiglio

ton, Can you explain that again. Its not very clear what you want to do ;P


ton said:
thank you
the event is fired now but what I had in my does not occur:
What I do is the following:
- I show a record contains of 10 fields. The properties are:
Tablename, RecordID, ShowFields (just a list of the fields to show)
now pressing a button should replace the existing recordcard by another
record card. For example a record contains a Contact. One of the field is
the (database)-link to the Customer. To click on that buttonlink, should
replace the form with for example 10 fields of the customer. You can say it
is a zoom function to the toplevel of the database.
For me this is inportant because it let me navigate in the database.
Another example:
when I want to modify the link I want to replace the control with a search
screen to show a list of customers, where the user can select one. Or to add
a complete knew one.

The question is: "Is this possible". I do not want the webdesigner to add
several controls on the form or to add several forms to the project to
handle these evenst.

Ton


Alessandro Zifiglio said:
oops, no workaround. That InamingContainer Interface had me a little
confused ;P
Since this interface already makes control ids unique you just need to pass
your id as is like

button1.id = "button1"
textbox1.id = "textbox1"
and so forth.
When trying to reference textbox1 for example just simply use its id
This controls
id
viewstate
as the
same
http://samples.gotdotnet.com/quicks...mposition3.src&file=VB\Composition3.vb&font=3
createchildcontrols
back,
a
button
control for example :
Dim button1 As New Button()
button1.Text = "Submit"
Controls.Add(button1)
'Notice the event handler defined below
AddHandler button1.Click, AddressOf Me.ButtonClicked

now define the buttonclicked sub in your control and take action
there,
everytime the button is clicked this will fire :
Private Sub ButtonClicked(sender As [Object], e As EventArgs)
'What to do when button is clicked
End Sub
Should work for you, however I havent tested, but theorically
this
is
all
you need if this is your requirement. This is useful if you need to
take
action without exposing the event to the container page, giving the
consumers of your control no control, as this event is not
exposed
to
them.

for a complete example that digs deeper into this you might want to
look
at
the following link :
http://msdn.microsoft.com/library/d...uide/html/cpconeventbubblingcontrolsample.asp
 
T

ton

suppose you want to plan an activity. You get a card wich contains several
field like
date, begintime, end time, description, customer, type of activity and so
on
type of activity is a dropdonlist
description a textbox
and the customer fields points to a foreignkey with the customer-table (if
it is filled in I just show the customer name)
off cause i cannot use a drop down list because there will be hunderds or
thoussends of customers in the database
so when it is empty i can press a button to select one from a list (get e
search screen and then look up)
or i can add a new customer, in both situations I want to have a different
from as the replacement of my original activity:
- pick from a list will show me several search fields from the table
customer inclusive a Search button
- the add new customer will give me a recordcard with the important fields
to define a new customer
when the customer is add, or when the customer is selected from the list I
replace this card by the original content where the customer field shows the
name of the customer

So instead of multiple screens i just use the same screens to collect the
information to plan this activity

i hope you can help


Ton



Alessandro Zifiglio said:
ton, Can you explain that again. Its not very clear what you want to do ;P


ton said:
thank you
the event is fired now but what I had in my does not occur:
What I do is the following:
- I show a record contains of 10 fields. The properties are:
Tablename, RecordID, ShowFields (just a list of the fields to show)
now pressing a button should replace the existing recordcard by another
record card. For example a record contains a Contact. One of the field is
the (database)-link to the Customer. To click on that buttonlink, should
replace the form with for example 10 fields of the customer. You can say it
is a zoom function to the toplevel of the database.
For me this is inportant because it let me navigate in the database.
Another example:
when I want to modify the link I want to replace the control with a search
screen to show a list of customers, where the user can select one. Or to add
a complete knew one.

The question is: "Is this possible". I do not want the webdesigner to add
several controls on the form or to add several forms to the project to
handle these evenst.

Ton


"Alessandro Zifiglio" <[email protected]> schreef in
bericht news:p[email protected]... to
pass Jeffery
has
find
a viewstate button,
the when
the
http://samples.gotdotnet.com/quickstart/util/srcview.aspx?path=/quickstart/a
spplus/samples/webforms/ctrlauth/composition/Composition2.src&file=VB\Compos
ition2.vb&font=3http://samples.gotdotnet.com/quickstart/util/srcview.aspx?path=/quickstart/a
spplus/samples/webforms/ctrlauth/composition/Composition3.src&file=VB\Compos
ition3.vb&font=3
Thanks for you reply

I've used the code you've send me. It did not work. I made my control
a
lot
simpeler and the result was the same.
It looked as if the button click event were not handled by te
procedure
of
the addresoff statement:

The code looks now like: (And I'm sure that the
createchildcontrols
is
called instaed of the the buttonclick procedure)

Protected Overrides Sub CreateChildControls()
If Me.Page.IsPostBack Then ' this is what runs after the button click
''Exit Sub '' (if I use Exit sub, no control is displayed)

End If

But = New Button

But.Text = "Submit"

But.ID = ClientID & "X"

Controls.Add(But)

AddHandler But.Click, AddressOf Me.ButtonClick

ChildControlsCreated = True

end Sub

Private Sub ButtonClick(ByVal sender As Object, ByVal e As
System.EventArgs)

But = FindControl(ClientID & "X")

But.Text = "xxxx"

Controls.Add(But)

End Sub

I've dimensioned the button But as a private control, did not help
íve done this with the withevents keyword, no difference
and i've dimensioned them in the procedures createchildrecords and
buttonclick

no differences

Ton

"Alessandro Zifiglio" <[email protected]> schreef
in
bericht ton,
what do you want to do with the caputred event ?
If all you need to do is capture it and take action in your control
itself
then you can easily do this :
1.In createchildcontrols as you add your control that posts
back,
a
button
control for example :
Dim button1 As New Button()
button1.Text = "Submit"
Controls.Add(button1)
'Notice the event handler defined below
AddHandler button1.Click, AddressOf Me.ButtonClicked

now define the buttonclicked sub in your control and take action
there,
everytime the button is clicked this will fire :
Private Sub ButtonClicked(sender As [Object], e As EventArgs)
'What to do when button is clicked
End Sub
Should work for you, however I havent tested, but theorically this
is
all
you need if this is your requirement. This is useful if you
need
to
take
action without exposing the event to the container page,
giving
the
consumers of your control no control, as this event is not exposed
to
them.

for a complete example that digs deeper into this you might
want
to
look
at
the following link :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/htm
l/cpconcompositecontrolsample.asphttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/htm
l/cpconeventbubblingcontrolsample.asp
 
A

Alessandro Zifiglio

still not clear to me. Instead of defining a scenario can you simplify it
and explain it in terms of custom control building what is not working for
you. Is your requirement to build a databound custom server control ? Are
you looking into building a custom control that has similar functionality to
the datagrid, datalist, repeater and so on --what have you been able to
implement so far. Which parts are working and where are you stuck.

ton said:
suppose you want to plan an activity. You get a card wich contains several
field like
date, begintime, end time, description, customer, type of activity and so
on
type of activity is a dropdonlist
description a textbox
and the customer fields points to a foreignkey with the customer-table (if
it is filled in I just show the customer name)
off cause i cannot use a drop down list because there will be hunderds or
thoussends of customers in the database
so when it is empty i can press a button to select one from a list (get e
search screen and then look up)
or i can add a new customer, in both situations I want to have a different
from as the replacement of my original activity:
- pick from a list will show me several search fields from the table
customer inclusive a Search button
- the add new customer will give me a recordcard with the important fields
to define a new customer
when the customer is add, or when the customer is selected from the list I
replace this card by the original content where the customer field shows the
name of the customer

So instead of multiple screens i just use the same screens to collect the
information to plan this activity

i hope you can help


Ton



Alessandro Zifiglio said:
ton, Can you explain that again. Its not very clear what you want to do ;P


say
it to
add to
your find pass
an wrote
in have
the remove
the
http://samples.gotdotnet.com/quicks...h/composition/Composition2.src&file=VB\Compos
ition2.vb&font=3
http://samples.gotdotnet.com/quicks...h/composition/Composition3.src&file=VB\Compos
ition3.vb&font=3
Thanks for you reply

I've used the code you've send me. It did not work. I made my
control
a
lot
simpeler and the result was the same.
It looked as if the button click event were not handled by te
procedure
of
the addresoff statement:

The code looks now like: (And I'm sure that the createchildcontrols
is
called instaed of the the buttonclick procedure)

Protected Overrides Sub CreateChildControls()
If Me.Page.IsPostBack Then ' this is what runs after the button
click
''Exit Sub '' (if I use Exit sub, no control is displayed)

End If

But = New Button

But.Text = "Submit"

But.ID = ClientID & "X"

Controls.Add(But)

AddHandler But.Click, AddressOf Me.ButtonClick

ChildControlsCreated = True

end Sub

Private Sub ButtonClick(ByVal sender As Object, ByVal e As
System.EventArgs)

But = FindControl(ClientID & "X")

But.Text = "xxxx"

Controls.Add(But)

End Sub

I've dimensioned the button But as a private control, did not help
íve done this with the withevents keyword, no difference
and i've dimensioned them in the procedures createchildrecords and
buttonclick

no differences

Ton

"Alessandro Zifiglio" <[email protected]>
schreef
in
bericht ton,
what do you want to do with the caputred event ?
If all you need to do is capture it and take action in your
control
itself
then you can easily do this :
1.In createchildcontrols as you add your control that posts back,
a
button
control for example :
Dim button1 As New Button()
button1.Text = "Submit"
Controls.Add(button1)
'Notice the event handler defined below
AddHandler button1.Click, AddressOf Me.ButtonClicked

now define the buttonclicked sub in your control and take action
there,
everytime the button is clicked this will fire :
Private Sub ButtonClicked(sender As [Object], e As EventArgs)
'What to do when button is clicked
End Sub
Should work for you, however I havent tested, but
theorically
this
is
all
you need if this is your requirement. This is useful if you need
to
take
action without exposing the event to the container page, giving
the
consumers of your control no control, as this event is not exposed
to
them.

for a complete example that digs deeper into this you might want
to
look
at
the following link :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/htm
l/cpconcompositecontrolsample.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/htm
l/cpconeventbubblingcontrolsample.asp controls
like
 
T

ton

what i want is that when the event of the button fires I would like to show
a complete other card, not the 10 fields i've showen earlier but because of
the click i would see details depending on the click this could be 5 fields
from another record and another table. So existing added controls away, new
controls inplace

ton
Alessandro Zifiglio said:
still not clear to me. Instead of defining a scenario can you simplify it
and explain it in terms of custom control building what is not working for
you. Is your requirement to build a databound custom server control ? Are
you looking into building a custom control that has similar functionality to
the datagrid, datalist, repeater and so on --what have you been able to
implement so far. Which parts are working and where are you stuck.

ton said:
suppose you want to plan an activity. You get a card wich contains several
field like
date, begintime, end time, description, customer, type of activity and so
on
type of activity is a dropdonlist
description a textbox
and the customer fields points to a foreignkey with the customer-table (if
it is filled in I just show the customer name)
off cause i cannot use a drop down list because there will be hunderds or
thoussends of customers in the database
so when it is empty i can press a button to select one from a list (get e
search screen and then look up)
or i can add a new customer, in both situations I want to have a different
from as the replacement of my original activity:
- pick from a list will show me several search fields from the table
customer inclusive a Search button
- the add new customer will give me a recordcard with the important fields
to define a new customer
when the customer is add, or when the customer is selected from the list I
replace this card by the original content where the customer field shows the
name of the customer

So instead of multiple screens i just use the same screens to collect the
information to plan this activity

i hope you can help


Ton



"Alessandro Zifiglio" <[email protected]> schreef in
bericht news:[email protected]... do
;P field
is
Or
to to
add schreef
in need
to wrote
in do
find
using
a restored
when
http://samples.gotdotnet.com/quicks...h/composition/Composition3.src&file=VB\Compos
ition3.vb&font=3


Thanks for you reply

I've used the code you've send me. It did not work. I made my
control
a
lot
simpeler and the result was the same.
It looked as if the button click event were not handled by te
procedure
of
the addresoff statement:

The code looks now like: (And I'm sure that the
createchildcontrols
is
called instaed of the the buttonclick procedure)

Protected Overrides Sub CreateChildControls()
If Me.Page.IsPostBack Then ' this is what runs after the button
click
''Exit Sub '' (if I use Exit sub, no control is displayed)

End If

But = New Button

But.Text = "Submit"

But.ID = ClientID & "X"

Controls.Add(But)

AddHandler But.Click, AddressOf Me.ButtonClick

ChildControlsCreated = True

end Sub

Private Sub ButtonClick(ByVal sender As Object, ByVal e As
System.EventArgs)

But = FindControl(ClientID & "X")

But.Text = "xxxx"

Controls.Add(But)

End Sub

I've dimensioned the button But as a private control, did
not
help
íve done this with the withevents keyword, no difference
and i've dimensioned them in the procedures
createchildrecords
and
buttonclick

no differences

Ton

"Alessandro Zifiglio"
schreef
in
bericht ton,
what do you want to do with the caputred event ?
If all you need to do is capture it and take action in your
control
itself
then you can easily do this :
1.In createchildcontrols as you add your control that posts
back,
a
button
control for example :
Dim button1 As New Button()
button1.Text = "Submit"
Controls.Add(button1)
'Notice the event handler defined below
AddHandler button1.Click, AddressOf Me.ButtonClicked

now define the buttonclicked sub in your control and take action
there,
everytime the button is clicked this will fire :
Private Sub ButtonClicked(sender As [Object], e As EventArgs)
'What to do when button is clicked
End Sub
Should work for you, however I havent tested, but theorically
this
is
all
you need if this is your requirement. This is useful if
you
need
to
take
action without exposing the event to the container page, giving
the
consumers of your control no control, as this event is not
exposed
to
them.

for a complete example that digs deeper into this you
might
want
to
look
at
the following link :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/htm
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/htm
 
A

Arthur Mnev

My experience to you:

1. You control must implement INamingContainer to create its own namespace
for event routing
2. you override CreateChildControl and construct them according to your
rules. It might be tricky you must remember that

Even though ASP.NET supports events it is still disconnected architecture
therefore once a server sends you a page it completely forgets about you
therefore, when you click on a button (or generate other event) what must
happen is:
1 - data sent to the server
2 - server constructs control tree (it MUST construct the same control
tree as you had when you outputted the controls /previous state)
3 - It checks which control supposed to receive an event (__EVENTTARGET
post variable contains the control name)
4 - An event is raised on behalf of control
5 - You capture the event

3. Clear the control list (Controls.Clear())
4. Load Conditions (or Cache) of your previous request (ViewState could be
used to store them)
5. Build Controls based on previous conditions (or cache) - by the time you
get out of the CreateChildControls() your ChildControlsCreated flag will be
set to true by the framework
6. Event delegate will get executed
7. Make sure your event handler alters the Control Condition and calls
(this.ChildControlsCreated = false). what that will do is place an
indication flag that controls have not been created, that will case the
framework to re-run CreateChildControls;
8. When CreateChildControls re-runs it Clears it's previous control list,
loads up Build Conditions and Generates the controls. Except the build
conditions are based now on your different Build conditions.


It is like you will be running the page twice - once to build an old state,
figure out what event to raise and raise that event. Once raised you will
re-run everything to determine second state and alter your presentation.

If that is not enough think about this. When an event is mapped to the
hierarchy, the hierarchy must be in the same exact order as it has been
before, otherwise an event will get mapped to the wrong control. This is
where you get CorruptedViewState error messages. Consider this:

User John (ctl1)
User Jane (ctl2)
User Jim (ctl3)

Each of the users is a button

You click on Jane, however, between the time you got the page and the time
you clicked user Jane was deleted, a server will construct a list
User John (ctl1)
User Jim (ctl2)

Check which control you were trying to route an event to - that would be
ctl2; execute OnClick event delegate for User Jim. -

- Hope this helps


In summary - if you can avoid doing it do so - I had a catalog that was
working the exact same way; after 3 months of production I changed it to
redirect itself to its own page with Get Parameters instead of events. I did
it because every load of a page resulted in 2X work for the server (previous
state + current state).
it also removed a lot of complexity. I also know of a few that created
every! control on the page they might need and then made them visible or hid
them. Personally I don't like that style.

- Arthur
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top