Find Control that Caused a Postback

Sometimes there is the need to find the control that caused the postback from outside the event handler. The following code gives you just that:

public static class PageExtensions
{
	public static Control FindFiredControl(this Page page)
	{
		Control control = page;
		Boolean asyncPost = (page.Request.Form [ "__ASYNCPOST" ] == "true");
		String eventTarget = page.Request.Form [ "__EVENTTARGET" ];

		if (page.IsPostBack == true)
		{
			//check if the postback control is not a button
			if (String.IsNullOrEmpty(eventTarget) == false)
			{
				//all naming containers
				String [] parts = eventTarget.Split('$');
	
				foreach (String part in parts)
				{
					//find control on its naming container
					control = control.FindControl(part);
				}
			}
			else
			{
				//search all submitted form keys
				foreach (String key in page.Request.Form.AllKeys.Where(k => Char.IsLetter(k [ 0 ])).ToArray())
				{
					//all naming containers
					String [] parts = key.Split('$');

					//initialize control to page on each iteration
					control = page;

					foreach (String part in parts)
					{
						//find control on its naming container
						if ((part.EndsWith(".x")) || (part.EndsWith(".y")))
						{
							//ImageButton
							control = control.FindControl(part.Substring(0, part.Length - 2));
						}
						else
						{
							//other button type
							control = control.FindControl(part);
						}
					}
	
					if (control is IPostBackEventHandler)
					{
						if (((control is ScriptManager) || (control is ScriptManagerProxy)) && (asyncPost == true))
						{
							//ScriptManager/ScriptManagerProxy themselves never fire postback events
							continue;
						}
						else
						{
							//found firing event
							break;
						}
					}
	
					//clear control for next iteration
					control = null;
				}
			}
		}
	
		return (control);
	}
}
Bookmark and Share

                             

2 Comments

Comments have been disabled for this content.