This is a migrated thread and some comments may be shown as answers.

BatchEdit get DataItem upon EditItemTemplate binding.

2 Answers 66 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Graham
Top achievements
Rank 1
Graham asked on 07 Mar 2019, 05:00 PM

Hello,

I'm currently looking into using a grid with Batch Editing and custom EditItemTemplates.  I'm running into a wall because I need the custom template for editing to render differently depending on the values in the DataItem object for the row that is being edited.

I've created an example that is attached, and will describe it to hopefully outline what I'm trying to do.  

In a database that contains people, some people are under organizations, and within those organizations are different bosses.  I've created a dictionary that contains the list of bosses for 2 organizations with Id's 0 and 1.  The grid shows a list of people, and if you go to edit the boss selection for any given person I'm trying to have the drop down list display different items in the list depending on the organization id for that person.

Because the DataBinding event does not fire for custom templates that are used on the EditItemTemplate property of a TemplateColumn I'm at a loss on how to do this.  I've thought of creating a new class that inherits the Control class, then overriding the Render() function in hopes that I may be able to access the DataItem through the parent hierarchy but my knowledge of the RadGrid structure isn't enough to figure this out.

Here is a simple example of my code.  I've made comments in the InstantiateIn function with what I'm trying to do.

 

Any help would be greatly appreciated and thanks in advance.

 

TestItemTemplate.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestItemTemplate.aspx.cs" Inherits="Test_TestItemTemplate" %>
 
<!DOCTYPE html>
 
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <telerik:RadScriptManager ID="ScriptManager" runat="server" EnableTheming="True">
    </telerik:RadScriptManager>
        <div>
            <asp:Panel runat="server" ID="Panel" >
                <telerik:RadGrid runat="server" ID="grid">
                </telerik:RadGrid>
            </asp:Panel>
        </div>
    </form>
</body>
</html>

 

TestItemTemplate.aspx.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
 
public partial class Test_TestItemTemplate : Page
{
    private class GridItemTemplate : ITemplate
    {
        string _colName;
        public GridItemTemplate(string colName)
        {
            _colName = colName;
        }
 
        public void InstantiateIn(Control container)
        {
            Label label = new Label();
            label.DataBinding += new EventHandler(Label_DataBinding);
            container.Controls.Add(label);
        }
 
        void Label_DataBinding(object sender, EventArgs e)
        {
            Label label = (Label)sender;
            GridDataItem container = (GridDataItem)label.NamingContainer;
            label.Text = ((DataRowView)container.DataItem)[_colName].ToString();
        }
    }
 
    private class GridEditItemTemplate : ITemplate
    {
        Dictionary<int, List<ListItem>> organizationBosses = new Dictionary<int, List<ListItem>>
        {
            { 0, new List<ListItem> { new ListItem("Harry"), new ListItem("Jim") } },
            { 1, new List<ListItem> { new ListItem("Jen") } }
        };
 
        string _colName;
        public GridEditItemTemplate(string colName)
        {
            _colName = colName;
        }
 
        public void InstantiateIn(Control container)
        {
            DropDownList ddl = new DropDownList();
            // Add the default item
            ddl.Items.Add(new ListItem("Self"));
 
            // This event will never fire to my knowledge
            // ddl.DataBinding += new EventHandler(ddl_databinding);
 
             
            // Somehow get the parent DataItem container upon rendering to retrieve the "OrganizationId" value from the dataitem so I can show the additional items for the Boss drop down list
            // If (OrganizationId == 0)
            // ddl.Items.AddRange(organizationBosses[0].ToArray());
            // Else if (OrganizationId == 1)
            // ddl.Items.AddRange(organizationBosses[1].ToArray());
 
            container.Controls.Add(ddl);
        }
    }
 
    protected void Page_Init(object sender, EventArgs e)
    {
        grid.AutoGenerateColumns = false;
 
        GridBoundColumn boundColumn1 = new GridBoundColumn();
        boundColumn1.DataField = "PersonId";
        boundColumn1.UniqueName = "PersonId";
        boundColumn1.Display = false;
        grid.MasterTableView.Columns.Add(boundColumn1);
        boundColumn1.DataField = "OrganizationId";
        boundColumn1.UniqueName = "OrganizationId";
        boundColumn1.Display = false;
        grid.MasterTableView.Columns.Add(boundColumn1);
        boundColumn1 = new GridBoundColumn();
        boundColumn1.DataField = "FirstName";
        boundColumn1.UniqueName = "FirstName";
        boundColumn1.HeaderText = "First Name";
        grid.MasterTableView.Columns.Add(boundColumn1);
        boundColumn1 = new GridBoundColumn();
        boundColumn1.DataField = "LastName";
        boundColumn1.UniqueName = "LastName";
        boundColumn1.HeaderText = "Last Name";
        grid.MasterTableView.Columns.Add(boundColumn1);
        boundColumn1 = new GridBoundColumn();
        boundColumn1.DataField = "Email";
        boundColumn1.UniqueName = "Email";
        boundColumn1.HeaderText = "Email";
        grid.MasterTableView.Columns.Add(boundColumn1);
 
        GridTemplateColumn templateColumn = new GridTemplateColumn();
        GridItemTemplate itemTemplate = new GridItemTemplate("Boss");
        templateColumn.ItemTemplate = itemTemplate;
        GridEditItemTemplate editItemTemplate = new GridEditItemTemplate("Boss");      
        templateColumn.EditItemTemplate = editItemTemplate;
        templateColumn.HeaderText = "Boss";
        grid.MasterTableView.Columns.Add(templateColumn);
 
        grid.MasterTableView.EditMode = GridEditMode.Batch;
        grid.MasterTableView.BatchEditingSettings.EditType = GridBatchEditingType.Cell;
        grid.MasterTableView.BatchEditingSettings.OpenEditingEvent = GridBatchEditingEventType.Click;
 
        grid.DataSource = GetDataSource();
        grid.AllowPaging = true;
        grid.PageSize = 50;
    }
 
    private DataTable GetDataSource()
    {
        DataTable dataSource = new DataTable();
        dataSource.Columns.AddRange(new DataColumn[] {
            new DataColumn("PersonId"),
            new DataColumn("OrganizationId"),
            new DataColumn("FirstName"),
            new DataColumn("LastName"),
            new DataColumn("Email"),
            new DataColumn("Boss")
        });
 
        dataSource.Rows.Add(new object[] { 0, null, "John", "Doe", "john@doe.com", "Self" });
        dataSource.Rows.Add(new object[] { 1, 0, "Bill", "Carson", "bill@carson.com", "Harry"});
        dataSource.Rows.Add(new object[] { 2, 0, "Jessie", "Jones", "jessie@jones.com", "Jim"});
        dataSource.Rows.Add(new object[] { 3, 1, "Joe", "Schmoe", "joe@schmoe.com", "Jen" });
        dataSource.Rows.Add(new object[] { 4, null, "Sarah", "Conner", "sarah@conner.com", "Self" });
 
        return dataSource;
    }
}

2 Answers, 1 is accepted

Sort by
0
Graham
Top achievements
Rank 1
answered on 12 Mar 2019, 04:05 PM

Just wondering if anybody has had a chance to look at this.

Thanks in advance.

0
Attila Antal
Telerik team
answered on 14 Mar 2019, 04:57 PM
Hi Graham,

Since BatchEditing is a client-side model and uses JavaScript logic to operate, only one editor is rendered for each column. The same editor is re-used for all records in that colum. If you wish to customize the default behavior, you can place a RadComboBox with LoadOnDemand functionality in the EditItemTemplate and  utilize the BatchEditing API to get access to the control and change its datasource by sending parameters while the combo is requesting data from the server.

BatchEditing documentations:

Batch Editing Overview
Batch Editing Client-side API

We have a code library sample that demonstrates a similar scenario: RadGrid with LoadOnDemand ComboBox in Batch Edit Mode

The following documentations will help you get a better understanding on this functionality and allow you to implement the desired behavior:

Load on demand functionality: Automatic Load On Demand
Loading from a Web Service: Loading Items from a Web Service
Passing custom parameters: Passing Context Information to the Server

Kind regards,
Attila Antal
Progress Telerik
Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
Tags
Grid
Asked by
Graham
Top achievements
Rank 1
Answers by
Graham
Top achievements
Rank 1
Attila Antal
Telerik team
Share this question
or