6 Answers, 1 is accepted
0
Hello Henri,
Thank you for writing.
In order to achieve your goal, please follow the code snippet below:
Our Unbound Mode and Load-On-Demand Hierarchy help articles introduce more detailed information.
I hope this information helps. Should you have further questions, I would be glad to help.
Regards,
Desislava
Telerik
Thank you for writing.
In order to achieve your goal, please follow the code snippet below:
public
Form1()
{
InitializeComponent();
this
.radGridView1.Columns.Add(
new
GridViewTextBoxColumn(
"A"
));
this
.radGridView1.Columns.Add(
new
GridViewTextBoxColumn(
"B"
));
GridViewRowInfo rowInfo =
this
.radGridView1.Rows.AddNew();
rowInfo.Cells[0].Value =
"A1"
;
rowInfo.Cells[1].Value =
"B1"
;
rowInfo =
this
.radGridView1.Rows.AddNew();
rowInfo.Cells[
"A"
].Value =
"A2"
;
rowInfo.Cells[
"B"
].Value =
"B2"
;
this
.radGridView1.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
GridViewTemplate template1 =
new
GridViewTemplate();
template1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
template1.Columns.Add(
"C"
);
template1.Columns.Add(
"D"
);
this
.radGridView1.MasterTemplate.Templates.Add(template1);
template1.HierarchyDataProvider =
new
GridViewEventDataProvider(template1);
this
.radGridView1.RowSourceNeeded +=
new
GridViewRowSourceNeededEventHandler(radGridView1_RowSourceNeeded);
GridViewTemplate template2 =
new
GridViewTemplate();
template2.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
template2.Columns.Add(
"E"
);
template2.Columns.Add(
"F"
);
template1.Templates.Add(template2);
template2.HierarchyDataProvider =
new
GridViewEventDataProvider(template2);
GridViewTemplate template3 =
new
GridViewTemplate();
template3.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
template3.Columns.Add(
"G"
);
template3.Columns.Add(
"H"
);
template2.Templates.Add(template3);
template3.HierarchyDataProvider =
new
GridViewEventDataProvider(template3);
}
void
radGridView1_RowSourceNeeded(
object
sender, GridViewRowSourceNeededEventArgs e)
{
for
(
int
i = 0; i < 5; i++)
{
GridViewRowInfo row = e.Template.Rows.NewRow();
switch
(e.ParentRow.HierarchyLevel)
{
case
0:
row.Cells[
"C"
].Value =
"C"
+ i;
row.Cells[
"D"
].Value =
"D"
+ i;
break
;
case
1:
row.Cells[
"E"
].Value =
"E"
+ i;
row.Cells[
"F"
].Value =
"F"
+ i;
break
;
case
2:
row.Cells[
"G"
].Value =
"G"
+ i;
row.Cells[
"H"
].Value =
"H"
+ i;
break
;
default
:
break
;
}
e.SourceCollection.Add(row);
}
}
Our Unbound Mode and Load-On-Demand Hierarchy help articles introduce more detailed information.
I hope this information helps. Should you have further questions, I would be glad to help.
Regards,
Desislava
Telerik
Check out Telerik Analytics, the service which allows developers to discover app usage patterns, analyze user data, log exceptions, solve problems and profile application performance at run time. Watch the videos and start improving your app based on facts, not hunches.
0
Henri
Top achievements
Rank 1
answered on 28 Oct 2014, 08:43 AM
Hello,
That worked fine, but now I have another problem.
I want to add a new row programmatically on the first child level.
So, in a Button-Click Event I added the following code:
GridViewRowInfo child = radGridView1.MasterTemplate.Templates[0].Rows.AddNew();
The child is ALWAYS null, I cannot seem to add a row to any child level.
I upgraded to the latest Version Q3'14 but that didn't help.
Can you please point me in the right direction?
Thanks!
That worked fine, but now I have another problem.
I want to add a new row programmatically on the first child level.
So, in a Button-Click Event I added the following code:
GridViewRowInfo child = radGridView1.MasterTemplate.Templates[0].Rows.AddNew();
The child is ALWAYS null, I cannot seem to add a row to any child level.
I upgraded to the latest Version Q3'14 but that didn't help.
Can you please point me in the right direction?
Thanks!
0
Hello Henri,
Thank you for writing back.
When you use load on demand approach for populating the grid templates with data, the RowSourceNeeded event is the place where you can add rows for the respective level. That is why the AddNew method returns null in this case. I would suggest you to store the data for each template in a DataTable for example and on the RadButton.Click event to add a new row for the respective DataTable. In order to force the RowSourceNeeded event to fire you should call the Refresh method for the respective template. Thus, you will fill the template's data from the DataTable containing the new row.
I hope this information helps. If you have any additional questions, please let me know.
Regards,
Desislava
Telerik
Thank you for writing back.
When you use load on demand approach for populating the grid templates with data, the RowSourceNeeded event is the place where you can add rows for the respective level. That is why the AddNew method returns null in this case. I would suggest you to store the data for each template in a DataTable for example and on the RadButton.Click event to add a new row for the respective DataTable. In order to force the RowSourceNeeded event to fire you should call the Refresh method for the respective template. Thus, you will fill the template's data from the DataTable containing the new row.
I hope this information helps. If you have any additional questions, please let me know.
Regards,
Desislava
Telerik
Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.
0
Henri
Top achievements
Rank 1
answered on 29 Oct 2014, 11:53 AM
Hello Desislave,
This means that in order to be able to add a row, the gridview has to be bound, instead of unbound.
Is there a way to mimic load-on-demand with for instance the Expanding event?
This way the grid can remain unbound.
Regards,
Henri
This means that in order to be able to add a row, the gridview has to be bound, instead of unbound.
Is there a way to mimic load-on-demand with for instance the Expanding event?
This way the grid can remain unbound.
Regards,
Henri
0
Accepted
Hello Henri,
Thank you for writing back.
The MasterTemplate.Rows.AddNew method successfully adds a new row to the master template as it is not in load on demand mode. It uses unbound mode as it is demonstrated in the code snippet below. Load on demand hierarchy approach requires a HierarchyDataProvider for the child GridViewTemplate where in the RowSourceNeeded event you can populate the desired child rows on demand ,e.g. when the master row is expanded. This provider is responsible for the data population. In order to add a new row to the first child level when a button is clicked you can use a simple flag or counter to indicate how many rows to be added to the specific template. Hence, when the button is clicked you can increase the counter and refresh the respective template in order to force the RowSourceNeeded. However, it is up to you how you will store the data that will be added.
I would like to note that RadGridView allows different approaches for setting up the hierarchy: bound mode, unbound mode, load on demand. These are separate ways which manipulate data differently. You can find additional information in the referred help articles.
I hope this information helps. If you have any additional questions, please let me know.
Regards,
Desislava
Telerik
Thank you for writing back.
The MasterTemplate.Rows.AddNew method successfully adds a new row to the master template as it is not in load on demand mode. It uses unbound mode as it is demonstrated in the code snippet below. Load on demand hierarchy approach requires a HierarchyDataProvider for the child GridViewTemplate where in the RowSourceNeeded event you can populate the desired child rows on demand ,e.g. when the master row is expanded. This provider is responsible for the data population. In order to add a new row to the first child level when a button is clicked you can use a simple flag or counter to indicate how many rows to be added to the specific template. Hence, when the button is clicked you can increase the counter and refresh the respective template in order to force the RowSourceNeeded. However, it is up to you how you will store the data that will be added.
public
Form1()
{
InitializeComponent();
this
.radGridView1.Columns.Add(
new
GridViewTextBoxColumn(
"A"
));
this
.radGridView1.Columns.Add(
new
GridViewTextBoxColumn(
"B"
));
GridViewRowInfo rowInfo =
this
.radGridView1.Rows.AddNew();
rowInfo.Cells[0].Value =
"A1"
;
rowInfo.Cells[1].Value =
"B1"
;
rowInfo =
this
.radGridView1.Rows.AddNew();
rowInfo.Cells[
"A"
].Value =
"A2"
;
rowInfo.Cells[
"B"
].Value =
"B2"
;
this
.radGridView1.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
GridViewTemplate template1 =
new
GridViewTemplate();
template1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
template1.Columns.Add(
"C"
);
template1.Columns.Add(
"D"
);
this
.radGridView1.MasterTemplate.Templates.Add(template1);
template1.HierarchyDataProvider =
new
GridViewEventDataProvider(template1);
this
.radGridView1.RowSourceNeeded +=
new
GridViewRowSourceNeededEventHandler(radGridView1_RowSourceNeeded);
GridViewTemplate template2 =
new
GridViewTemplate();
template2.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
template2.Columns.Add(
"E"
);
template2.Columns.Add(
"F"
);
template1.Templates.Add(template2);
template2.HierarchyDataProvider =
new
GridViewEventDataProvider(template2);
GridViewTemplate template3 =
new
GridViewTemplate();
template3.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
template3.Columns.Add(
"G"
);
template3.Columns.Add(
"H"
);
template2.Templates.Add(template3);
template3.HierarchyDataProvider =
new
GridViewEventDataProvider(template3);
}
void
radGridView1_RowSourceNeeded(
object
sender, GridViewRowSourceNeededEventArgs e)
{
switch
(e.ParentRow.HierarchyLevel)
{
case
0:
for
(
int
i = 0; i < counterLevel0; i++)
{
GridViewRowInfo row = e.Template.Rows.NewRow();
row.Cells[
"C"
].Value =
"C"
+ i;
row.Cells[
"D"
].Value =
"D"
+ i;
e.SourceCollection.Add(row);
}
break
;
case
1:
for
(
int
i = 0; i < counterLevel1; i++)
{
GridViewRowInfo row = e.Template.Rows.NewRow();
row.Cells[
"E"
].Value =
"E"
+ i;
row.Cells[
"F"
].Value =
"F"
+ i;
e.SourceCollection.Add(row);
}
break
;
case
2:
for
(
int
i = 0; i < counterLevel2; i++)
{
GridViewRowInfo row = e.Template.Rows.NewRow();
row.Cells[
"G"
].Value =
"G"
+ i;
row.Cells[
"H"
].Value =
"H"
+ i;
e.SourceCollection.Add(row);
}
break
;
default
:
break
;
}
}
int
counterLevel0 = 5;
int
counterLevel1 = 5;
int
counterLevel2 = 5;
private
void
radButton1_Click(
object
sender, EventArgs e)
{
counterLevel0++;
this
.radGridView1.MasterTemplate.Templates[0].Refresh();
}
I would like to note that RadGridView allows different approaches for setting up the hierarchy: bound mode, unbound mode, load on demand. These are separate ways which manipulate data differently. You can find additional information in the referred help articles.
I hope this information helps. If you have any additional questions, please let me know.
Regards,
Desislava
Telerik
Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.
0
Henri
Top achievements
Rank 1
answered on 30 Oct 2014, 10:30 AM
Hello Desislava,
Thank you, I came to the same solution here on my side, I created a child Row, placed it in a private variable, forced a refresh, and added it to the SourceCollection when it was not null.
Best regards,
Henri
Thank you, I came to the same solution here on my side, I created a child Row, placed it in a private variable, forced a refresh, and added it to the SourceCollection when it was not null.
Best regards,
Henri