New to Telerik UI for ASP.NET AJAX? Download free 30-day trial

Spell Check RadGrid Editors

This demo illustrates how to spell check text input fields in RadGrid's edit form using RadSpell. This is useful when you would like to notify the end user when there are spelling mistakes in the text editor fields he/she uses to update/insert grid records.

The key moments are:

  • Attach a client script to the "Update" button in the grid's edit form (using asp HiddenField to store its id for this purpose).

  • Take advantage of RadSpell.ControlsToCheck property, add the ClientID's of all the textbox editors that should be checked.

  • Call the startSpellCheck() client method of RadSpell to check the specified input controls.

  • Raise a flag when the check is finished to update/insert the data.

Additionally, the grid and spell components are ajaxified using RadAjaxManager instance to perform the data editing operations with asynchronous requests. Here are the relevant code snippets from the online demo:

<telerik:RadCodeBlock ID="RadCodeBlock1" runat="server">    
//boolean flag which determines whether the spell check has been processed or not  
var IsChecked = false;
//starts the spell check operation   
function StartCheck() {
  if (!IsChecked) {
    var spell = $find('<%= RadSpell1.ClientID %>');
    spell.startSpellCheck(); return false;
  } else { return true; }
}
function SpellCheckFinished(sender, args) {
  IsChecked = true;
}
function SpellCheckClosed(sender, args) {
  if (IsChecked) {
    //trigger submit from the update/insert button in the grid      
    //the id of the update or insert button is extracted from a hidden field   
    var buttonID = document.getElementById('<%=HiddenField1.ClientID %>').value;
    document.getElementById(buttonID).click(); IsChecked = false;
  }
}
</telerik:RadCodeBlock>
<telerik:RadAjaxManager ID="RadAjaxManager1" runat="server" EnableAJAX="true">
  <AjaxSettings>
    <telerik:AjaxSetting AjaxControlID="RadGrid1">
      <UpdatedControls>
        <telerik:AjaxUpdatedControl ControlID="RadGrid1" LoadingPanelID="RadAjaxLoadingPanel1" />
        <telerik:AjaxUpdatedControl ControlID="RadSpell1" />
        <telerik:AjaxUpdatedControl ControlID="HiddenField1" />
        <telerik:AjaxUpdatedControl ControlID="lblMessage" />
      </UpdatedControls>
    </telerik:AjaxSetting>
  </AjaxSettings>
</telerik:RadAjaxManager>
<telerik:RadAjaxLoadingPanel ID="RadAjaxLoadingPanel1" runat="server" />
<asp:HiddenField ID="HiddenField1" runat="server" />
<telerik:RadSpell RenderMode="Lightweight" ID="RadSpell1" runat="server" ButtonType="None" OnClientDialogClosed="SpellCheckClosed"
  OnClientCheckFinished="SpellCheckFinished" />
<telerik:RadGrid RenderMode="Lightweight" ID="RadGrid2" runat="server" Width="100%" DataSourceID="SqlDataSource1"
  AllowAutomaticInserts="true" AllowAutomaticUpdates="true" OnItemCreated="RadGrid1_ItemCreated"
  OnColumnCreated="RadGrid1_ColumnCreated" OnItemUpdated="RadGrid1_ItemUpdated" OnItemInserted="RadGrid1_ItemInserted">
  <MasterTableView AllowSorting="true" PageSize="10" AllowPaging="True" Width="100%"
    DataKeyNames="ProductID" DataSourceID="SqlDataSource1" CommandItemDisplay="TopAndBottom">
    <Columns>
      <telerik:GridEditCommandColumn ButtonType="ImageButton" />
    </Columns>
    <EditFormSettings>
      <EditColumn ButtonType="ImageButton" />
    </EditFormSettings>
  </MasterTableView></telerik:RadGrid><asp:Label ID="lblMessage" runat="server" EnableViewState="false" /><br />
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
  SelectCommand="SELECT ProductID, ProductName, QuantityPerUnit, UnitPrice, UnitsInStock, Discontinued FROM [Products]"
  InsertCommand="INSERT INTO Products(ProductName, QuantityPerUnit, UnitPrice, UnitsInStock, Discontinued) VALUES (@ProductName, @QuantityPerUnit, @UnitPrice, @UnitsInStock, @Discontinued)"
  UpdateCommand="UPDATE [Products] SET [ProductName] = @ProductName, [QuantityPerUnit] = @QuantityPerUnit, [UnitPrice] = @UnitPrice, [UnitsInStock] = @UnitsInStock, [Discontinued] = @Discontinued WHERE [ProductID] = @ProductID">
  <UpdateParameters>
    <asp:Parameter Name="ProductName" Type="String" />
    <asp:Parameter Name="QuantityPerUnit" Type="String" />
    <asp:Parameter Name="UnitPrice" Type="Decimal" />
    <asp:Parameter Name="UnitsInStock" Type="Int16" />
    <asp:Parameter Name="Discontinued" Type="Boolean" />
  </UpdateParameters>
  <InsertParameters>
    <asp:Parameter Name="ProductName" Type="String" />
    <asp:Parameter Name="QuantityPerUnit" Type="String" />
    <asp:Parameter Name="UnitPrice" Type="Decimal" />
    <asp:Parameter Name="UnitsInStock" Type="Int16" />
    <asp:Parameter Name="Discontinued" Type="Boolean" />
  </InsertParameters>
</asp:SqlDataSource>
protected void RadGrid1_ItemCreated(object sender, GridItemEventArgs e)
{
    if (e.Item is GridEditableItem && e.Item.IsInEditMode)
    {
        GridEditableItem editedItem = e.Item as GridEditableItem;
        GridEditManager editMan = editedItem.EditManager;
        ImageButton actionButton;
        //insert mode      
        if (editedItem.OwnerTableView.IsItemInserted)
        {
            actionButton = editedItem.FindControl("PerformInsertButton") as ImageButton;
        }
        //edit mode
        else
        {
            actionButton = editedItem.FindControl("UpdateButton") as ImageButton;
        }
        actionButton.OnClientClick = "return StartCheck();";
        HiddenField1.Value = actionButton.ClientID;
        Stack controlsToCheck = new Stack();
        int index = 0;
        foreach (GridColumn column in editedItem.OwnerTableView.RenderColumns)
        {
            if (column is IGridEditableColumn && column.IsEditable)
            {
                IGridColumnEditor editor = editMan.GetColumnEditor(column as IGridEditableColumn);
                if (editor is GridTextBoxColumnEditor)
                {
                    string editorID = (editor as GridTextBoxColumnEditor).TextBoxControl.ClientID;
                    controlsToCheck.Push(editorID);
                    index++;
                }
            }
        }
        RadSpell1.ControlsToCheck = new string[index];
        while (controlsToCheck.Count > 0)
        {
            RadSpell1.ControlsToCheck.SetValue(controlsToCheck.Pop(), controlsToCheck.Count);
        }
        RadSpell1.IsClientID = true;
    }
}
protected void RadGrid1_ColumnCreated(object sender, GridColumnCreatedEventArgs e)
{
    //make the product id column read-only  
    if (e.Column.IsBoundToFieldName("ProductID"))
    {
        (e.Column as GridBoundColumn).ReadOnly = true;
    }
}
protected void RadGrid1_ItemUpdated(object source, Telerik.Web.UI.GridUpdatedEventArgs e)
{
    GridEditableItem item = (GridEditableItem)e.Item;
    String id = item.GetDataKeyValue("ProductID").ToString();

    if (e.Exception != null)
    {
        e.KeepInEditMode = true;
        e.ExceptionHandled = true;
        SetMessage("Product with ID " + id + " cannot be updated. Reason: " + e.Exception.Message);
    }
    else
    {
        SetMessage("Product with ID " + id + " is updated!");
    }
}
protected void RadGrid1_ItemInserted(object source, GridInsertedEventArgs e)
{
    if (e.Exception != null)
    {
        e.ExceptionHandled = true;
        SetMessage("Product cannot be inserted. Reason: " + e.Exception.Message);
    }
    else
    {
        SetMessage("New product is inserted!");
    }
}
private void SetMessage(string message)
{
    lblMessage.Text = message;
}

Protected Sub RadGrid1_ItemCreated(ByVal sender As Object, ByVal e As GridItemEventArgs) Handles RadGrid1.ItemCreated
    If TypeOf e.Item Is GridEditableItem AndAlso e.Item.IsInEditMode Then
        Dim editedItem As GridEditableItem = TryCast(e.Item, GridEditableItem)
        Dim editMan As GridEditManager = editedItem.EditManager
        Dim actionButton As ImageButton
        'insert mode            
        If editedItem.OwnerTableView.IsItemInserted Then
            actionButton = TryCast(editedItem.FindControl("PerformInsertButton"), ImageButton)
        Else
            'edit mode         
            actionButton = TryCast(editedItem.FindControl("UpdateButton"), ImageButton)
        End If
        actionButton.OnClientClick = "return StartCheck();"
        HiddenField1.Value = actionButton.ClientID
        Dim controlsToCheck As New Stack()
        Dim index As Integer = 0
        For Each column As GridColumn In editedItem.OwnerTableView.RenderColumns
            If TypeOf column Is IGridEditableColumn AndAlso column.IsEditable Then
                Dim editor As IGridColumnEditor = editMan.GetColumnEditor(TryCast(column, IGridEditableColumn))
                If TypeOf editor Is GridTextBoxColumnEditor Then
                    Dim editorID As String = TryCast(editor, GridTextBoxColumnEditor).TextBoxControl.ClientID
                    controlsToCheck.Push(editorID)
                    index += 1
                End If
            End If
        Next
        RadSpell1.ControlsToCheck = New String(index - 1) {}
        While controlsToCheck.Count > 0
            RadSpell1.ControlsToCheck.SetValue(controlsToCheck.Pop(), controlsToCheck.Count)
        End While
        RadSpell1.IsClientID = True
    End If
End Sub

Protected Sub RadGrid1_ColumnCreated(ByVal sender As Object, ByVal e As GridColumnCreatedEventArgs) Handles RadGrid1.ColumnCreated
    'make the product id column read-only
    If e.Column.IsBoundToFieldName("ProductID") Then
        TryCast(e.Column, GridBoundColumn).ReadOnly = True
    End If
End Sub

Protected Sub RadGrid1_ItemUpdated(ByVal source As Object, ByVal e As Telerik.Web.UI.GridUpdatedEventArgs) Handles RadGrid1.ItemUpdated
    Dim item As GridEditableItem = DirectCast(e.Item, GridEditableItem)
    Dim id As [String] = item.GetDataKeyValue("ProductID").ToString()
    If e.Exception IsNot Nothing Then
        e.KeepInEditMode = True
        e.ExceptionHandled = True
        SetMessage("Product with ID " + id + " cannot be updated. Reason: " + e.Exception.Message)
    Else
        SetMessage("Product with ID " + id + " is updated!")
    End If
End Sub

Protected Sub RadGrid1_ItemInserted(ByVal source As Object, ByVal e As GridInsertedEventArgs) Handles
    RadGrid1.ItemInserted()
    If e.Exception IsNot Nothing Then
        e.ExceptionHandled = True
        SetMessage("Product cannot be inserted. Reason: " + e.Exception.Message)
    Else
        SetMessage("New product is inserted!")
    End If
End Sub
Private Sub SetMessage(ByVal message As String)
    lblMessage.Text = message
End Sub
In this article