Back to Devexpress

ASPxGridView.FindEditRowCellTemplateControl(GridViewDataColumn, String) Method

aspnet-devexpress-dot-web-dot-aspxgridview-dot-findeditrowcelltemplatecontrol-x28-devexpress-dot-web-dot-gridviewdatacolumn-system-dot-string-x29.md

latest22.2 KB
Original Source

ASPxGridView.FindEditRowCellTemplateControl(GridViewDataColumn, String) Method

Searches for the specified server control contained within the specified cell’s template.

Namespace : DevExpress.Web

Assembly : DevExpress.Web.v25.2.dll

NuGet Package : DevExpress.Web

Declaration

csharp
public Control FindEditRowCellTemplateControl(
    GridViewDataColumn gridViewDataColumn,
    string id
)
vb
Public Function FindEditRowCellTemplateControl(
    gridViewDataColumn As GridViewDataColumn,
    id As String
) As Control

Parameters

NameTypeDescription
gridViewDataColumnGridViewDataColumn

A GridViewDataColumn descendant that represents the data column.

| | id | String |

A String value that identifies the control within the specified cell.

|

Returns

TypeDescription
Control

A Control object that represents the control contained within the specified cell’s template.

|

Remarks

For more information, see Templates.

Online Example

View Example: How to use cascading combo boxes in inline edit mode

Example

The example shows how to edit a grid column's value with a multi-selection control (CheckBoxList).

The grid displays a person list. A person may belong to different categories. A person's categories are stored as comma separated values. When editing, the grid displays a CheckBoxList with category names to be assigned to a person. This example loads data from the Session.

csharp
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using DevExpress.Web.Data;
using System.Collections;
using DevExpress.Web;

public partial class _Default : System.Web.UI.Page {
    protected List<Person> Persons {
        get {
            const string key = "DX1";
            if(Session[key] == null) {
                Session[key] = CreatePersons();
            }
            return (List<Person>)Session[key];
        }
    }
    protected List<Category> Categories {
        get {
            const string key = "DX2";
            if(Session[key] == null) {
                Session[key] = CreateCategories();
            }
            return (List<Category>)Session[key];
        }
    }

    protected override void OnInit(EventArgs e) {
        base.OnInit(e);
        Grid.DataSource = Persons;
        Grid.DataBind();
    }

    protected void Grid_RowUpdating(object sender, ASPxDataUpdatingEventArgs e) {
        Person person = FindPersonById((int)e.Keys[0]);
        person.Name = e.NewValues["Name"].ToString();

        CheckBoxList list = (CheckBoxList)Grid.FindEditRowCellTemplateControl((GridViewDataColumn)Grid.Columns[2], "List");        
        if(Grid.IsCallback)
            LoadListControlPostDataOnCallback(list);

        person.Categories.Clear();
        foreach(ListItem item in list.Items) {
            if(item.Selected)
                person.Categories.Add(FindCategoryByName(item.Value));
        }

        e.Cancel = true;
        Grid.CancelEdit();
    }

    protected Category FindCategoryByName(string categoryName) {
        foreach (Category item in Categories) {
            if(item.Name == categoryName)
                return item;
        }
        return null;
    }
    protected Person FindPersonById(int id) {
        foreach(Person item in Persons) {
            if(item.ID == id)
                return item;
        }
        return null;
    }

    protected List<Person> CreatePersons() {
        List<Person> persons = new List<Person>();
        persons.Add(new Person(1, "Alex", Categories[1], Categories[2]));
        persons.Add(new Person(2, "Bill", Categories[0]));
        persons.Add(new Person(3, "Kate", Categories[2]));
        return persons;
    }
    protected List<Category> CreateCategories() {
        List<Category> categories = new List<Category>();
        categories.Add(new Category("Family"));
        categories.Add(new Category("Friends"));
        categories.Add(new Category("Business"));
        return categories;
    }

    protected void List_DataBound(object sender, EventArgs e) {
        CheckBoxList list = (CheckBoxList)sender;
        GridViewEditItemTemplateContainer container = (GridViewEditItemTemplateContainer)list.Parent;
        IDictionary hash = CreatePersonCategoriesHash(container.Grid.GetRowValues(container.VisibleIndex, "CategoriesString").ToString());
        foreach(ListItem item in list.Items)
            item.Selected = hash.Contains(item.Value);
    }
    IDictionary CreatePersonCategoriesHash(string catString) {
        Hashtable table = new Hashtable();
        string[] names = catString.Split(new string[] { Person.CategorySeparator }, StringSplitOptions.None);
        foreach(string name in names)
            table.Add(name, null);
        return table;
    }

    // workaround for std ListControl LoadPostData
    void LoadListControlPostDataOnCallback(ListControl control) {
        if(!Grid.IsEditing) return;
        foreach(ListItem item in control.Items)
            item.Selected = false;
        foreach(string key in Request.Params.AllKeys) {
            IPostBackDataHandler dataHandler = control as IPostBackDataHandler;
            if(key.StartsWith(control.UniqueID))
                dataHandler.LoadPostData(key, Request.Params);
        }
    }
}
csharp
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.Text;

public class Person {
    public const string CategorySeparator = ", ";

    int id;
    string name;
    List<Category> categories;

    public Person(int id, string name, params Category[] categories) {
        this.id = id;
        this.name = name;
        this.categories = new List<Category>(categories);
    }

    public int ID { get { return id; } }
    public string Name {
        get { return name; }
        set { name = value; }
    }
    public List<Category> Categories { get { return categories; } }
    public string CategoriesString {
        get {
            StringBuilder builder = new StringBuilder();
            foreach(Category item in Categories) {
                if(builder.Length > 0)
                    builder.Append(CategorySeparator);
                builder.Append(item.Name);
            }
            return builder.ToString();
        } 
    }
}
aspx
<%-- BeginRegion Page setup --%>
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register assembly="DevExpress.Web.v15.1" namespace="DevExpress.Web" tagprefix="dxwgv" %>
<%-- EndRegion --%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>How to use standard ListControl with multi-select feature in the ASPxGridView</title>
</head>
<body>
    <form id="form1" runat="server">
        <dxwgv:ASPxGridView ID="Grid" runat="server" KeyFieldName="ID" AutoGenerateColumns="false"
            OnRowUpdating="Grid_RowUpdating" >
            <SettingsEditing Mode="Inline" />
            <Columns>
                <dxwgv:GridViewCommandColumn VisibleIndex="0" ShowEditButton="True"/>
                <dxwgv:GridViewDataTextColumn FieldName="Name" VisibleIndex="1" />
                <dxwgv:GridViewDataTextColumn FieldName="CategoriesString" Caption="Categories" VisibleIndex="2" >
                <%-- BeginRegion EditItemTemplate --%>
                    <EditItemTemplate>
                        <asp:CheckBoxList ID="List" runat="server" DataValueField="Name" 
                            DataSource="<%# Categories %>" OnDataBound="List_DataBound" />
                    </EditItemTemplate>
                <%-- EndRegion --%>
                </dxwgv:GridViewDataTextColumn>
            </Columns>
        </dxwgv:ASPxGridView>
    </form>
</body>
</html>
csharp
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public class Category {
    string name;

    public Category(string name) {
        this.name = name;
    }

    public string Name { get { return name; } }
}
vb
Imports Microsoft.VisualBasic
Imports System
Imports System.Data
Imports System.Configuration
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Imports System.Web.UI.HtmlControls
Imports System.Collections.Generic
Imports DevExpress.Web.Data
Imports System.Collections
Imports DevExpress.Web

Partial Public Class _Default
    Inherits System.Web.UI.Page

    Protected ReadOnly Property Persons() As List(Of Person)
        Get
            Const key As String = "DX1"
            If Session(key) Is Nothing Then
                Session(key) = CreatePersons()
            End If
            Return CType(Session(key), List(Of Person))
        End Get
    End Property
    Protected ReadOnly Property Categories() As List(Of Category)
        Get
            Const key As String = "DX2"
            If Session(key) Is Nothing Then
                Session(key) = CreateCategories()
            End If
            Return CType(Session(key), List(Of Category))
        End Get
    End Property

    Protected Overrides Sub OnInit(ByVal e As EventArgs)
        MyBase.OnInit(e)
        Grid.DataSource = Persons
        Grid.DataBind()
    End Sub

    Protected Sub Grid_RowUpdating(ByVal sender As Object, ByVal e As ASPxDataUpdatingEventArgs)
        Dim person As Person = FindPersonById(CInt(Fix(e.Keys(0))))
        person.Name = e.NewValues("Name").ToString()

        Dim list As CheckBoxList = CType(Grid.FindEditRowCellTemplateControl(CType(Grid.Columns(2), GridViewDataColumn), "List"), CheckBoxList)
        If Grid.IsCallback Then
            LoadListControlPostDataOnCallback(list)
        End If

        person.Categories.Clear()
        For Each item As ListItem In list.Items
            If item.Selected Then
                person.Categories.Add(FindCategoryByName(item.Value))
            End If
        Next item

        e.Cancel = True
        Grid.CancelEdit()
    End Sub

    Protected Function FindCategoryByName(ByVal categoryName As String) As Category
        For Each item As Category In Categories
            If item.Name = categoryName Then
                Return item
            End If
        Next item
        Return Nothing
    End Function
    Protected Function FindPersonById(ByVal id As Integer) As Person
        For Each item As Person In Persons
            If item.ID = id Then
                Return item
            End If
        Next item
        Return Nothing
    End Function

    Protected Function CreatePersons() As List(Of Person)
        Dim persons As List(Of Person) = New List(Of Person)()
        persons.Add(New Person(1, "Alex", Categories(1), Categories(2)))
        persons.Add(New Person(2, "Bill", Categories(0)))
        persons.Add(New Person(3, "Kate", Categories(2)))
        Return persons
    End Function
    Protected Function CreateCategories() As List(Of Category)
        Dim categories As List(Of Category) = New List(Of Category)()
        categories.Add(New Category("Family"))
        categories.Add(New Category("Friends"))
        categories.Add(New Category("Business"))
        Return categories
    End Function

    Protected Sub List_DataBound(ByVal sender As Object, ByVal e As EventArgs)
        Dim list As CheckBoxList = CType(sender, CheckBoxList)
        Dim container As GridViewEditItemTemplateContainer = CType(list.Parent, GridViewEditItemTemplateContainer)
        Dim hash As IDictionary = CreatePersonCategoriesHash(container.Grid.GetRowValues(container.VisibleIndex, "CategoriesString").ToString())
        For Each item As ListItem In list.Items
            item.Selected = hash.Contains(item.Value)
        Next item
    End Sub
    Private Function CreatePersonCategoriesHash(ByVal catString As String) As IDictionary
        Dim table As New Hashtable()
        Dim names() As String = catString.Split(New String() { Person.CategorySeparator }, StringSplitOptions.None)
        For Each name As String In names
            table.Add(name, Nothing)
        Next name
        Return table
    End Function

    ' workaround for std ListControl LoadPostData
    Private Sub LoadListControlPostDataOnCallback(ByVal control As ListControl)
        If (Not Grid.IsEditing) Then
            Return
        End If
        For Each item As ListItem In control.Items
            item.Selected = False
        Next item
        For Each key As String In Request.Params.AllKeys
            Dim dataHandler As IPostBackDataHandler = TryCast(control, IPostBackDataHandler)
            If key.StartsWith(control.UniqueID) Then
                dataHandler.LoadPostData(key, Request.Params)
            End If
        Next key
    End Sub
End Class
vb
Imports Microsoft.VisualBasic
Imports System
Imports System.Data
Imports System.Configuration
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Imports System.Web.UI.HtmlControls

Public Class Category
    Private name_Renamed As String

    Public Sub New(ByVal name As String)
        Me.name_Renamed = name
    End Sub

    Public ReadOnly Property Name() As String
        Get
            Return name_Renamed
        End Get
    End Property
End Class
aspx
<%-- BeginRegion Page setup --%>
<%@ Page Language="vb" AutoEventWireup="true" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<%@ Register assembly="DevExpress.Web.v15.1" namespace="DevExpress.Web" tagprefix="dxwgv" %>
<%-- EndRegion --%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>How to add ListControl (CheckBoxList) in EditItemTemplate</title>
</head>
<body>
    <form id="form1" runat="server">
        <dxwgv:ASPxGridView ID="Grid" runat="server" KeyFieldName="ID" AutoGenerateColumns="false"
            OnRowUpdating="Grid_RowUpdating" >
            <SettingsEditing Mode="Inline" />
            <Columns>
                <dxwgv:GridViewCommandColumn VisibleIndex="0" ShowEditButton="True"/>
                <dxwgv:GridViewDataTextColumn FieldName="Name" VisibleIndex="1" />
                <dxwgv:GridViewDataTextColumn FieldName="CategoriesString" Caption="Categories" VisibleIndex="2" >
                <%-- BeginRegion EditItemTemplate --%>
                    <EditItemTemplate>
                        <asp:CheckBoxList ID="List" runat="server" DataValueField="Name" DataSource="<%#Categories%>" OnDataBound="List_DataBound" />
                    </EditItemTemplate>
                <%-- EndRegion --%>
                </dxwgv:GridViewDataTextColumn>
            </Columns>
        </dxwgv:ASPxGridView>
    </form>
</body>
</html>
vb
Imports Microsoft.VisualBasic
Imports System
Imports System.Data
Imports System.Configuration
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Imports System.Web.UI.HtmlControls
Imports System.Collections.Generic
Imports System.Text

Public Class Person
    Public Const CategorySeparator As String = ", "

    Private id_Renamed As Integer
    Private name_Renamed As String
    Private categories_Renamed As List(Of Category)

    Public Sub New(ByVal id As Integer, ByVal name As String, ParamArray ByVal categories() As Category)
        Me.id_Renamed = id
        Me.name_Renamed = name
        Me.categories_Renamed = New List(Of Category)(categories)
    End Sub

    Public ReadOnly Property ID() As Integer
        Get
            Return id_Renamed
        End Get
    End Property
    Public Property Name() As String
        Get
            Return name_Renamed
        End Get
        Set(ByVal value As String)
            name_Renamed = value
        End Set
    End Property
    Public ReadOnly Property Categories() As List(Of Category)
        Get
            Return categories_Renamed
        End Get
    End Property
    Public ReadOnly Property CategoriesString() As String
        Get
            Dim builder As New StringBuilder()
            For Each item As Category In Categories
                If builder.Length > 0 Then
                    builder.Append(CategorySeparator)
                End If
                builder.Append(item.Name)
            Next item
            Return builder.ToString()
        End Get
    End Property
End Class

The following code snippets (auto-collected from DevExpress Examples) contain references to the FindEditRowCellTemplateControl(GridViewDataColumn, String) method.

Note

The algorithm used to collect these code examples remains a work in progress. Accordingly, the links and snippets below may produce inaccurate results. If you encounter an issue with code examples below, please use the feedback form on this page to report the issue.

asp-net-web-forms-grid-use-cascading-combo-boxes-in-inline-edit-mode/CS/MultiCombo/Default.aspx.cs#L12

csharp
Session["Cat1ID"] = combo1.Value;
ASPxComboBox combo2 = ((ASPxComboBox)grid.FindEditRowCellTemplateControl(
    grid.Columns["Category2ID"] as GridViewDataComboBoxColumn, "Cat2"));

asp-net-web-forms-grid-set-edit-form-values/CS/Solution/ServerSide.aspx.cs#L19

csharp
ASPxGridView grid = (ASPxGridView)sender;
ASPxSpinEdit unitPriceEditor = (ASPxSpinEdit)grid.FindEditRowCellTemplateControl(((GridViewDataColumn)grid.Columns["UnitPrice"]), "UnitPriceEditor");
ASPxSpinEdit unitsInStockEditor = (ASPxSpinEdit)grid.FindEditRowCellTemplateControl(((GridViewDataColumn)grid.Columns["UnitsInStock"]), "UnitsInStockEditor");

asp-net-web-forms-grid-initialize-editor-conditionally/CS/WebApplication_Grid/CustomEditItem.aspx.cs#L32

csharp
ASPxEdit editor = (ASPxEdit)grid.FindEditRowCellTemplateControl((GridViewDataColumn)grid.Columns["DataValue"], editorID);
e.NewValues["DataValue"] = editor.Value.ToString();

asp-net-web-forms-grid-use-cascading-combo-boxes-in-inline-edit-mode/VB/MultiCombo/Default.aspx.vb#L16

vb
Session("Cat1ID") = combo1.Value
Dim combo2 As ASPxComboBox = (CType(grid.FindEditRowCellTemplateControl(TryCast(grid.Columns("Category2ID"), GridViewDataComboBoxColumn), "Cat2"), ASPxComboBox))
combo2.Value = Nothing

asp-net-web-forms-grid-set-edit-form-values/VB/Solution/ServerSide.aspx.vb#L22

vb
Dim grid As ASPxGridView = CType(sender, ASPxGridView)
Dim unitPriceEditor As ASPxSpinEdit = CType(grid.FindEditRowCellTemplateControl(CType(grid.Columns("UnitPrice"), GridViewDataColumn), "UnitPriceEditor"), ASPxSpinEdit)
Dim unitsInStockEditor As ASPxSpinEdit = CType(grid.FindEditRowCellTemplateControl(CType(grid.Columns("UnitsInStock"), GridViewDataColumn), "UnitsInStockEditor"), ASPxSpinEdit)

asp-net-web-forms-grid-initialize-editor-conditionally/VB/WebApplication_Grid/CustomEditItem.aspx.vb#L30

vb
Dim editor As ASPxEdit = CType(grid.FindEditRowCellTemplateControl(CType(grid.Columns("DataValue"), GridViewDataColumn), editorID), ASPxEdit)
e.NewValues("DataValue") = editor.Value.ToString()

See Also

Grid View

ASPxGridView Class

ASPxGridView Members

DevExpress.Web Namespace