This post continues topic started in “WHDG: Correctly detect Async Callback“. Back then I described a way to correctly detect server-side when an infragistics control (WebHierarchicalDataGrid) issues an async callback.
But what if you need to detect actual type of the call and distinguish paging from sorting from filtering from row expanding? Well, where there is will there is way. Infragistics says there’s no build-in flag indicating AJAX action, but we can determine the action by intercepting and interpreting HTTP Request object.
First let’s define a return type in form of an Enum
describing all possible outcomes (it’s always good to work strongly typed values):
Public Enum GRID_AJAX_CALL_TYPE
NON_AJAX = 0
PAGING = 1
SORTING = 2
FILTERING = 3
CHILD_POPULATING = 4
End Enum
And now actual function. In the previous post I described that presence of AJAX call can be determined if key starting with "__IGCallback"
is present in Request.Form collection. By interpreting actual value of Request item with that key we can determine type of AJAX call. For example, when grid’s row is expanding during load-on-demand, it contains JSON data "eventName":"Populating","type":"loadOnDemand"
so our function simple has to catch it:
Function GetGridAjaxCallType() As GRID_AJAX_CALL_TYPE
Dim sIgCallBackKey As String = HttpContext.Current.Request.Form.AllKeys.SingleOrDefault(Function(S As String) S IsNot Nothing AndAlso S.StartsWith("__IGCallback"))
Dim sIgCallBackRequest As String
If sIgCallBackKey <> "" Then
sIgCallBackRequest = HttpContext.Current.Request.Form(sIgCallBackKey)
'Detecting Child Populating.
If sIgCallBackRequest.Contains("""eventName"":""Populating"",""type"":""loadOnDemand""") Then Return GRID_AJAX_CALL_TYPE.CHILD_POPULATING
Return GRID_AJAX_CALL_TYPE.NON_AJAX
Else
Return GRID_AJAX_CALL_TYPE.NON_AJAX
End If
End Function
The function tries to locate "__IGCallback"
key in HTTP request (Line 2), if the key present – function reads actual Request value (Line 6) and if Load-on-demand populating is detected (Line 9) – returns result saying so, otherwise returned result indicated non-ajax call.
This example implements only one detection – Load-on-demand populating, I will leave it to you to add sorting/filtering/paging detection. Once implemented – usage is pretty straightforward:
If Not IsPostBack Then
'...
Else
If GetGridAjaxCallType() = GRID_AJAX_CALL_TYPE.CHILD_POPULATING Then
RebindTheGrid()
End If
End if