Saturday, April 9, 2011

Telerik RadGrid doesn't fire NeedDataSource event on Rebind()

So you're using telerik, and you want your NeedDataSource method to get called when you rebind. But it doesnt?

This is a problem I face every now and then. Each time I struggle to remember the resolution from last time but keep forgetting. Just got the same error so this time, decided to put it down here.

Assumption:
An event handler for the event NeedDataSource has been properly subscribed.

i.e.:

Markup:

<telerik:RadGrid ... OnNeedDataSource="Gird_NeedDataSource">
...
</telerik:RadGrid>


Code behind:

protected void Grid_NeedDataSource(object source, GridNeedDataSourceEventArgs e)
{
// Logic to load data
}

private void SomeMethod()
{
...
Grid.Rebind();
...
}


Answer:

make the datasource of the grid null before calling rebind.
i.e.
Grid.DataSource = null;
Grid.Rebind();

Description:
Most likely you are not adhering to the standard way the RadGrid is supposed to be implemented (which is OK in my opinion).

If you place a break point in your existing NeedDataSource event handler, you will notice that it gets called before you explicitly call Rebind.

This means you most probably set the Grid.DataSource property within the NeedDataSource event. Therefore when the DataSource property is not null, that should mean that there is 'NO need for a data source'.


Therefore quite naturally the NeedDataSource event will not get fired when you rebind the grid.
I believe this is the expected behavior of the RadGrid. If you ever have a need to explicitly set the DataSource to null before calling rebind, that means something is not following the expected standard in your code. Oh well, you have to live with it right?

If you know of any other reasons as to why the NeedDataSource wouldn't get called on rebinding the grid, feel free to post a comment on it :)

Thursday, April 7, 2011

Script control 'ControlName' is not a registered script control

So you're here because you got the following error.

Script control 'ControlName' is not a registered script control. Script controls must be registered using RegisterScriptControl() before calling RegisterScriptDescriptors().

Parameter name: scriptControl


I myself have done a fair bit of googling on this, and there are many solutions given all over the net. unfortunately these are all very scenario specific solutions. Some people get their answers, and the others, like me, don't.

Answer:

You are changing the visibility of a control at the wrong stage of the page life cycle.

Description:

If you are changing the visibility of a control, you should always do it during, or before the PreRender event. If you do it after (i.e. in a End handler of an async task or during PreRenderComplete) you might run in to this issue.

This is not an issue for simple controls such as buttons or text boxes. But it will have adverse effects on controls such as grids.

When I say changing the visibility it could be any one of the following situations

  • Having visible=false of a control during the early stages of the life cycle and being changed to visible=true during an end handler or PreRenderComplete
  • Changing the selected view of a MultiView during an end handler or PreRenderComplete
  • Any other situation where the control may not be visible during the earlier stages of the page life cycle which are set to be visible during the latter stage
Reason:
Purely from my understanding, ASP.NET does not render the scripts or the HTML related to a control if it is not being shown to the user. The registering of script controls which is mentioned in the exception seem to happen during an early stage of the life cycle. if the control is not visible at this stage, this registration is skipped for that control. If it's made to be visible at a latter point, you get yourself a control without some of the relevant scripts.

Anyway this is what I have understood. I may be wrong. But if you come across this issue, it will definitely help you to check for controls which are changing visibility at different points of the life cycle. You will be able to identify your specific problem by doing this and then come up with a solution on your own.

Hope this information helps some one.