There are two types of
controls which make post back in ASP.NET. One button type control like
image button, button (whose type is “submit”), and another type use
javascript function “_doPostBack” for the post back.
If post back control
is button type then it will be added in the Request.Form collection
means if there are two button in a page named button1 and button2 and if
button1 make post back then only button1 will be in Request.Form
Collection not button2 (but Request.Form collection can contains other
server controls also like if page contains few textbox, dropdown list
etc.) and if post back made by the button2 then only button2 will be
available in Request.Form collection not button1(with other server
control as I discuss earlier).
So if you want to
catch which button type control made a post back in page load event, you
have to just iterate the Request.Form collection.
I’ll show you demo latter in this article.
Another category of
server control who make post back use the client side javascript
function _doPostBack like if we made autopostback true for dropdown
list, radio button etc.
If you look view source you will found _doPostBack javascript function.
function __doPostBack(eventTarget, eventArgument)
{
if (!theForm.onsubmit || (theForm.onsubmit() ! = false ))
{
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit();
}
}
As you can see this
function take two arguments “eventTarget” and “eventArgument”.
“eventTarget” used for the control ID who is responsible for the
postback and “eventArgument” used for the additional information about
the control.
If you look at the view source you will also found these two hidden fields.
<input type= "hidden" name= "__EVENTTARGET" id= "__EVENTTARGET" value= "" />
<input type= "hidden" name= "__EVENTARGUMENT" id= "__EVENTARGUMENT" value= "" />
Lets add one dropdown
server control in page and make autopostback true also add some dummy
data. If you look at the view source you will found
<select
name="DropDownList1"
onchange="javascript:setTimeout('__doPostBack(\'DropDownList1\',\'\')',
0)" id="DropDownList1">
<option value="1">abc</option>
<option value="2">xyz</option>
</select>
ASP.NET engine automatically add onchange event and call the _doPostBack function and pass the appropriate parameter.
_doPostBack function
first set the value of those hidden field and then submit the form. So
if you want to know whether this dropdown list make post back or not you
have to just check the value of “__EVENTTARGET” hidden field from the
form parameter collection. I’ll show you code as well.
In my example I am
adding two buttons, one image button, one dropdown list, one checkbox
and two image buttons. I’ll try to print the control name which makes
the post back. All I’ll try to find in page load event. So be ready for
the ride.
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
Response.Write(getPostBackControlName());
}
private string getPostBackControlName()
{
Control control = null;
//first we will check the "__EVENTTARGET" because if post back made by the controls
//which used "_doPostBack" function also available in Request.Form collection.
string ctrlname = Page.Request.Params["__EVENTTARGET"];
if (ctrlname != null && ctrlname != String.Empty)
{
control = Page.FindControl(ctrlname);
}
// if __EVENTTARGET is null, the control is a button type and we need to
// iterate over the form collection to find it
else
{
string ctrlStr = String.Empty;
Control c = null;
foreach (string ctl in Page.Request.Form)
{
//handle ImageButton they having an additional "quasi-property" in their Id which identifies
//mouse x and y coordinates
if (ctl.EndsWith(".x") || ctl.EndsWith(".y"))
{
ctrlStr = ctl.Substring(0, ctl.Length - 2);
c = Page.FindControl(ctrlStr);
}
else
{
c = Page.FindControl(ctl);
}
if (c is System.Web.UI.WebControls.Button ||
c is System.Web.UI.WebControls.ImageButton)
{
control = c;
break;
}
}
}
return control.ID;
}
}VB.Net
=======
Private Function getPostBackControlName() As String
Dim control As Control = Nothing
'first we will check the "__EVENTTARGET" because if post back made by the controls
'which used "_doPostBack" function also available in Request.Form collection.
Dim ctrlname As String = Page.Request.Params("__EVENTTARGET")
If ctrlname IsNot Nothing AndAlso ctrlname <> [String].Empty Then
control = Page.FindControl(ctrlname)
Else
' if __EVENTTARGET is null, the control is a button type and we need to
' iterate over the form collection to find it
Dim ctrlStr As String = [String].Empty
Dim c As Control = Nothing
For Each ctl As String In Page.Request.Form
'handle ImageButton they having an additional "quasi-property" in their Id which identifies
'mouse x and y coordinates
If ctl.EndsWith(".x") OrElse ctl.EndsWith(".y") Then
ctrlStr = ctl.Substring(0, ctl.Length - 2)
c = Page.FindControl(ctrlStr)
Else
c = Page.FindControl(ctl)
End If
If TypeOf c Is System.Web.UI.WebControls.Button OrElse TypeOf c Is System.Web.UI.WebControls.ImageButton Then
control = c
Exit For
End If
Next
End If
Return control.ID
End Function
No comments:
Post a Comment