or
public class test{ public string name { get; set; } public BindingList<childs> childlist { get; set; }}public class childs{ public string childname { get; set; }}private void form_Load(object sender, EventArgs e) { BindingList<test> testlist = new BindingList<test>(); /** I populate my list with data. I wont show this here. After the list is populated: **// this.raggrid.MasterTemplate.Columns.Clear(); this.raggrid.MasterTemplate.AutoGenerateColumns = true; this.raggrid.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; this.raggrid.MasterTemplate.Columns.Add(new GridViewTextBoxColumn("name", "name")); GridViewTemplate template = new GridViewTemplate(); this.raggrid.Templates.Add(template); template.Columns.Add(new GridViewTextBoxColumn("name", "childname")); template.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; GridViewRelation relation = new GridViewRelation(this.raggrid.MasterTemplate, template); relation.ChildColumnNames.Add("childlist"); this.raggrid.Relations.Add(relation); this.raggrid.DataSource = testlist;}
{ public delegate void GroupHeaderCellButtonClickEventHandler(object sender, GroupHeaderButtonClickEventArgs e); public partial class CustomGridView : RadGridView { public event GroupHeaderCellButtonClickEventHandler GroupHeaderCellButtonClick; public CustomGridView() { InitializeComponent(); base.CreateCell += new GridViewCreateCellEventHandler(CustomGridView_CreateCell); } void CustomGridView_CreateCell(object sender, GridViewCreateCellEventArgs e) { if (e.CellType == typeof(GridGroupContentCellElement) && e.Row.GetType() == typeof(GridGroupHeaderRowElement)) { e.CellElement = new RadCustomGroupContentCell(e.Column, e.Row); RadCustomGroupContentCell cellElement = (RadCustomGroupContentCell)e.CellElement; cellElement.InternalGroupHeaderCellButtonClick+=new GroupHeaderCellButtonClickEventHandler(cellElement_InternalGroupHeaderCellButtonClick); } } void cellElement_InternalGroupHeaderCellButtonClick(object sender, GroupHeaderButtonClickEventArgs e) { if (GroupHeaderCellButtonClick != null) { GroupHeaderCellButtonClick(sender, e); } } public override string ThemeClassName { get { return typeof(RadGridView).FullName; } set { } } protected internal class RadCustomGroupContentCell : GridGroupContentCellElement { public event GroupHeaderCellButtonClickEventHandler InternalGroupHeaderCellButtonClick; RadButtonElement theButton; public RadCustomGroupContentCell(GridViewColumn column, GridRowElement row) : base(column, row) { } protected override void DisposeManagedResources() { theButton.Click -= new EventHandler(theButton_Click); base.DisposeManagedResources(); } void theButton_Click(object sender, EventArgs e) { InternalGroupHeaderCellButtonClick(sender, new GroupHeaderButtonClickEventArgs((GridViewGroupRowInfo)this.RowInfo)); } protected override void CreateChildElements() { base.CreateChildElements(); theButton = new RadButtonElement(); theButton.Click += new EventHandler(theButton_Click); theButton.Text = "Insert"; theButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; theButton.Image = Resources.InsertRow16; this.Children.Add(theButton); } protected override SizeF ArrangeOverride(SizeF finalSize) { SizeF size = base.ArrangeOverride(finalSize); float buttonX =2; float buttonY = 4; RectangleF buttonRectangle = new RectangleF(buttonX, buttonY, theButton.DesiredSize.Width + 4, theButton.DesiredSize.Height + 2); theButton.Arrange(buttonRectangle); float buttonAndTextX = theButton.DesiredSize.Width + 4; RectangleF clientRect = new RectangleF(buttonAndTextX + buttonX, 0, finalSize.Width - buttonAndTextX - buttonX, finalSize.Height + 4); this.layoutManagerPart.Arrange(clientRect); return size; } protected override Type ThemeEffectiveType { get { return typeof(GridGroupContentCellElement); } set { } } } } }public class GroupHeaderButtonClickEventArgs:EventArgs { public GridViewGroupRowInfo GroupRowInfo { get; set; } public GroupHeaderButtonClickEventArgs(GridViewGroupRowInfo groupRowInfo) { this.GroupRowInfo = groupRowInfo; } }