Hey guys,
My issue is to show some field value (readonly) from parent object in child view template, so that the first comes parent's field value and below it goes detail rows as usual.
In my example I had to add unnecessary public List<string> Details { get; } = new List<string>(); property to make second tab.
Is it possible to add some control to GridViewTemplate without using multiple child views?
Prepared example:
public sealed class Student
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string AdditionalInfo { get; set; }
public List<
Award
> Awards { get; } = new List<
Award
>();
public List<
string
> Details { get; } = new List<
string
>();
public static List<
Student
> GenerateList()
{
var students = new List<
Student
>();
for (int studentIndex = 1; studentIndex <= 5; studentIndex++)
{
var student = new Student()
{
Id = studentIndex,
FirstName = $"FirstName {studentIndex}",
LastName = $"LastName {studentIndex}",
AdditionalInfo = $"blah blah blah.... {studentIndex}"
};
for (int awardIndex = 1; awardIndex <= 5; awardIndex++)
{
var award = new Award()
{
FundName = $"FundName {awardIndex}",
Amount = studentIndex * 100 + awardIndex,
};
student.Awards.Add(award);
}
student.Details.Add($"unused text {studentIndex}");
students.Add(student);
}
return students;
}
}
public sealed class Award
{
public string FundName { get; set; }
public double Amount { get; set; }
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
radGridView1.ReadOnly = true;
radGridView1.Columns.Add(new GridViewTextBoxColumn("FirstName"));
radGridView1.Columns.Add(new GridViewTextBoxColumn("LastName"));
GridViewTemplate childTemplate2 = CreateChildTemplate2();
GridViewRelation relation2 = new GridViewRelation(this.radGridView1.MasterTemplate, childTemplate2);
relation2.ChildColumnNames.Add("Details");
this.radGridView1.Relations.Add(relation2);
GridViewTemplate childTemplate1 = CreateChildTemplate1();
GridViewRelation relation = new GridViewRelation(this.radGridView1.MasterTemplate, childTemplate1);
relation.ChildColumnNames.Add("Awards");
this.radGridView1.Relations.Add(relation);
this.radGridView1.DataSource = Student.GenerateList();
radGridView1.AutoGenerateColumns = false;
radGridView1.CellFormatting += RadGridView1_CellFormatting;
this.radGridView1.TableElement.PageViewMode = PageViewMode.ExplorerBar;
var aa = this.radGridView1.TableElement.PageViewProvider;
}
private void RadGridView1_CellFormatting(object sender, CellFormattingEventArgs e)
{
GridViewDataColumn column = e.CellElement.ColumnInfo as GridViewDataColumn;
if (column != null && column.OwnerTemplate.Caption == "aa")
{
e.CellElement.TableElement.Visibility = Telerik.WinControls.ElementVisibility.Hidden;
RadPageViewContentAreaElement content = e.CellElement.TableElement.Parent as RadPageViewContentAreaElement;
RadLabelElement radLabelElement = new RadLabelElement();
if (content.FindDescendant<
RadLabelElement
>() == null)
{
content.Children.Add(radLabelElement);
var row = (GridViewHierarchyRowInfo)e.CellElement.RowInfo.Parent;
var student = (Student)row.DataBoundItem;
radLabelElement.Text = student.AdditionalInfo;
}
}
else
{
e.CellElement.TableElement.Visibility = Telerik.WinControls.ElementVisibility.Visible;
RadPageViewContentAreaElement content = e.CellElement.TableElement.Parent as RadPageViewContentAreaElement;
if (content != null)
{
RadLabelElement el = content.FindDescendant<
RadLabelElement
>();
if (el != null)
{
content.Children.Remove(el);
el.Dispose();
}
}
}
}
private GridViewTemplate CreateChildTemplate1()
{
GridViewTemplate childTemplate = new GridViewTemplate();
this.radGridView1.Templates.Add(childTemplate);
GridViewTextBoxColumn column = new GridViewTextBoxColumn("FundName");
childTemplate.Columns.Add(column);
column = new GridViewTextBoxColumn("Amount");
childTemplate.Columns.Add(column);
childTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
childTemplate.Caption = "11";
return childTemplate;
}
private GridViewTemplate CreateChildTemplate2()
{
GridViewTemplate childTemplate = new GridViewTemplate();
this.radGridView1.Templates.Add(childTemplate);
GridViewTextBoxColumn column = new GridViewTextBoxColumn();
childTemplate.Columns.Add(column);
childTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
childTemplate.Caption = "aa";
return childTemplate;
}
}
Thanks