Edit this page

Population/Data Editing with XmlDataSource Control

RadGrid can use the XmlDataSource control to generate its content from XML and perform data editing operations. Note that automatic update, insert, and delete operations, which work with other data source controls such as AccessDataSource, SqlDataSource, and ObjectDataSource, do not work when using XmlDataSource. If you want to enable editing, you must write custom code to modify data in the XML source file.

The following restrictions apply to editing XML data when using XmlDataSource control:

  • The XML data must be loaded from an XML file specified with the DataFile property of the XmlDataSource control, and not from an xml string specified in the Data property.

  • No XSLT transformation can be specified in the Transform or TransformFile properties of the XmlDataSource control.

  • The Save method does not handle concurrent save operations on unique requests. If more than one user is editing an XML file using the XmlDataSource control, there is no guarantee that all users are operating with the same data and that one user will not overwrite changes from another user. It is also possible for a save operation to fail because another user is writing to the XML file and has an exclusive lock on the file.

<telerik:RadGrid RenderMode="Lightweight" ID="RadGrid1" runat="server" Skin="Web20" Width="95%" DataSourceID="XmlDataSource1"
  OnInsertCommand="RadGrid1_InsertCommand" OnUpdateCommand="RadGrid1_UpdateCommand"
  OnDeleteCommand="RadGrid1_DeleteCommand">
  <MasterTableView AutoGenerateColumns="false" DataKeyNames="CustomerID" CommandItemDisplay="Top">
    <Columns>
      <telerik:GridEditCommandColumn />
      <telerik:GridBoundColumn UniqueName="CompanyName" DataField="CompanyName" HeaderText="CompanyName">
      </telerik:GridBoundColumn>
      <telerik:GridBoundColumn UniqueName="ContactName" DataField="ContactName" HeaderText="ContactName">
      </telerik:GridBoundColumn>
      <telerik:GridButtonColumn CommandName="Delete" Text="Delete" UniqueName="DeleteColumn">
      </telerik:GridButtonColumn>
    </Columns>
  </MasterTableView></telerik:RadGrid>
<asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/App_Data/Xml/XmlDataSourceExampleTemp.xml">
</asp:XmlDataSource>
protected void RadGrid1_UpdateCommand(object source, GridCommandEventArgs e)
{
    GridEditFormItem gridEditFormItem = (GridEditFormItem)e.Item;
    Hashtable ht = new Hashtable();
    gridEditFormItem.ExtractValues(ht);
    String customerID = e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["CustomerID"].ToString();
    XmlNode node = XmlDataSource1.GetXmlDocument().SelectSingleNode(String.Format("Customers/Customer[@CustomerID='{0}']", customerID));
    node.Attributes["CompanyName"].Value = ConvertNullToEmpty(ht["CompanyName"]);
    node.Attributes["ContactName"].Value = ConvertNullToEmpty(ht["ContactName"]);
    try
    {
        XmlDataSource1.Save();
    }
    catch (Exception ex)
    {
        lblMsg.Text = ex.Message;
    }
}
protected void RadGrid1_InsertCommand(object source, GridCommandEventArgs e)
{
    GridEditFormItem gridEditFormItem = (GridEditFormItem)e.Item;
    Hashtable ht = new Hashtable();
    gridEditFormItem.ExtractValues(ht);
    int maxCustomerId = 0;
    foreach (XmlNode selectedNode in XmlDataSource1.GetXmlDocument().SelectNodes("Customers/Customer"))
    {
        int customerId = int.Parse("0" + selectedNode.Attributes["CustomerID"].Value);
        if (customerId > maxCustomerId)
            maxCustomerId = customerId;
    }
    ht.Add("CustomerID", maxCustomerId + 1);
    XmlNode node = XmlDataSource1.GetXmlDocument().CreateElement("Customer");
    foreach (DictionaryEntry entry in ht)
    {
        XmlAttribute attribute = XmlDataSource1.GetXmlDocument().CreateAttribute(entry.Key.ToString());
        attribute.Value = ConvertNullToEmpty(entry.Value);
        node.Attributes.Append(attribute);
    }
    XmlDataSource1.GetXmlDocument().SelectSingleNode("Customers").AppendChild(node);
    try
    {
        XmlDataSource1.Save();
    }
    catch (Exception ex)
    {
        lblMsg.Text = ex.Message;
    }
}
protected void RadGrid1_DeleteCommand(object source, GridCommandEventArgs e)
{
    GridDataItem gridDataItem = (GridDataItem)e.Item;
    Hashtable ht = new Hashtable();
    gridDataItem.ExtractValues(ht);
    String customerID = e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["CustomerID"].ToString();
    XmlNode node = XmlDataSource1.GetXmlDocument().SelectSingleNode(String.Format("Customers/Customer[@CustomerID='{0}']", customerID));
    XmlNode parent = node.ParentNode;
    parent.RemoveChild(node);
    try
    {
        XmlDataSource1.Save();
    }
    catch (Exception ex)
    {
        lblMsg.Text = ex.Message;
    }
}
private String ConvertNullToEmpty(Object obj)
{
    if (obj == null)
    {
        return String.Empty;
    }
    else
    {
        return obj.ToString();
    }
}

Protected Sub RadGrid1_InsertCommand(ByVal source As Object, ByVal e As Telerik.Web.UI.GridCommandEventArgs) Handles RadGrid1.InsertCommand
    Dim gridEditFormItem As GridEditFormItem
    gridEditFormItem = e.Item
    Dim ht As Hashtable = New Hashtable()
    gridEditFormItem.ExtractValues(ht)
    Dim maxCustomerId As Integer = 0
    For Each selectedNode As XmlNode In _
      XmlDataSource1.GetXmlDocument().SelectNodes("Customers/Customer")
        Dim customerId As Integer = _
          Integer.Parse("0" + selectedNode.Attributes("CustomerID").Value)
        If customerId > maxCustomerId Then
            maxCustomerId = customerId
        End If
    Next
    ht.Add("CustomerID", maxCustomerId + 1)
    Dim node As XmlNode
    node = XmlDataSource1.GetXmlDocument().CreateElement("Customer")
    Dim entry As DictionaryEntry
    For Each entry In ht
        Dim attribute As XmlAttribute
        attribute = XmlDataSource1.GetXmlDocument().CreateAttribute(entry.Key.ToString())
        attribute.Value = ConvertNullToEmpty(entry.Value)
        node.Attributes.Append(attribute)
    Next entry
    XmlDataSource1.GetXmlDocument().SelectSingleNode("Customers").AppendChild(node)
    Try
        XmlDataSource1.Save()
    Catch ex As Exception
        lblMsg.Text = ex.Message
    End Try
End Sub
Protected Sub RadGrid1_UpdateCommand(ByVal source As Object, ByVal e As Telerik.Web.UI.GridCommandEventArgs) Handles RadGrid1.UpdateCommand
    Dim gridEditFormItem As GridEditFormItem
    gridEditFormItem = e.Item
    Dim ht As Hashtable
    ht = New Hashtable()
    gridEditFormItem.ExtractValues(ht)
    Dim customerID As String
    customerID = _
      e.Item.OwnerTableView.DataKeyValues(e.Item.ItemIndex)("CustomerID").ToString()
    Dim node As XmlNode
    node = XmlDataSource1.GetXmlDocument().SelectSingleNode(String.Format("Customers/Customer[@CustomerID='{0}']", customerID))
    node.Attributes("CompanyName").Value = ConvertNullToEmpty(ht("CompanyName"))
    node.Attributes("ContactName").Value = ConvertNullToEmpty(ht("ContactName"))
    Try
        XmlDataSource1.Save()
    Catch ex As Exception
        lblMsg.Text = ex.Message
    End Try
End Sub
Protected Sub RadGrid1_DeleteCommand(ByVal source As Object, ByVal e As Telerik.Web.UI.GridCommandEventArgs) Handles RadGrid1.DeleteCommand
    Dim gridDataItem As GridDataItem
    gridDataItem = e.Item
    Dim ht As Hashtable
    ht = New Hashtable()
    gridDataItem.ExtractValues(ht)
    Dim customerID As String
    customerID = e.Item.OwnerTableView.DataKeyValues(e.Item.ItemIndex)("CustomerID").ToString()
    Dim node As XmlNode
    node = XmlDataSource1.GetXmlDocument().SelectSingleNode(String.Format("Customers/Customer[@CustomerID='{0}']", customerID))
    Dim parent As XmlNode
    parent = node.ParentNode
    parent.RemoveChild(node)
    Try
        XmlDataSource1.Save()
    Catch ex As Exception
        lblMsg.Text = ex.Message
    End Try
End Sub
Private Function ConvertNullToEmpty(ByVal obj As Object) As String
    If (obj Is Nothing) Then
        Return String.Empty
    Else
        Return obj.ToString()
    End If
End Function

For a live example of a RadGrid that supports editing when bound to XmlDataSource, see Editing XML using XmlDataSource.