diff --git a/GridView/GridObjectRelationalCRUD/Description.md b/GridView/GridObjectRelationalCRUD/Description.md
new file mode 100644
index 0000000..a0a0f2a
--- /dev/null
+++ b/GridView/GridObjectRelationalCRUD/Description.md
@@ -0,0 +1,16 @@
+## Environment
+
+
+ Product Version |
+ 2015.1.331 |
+
+
+ Product |
+ RadGridView for WinForms |
+
+
+
+
+## Description
+
+This solution aims to show you a sample approach how to implement CRUD operations for the inner hierarchy levels in **RadGridView**. A complete step by step tutorial is available in the [RadGridView CRUD in Object Relational Hierarchy Mode](https://docs.telerik.com/devtools/winforms/knowledge-base/radgridview-crud-in-object-relational-hierarchy-mode) article.
diff --git a/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS.sln b/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS.sln
new file mode 100644
index 0000000..6737177
--- /dev/null
+++ b/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GridObjectRelationalCRUD-CS", "GridObjectRelationalCRUD-CS\GridObjectRelationalCRUD-CS.csproj", "{27F3F356-2BB0-4BDF-99CD-EBC0692D05A6}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {27F3F356-2BB0-4BDF-99CD-EBC0692D05A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {27F3F356-2BB0-4BDF-99CD-EBC0692D05A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {27F3F356-2BB0-4BDF-99CD-EBC0692D05A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {27F3F356-2BB0-4BDF-99CD-EBC0692D05A6}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS/Form1.Designer.cs b/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS/Form1.Designer.cs
new file mode 100644
index 0000000..9a78191
--- /dev/null
+++ b/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS/Form1.Designer.cs
@@ -0,0 +1,70 @@
+namespace GridObjectRelationalCRUD
+{
+ partial class Form1
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.radGridView1 = new Telerik.WinControls.UI.RadGridView();
+ ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.radGridView1.MasterTemplate)).BeginInit();
+ this.SuspendLayout();
+ //
+ // radGridView1
+ //
+ this.radGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.radGridView1.Location = new System.Drawing.Point(13, 13);
+ this.radGridView1.Name = "radGridView1";
+ this.radGridView1.Size = new System.Drawing.Size(661, 501);
+ this.radGridView1.TabIndex = 0;
+ this.radGridView1.Text = "radGridView1";
+ this.radGridView1.UserAddingRow += new Telerik.WinControls.UI.GridViewRowCancelEventHandler(this.radGridView1_UserAddingRow);
+ this.radGridView1.UserAddedRow += new Telerik.WinControls.UI.GridViewRowEventHandler(this.radGridView1_UserAddedRow);
+ this.radGridView1.UserDeletedRow += new Telerik.WinControls.UI.GridViewRowEventHandler(this.radGridView1_UserDeletedRow);
+ this.radGridView1.CellValueChanged += new Telerik.WinControls.UI.GridViewCellEventHandler(this.radGridView1_CellValueChanged);
+ //
+ // Form1
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(686, 526);
+ this.Controls.Add(this.radGridView1);
+ this.Name = "Form1";
+ this.Text = "Form1";
+ ((System.ComponentModel.ISupportInitialize)(this.radGridView1.MasterTemplate)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.radGridView1)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private Telerik.WinControls.UI.RadGridView radGridView1;
+ }
+}
+
diff --git a/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS/Form1.cs b/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS/Form1.cs
new file mode 100644
index 0000000..e2bbbe6
--- /dev/null
+++ b/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS/Form1.cs
@@ -0,0 +1,182 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using Telerik.WinControls.UI;
+using Telerik.WinControls;
+using System.Collections;
+using System.IO;
+using System.Runtime.Serialization.Formatters.Binary;
+using System.Runtime.Serialization;
+using System.Xml.Serialization;
+
+using GridObjectRelationalCRUD.Models;
+
+namespace GridObjectRelationalCRUD
+{
+ public partial class Form1 : Form
+ {
+ public Form1()
+ {
+ InitializeComponent();
+ }
+
+
+ protected override void OnLoad(EventArgs e)
+ {
+ base.OnLoad(e);
+
+ this.radGridView1.DataSource = DataContext.Artists;
+ this.radGridView1.AutoGenerateHierarchy = true;
+
+ this.SetupTemplates();
+ }
+
+ private void SetupTemplates()
+ {
+ this.radGridView1.EnableFiltering = true;
+ this.radGridView1.Columns["Id"].IsVisible = false;
+ this.radGridView1.Columns["Albums"].IsVisible = false;
+ this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
+
+ this.radGridView1.Templates[0].AllowAddNewRow = true;
+ this.radGridView1.Templates[0].Columns["Id"].IsVisible = false;
+ this.radGridView1.Templates[0].Columns["ArtistId"].IsVisible = false;
+ this.radGridView1.Templates[0].Columns["Tracks"].IsVisible = false;
+ this.radGridView1.Templates[0].AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
+
+ this.radGridView1.Templates[0].Templates[0].AllowAddNewRow = true;
+ this.radGridView1.Templates[0].Templates[0].Columns["Id"].IsVisible = false;
+ this.radGridView1.Templates[0].Templates[0].Columns["Size"].IsVisible = false;
+ this.radGridView1.Templates[0].Templates[0].AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
+ }
+
+ private void radGridView1_CellValueChanged(object sender, GridViewCellEventArgs e)
+ {
+ if (e.Row is GridViewNewRowInfo || e.Row is GridViewFilteringRowInfo)
+ {
+ return;
+ }
+
+ if (e.Row.HierarchyLevel > 0)
+ {
+ this.SetBoundValue(e.Row.DataBoundItem, e.Column.FieldName, e.Value);
+ e.Row.InvalidateRow();
+ }
+ }
+
+ private void radGridView1_UserAddingRow(object sender, GridViewRowCancelEventArgs e)
+ {
+ GridViewRowInfo row = e.Rows[0];
+ if (row.HierarchyLevel == 0)
+ {
+ return;
+ }
+
+ GridViewRelation relation = this.radGridView1.Relations.Find(row.ViewTemplate.Parent, row.ViewTemplate);
+ GridViewRowInfo parentRow = row.Parent as GridViewRowInfo;
+ PropertyDescriptorCollection parentProperties = ListBindingHelper.GetListItemProperties(parentRow.DataBoundItem);
+ PropertyDescriptor childDescriptor = parentProperties.Find(relation.ChildColumnNames[0], true);
+ if (childDescriptor != null)
+ {
+ IList children = childDescriptor.GetValue(parentRow.DataBoundItem) as IList;
+ if (children != null)
+ {
+ object newItem = Activator.CreateInstance(ListBindingHelper.GetListItemType(children));
+ bool success = true;
+ foreach (GridViewColumn column in row.ViewTemplate.Columns)
+ {
+ if (column.IsVisible && !column.ReadOnly && row.Cells[column.FieldName].Value != null && success)
+ {
+ success = success & this.SetBoundValue(newItem, column.FieldName, row.Cells[column.FieldName].Value);
+ }
+ }
+
+ if (!success)
+ {
+ e.Cancel = true;
+ }
+ else
+ {
+ children.Add(newItem);
+ }
+ }
+ }
+ }
+
+ private void radGridView1_UserAddedRow(object sender, GridViewRowEventArgs e)
+ {
+ e.Row.ViewTemplate.Refresh();
+ }
+
+ private void radGridView1_UserDeletedRow(object sender, GridViewRowEventArgs e)
+ {
+ GridViewRowInfo[] rows = e.Rows;
+ for (int i = 0; i < (int)rows.Length; i++)
+ {
+ GridViewRowInfo row = rows[i];
+ if (row.HierarchyLevel != 0)
+ {
+ GridViewRelation relation = this.radGridView1.Relations.Find(row.ViewTemplate.Parent, row.ViewTemplate);
+ GridViewRowInfo parentRow = row.Parent as GridViewRowInfo;
+ PropertyDescriptorCollection parentProperties = ListBindingHelper.GetListItemProperties(parentRow.DataBoundItem);
+ PropertyDescriptor childDescriptor = parentProperties.Find(relation.ChildColumnNames[0], true);
+ if (childDescriptor != null)
+ {
+ IList children = childDescriptor.GetValue(parentRow.DataBoundItem) as IList;
+ if (children != null)
+ {
+ children.Remove(row.DataBoundItem);
+ row.ViewInfo.Refresh();
+
+ foreach (var childRow in row.ViewInfo.ChildRows)
+ {
+ childRow.InvalidateRow();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private bool SetBoundValue(object dataBoundItem, string propertyName, object value)
+ {
+ PropertyDescriptor descriptor = TypeDescriptor.GetProperties(dataBoundItem).Find(propertyName, true);
+ if (value != null)
+ {
+ try
+ {
+ Type type = Nullable.GetUnderlyingType(descriptor.PropertyType);
+ if (descriptor.Converter != null && type != null && type.IsGenericType)
+ {
+ value = descriptor.Converter.ConvertFromInvariantString(value.ToString());
+ }
+ descriptor.SetValue(dataBoundItem, value);
+ return true;
+ }
+ catch
+ {
+ RadMessageBox.Show(string.Concat("Invalid property value for ", propertyName), "Error", MessageBoxButtons.OK, RadMessageIcon.Error);
+ return false;
+ }
+ }
+ else
+ {
+ try
+ {
+ descriptor.SetValue(dataBoundItem, value);
+ }
+ catch
+ {
+ descriptor.SetValue(dataBoundItem, DBNull.Value);
+ }
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS/Form1.resx b/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS/Form1.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS/Form1.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS/GridObjectRelationalCRUD-CS.csproj b/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS/GridObjectRelationalCRUD-CS.csproj
new file mode 100644
index 0000000..0cb6798
--- /dev/null
+++ b/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS/GridObjectRelationalCRUD-CS.csproj
@@ -0,0 +1,110 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {27F3F356-2BB0-4BDF-99CD-EBC0692D05A6}
+ WinExe
+ Properties
+ GridObjectRelationalCRUD
+ GridObjectRelationalCRUD
+ v4.0
+ 512
+
+
+ x86
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\..\..\work\Development\bin\Debug\Telerik.WinControls.dll
+
+
+ False
+ C:\Users\merdjanov\Desktop\DLLs\Telerik_UI_For_WinForms_2015_1_331_Dev_hotfix\Bin40\Telerik.WinControls.GridView.dll
+
+
+ ..\..\..\work\Development\bin\Debug\Telerik.WinControls.UI.dll
+
+
+ ..\..\..\work\Development\bin\Debug\TelerikCommon.dll
+
+
+
+
+
+
+
+ Form
+
+
+ Form1.cs
+
+
+
+
+
+ Form1.cs
+
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+ True
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS/Model/Album.cs b/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS/Model/Album.cs
new file mode 100644
index 0000000..009ea7e
--- /dev/null
+++ b/GridView/GridObjectRelationalCRUD/gridobjectrelationalcrud-cs/GridObjectRelationalCRUD-CS/Model/Album.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+
+namespace GridObjectRelationalCRUD.Models
+{
+ [Serializable]
+ public class Album
+ {
+ private int id;
+ private int artistId;
+ private string title;
+ private List