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.
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.Collections.Generic;
usingSystem.Text;
publicclassPerson {
publicconststring CategorySeparator = ", ";
int id;
string name;
List<Category> categories;
publicPerson(int id, string name, params Category[] categories) {
this.id = id;
this.name = name;
this.categories = new List<Category>(categories);
}
publicint ID { get { return id; } }
publicstring Name {
get { return name; }
set { name = value; }
}
public List<Category> Categories { get { return categories; } }
publicstring 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();
}
}
}
<%--BeginRegionPagesetup--%><%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default" %><%@Registerassembly="DevExpress.Web.v15.1"namespace="DevExpress.Web"tagprefix="dxwgv" %><%--EndRegion--%><!DOCTYPE htmlPUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml" ><headrunat="server"><title>How to use standard ListControl with multi-select feature in the ASPxGridView</title></head><body><formid="form1"runat="server"><dxwgv:ASPxGridViewID="Grid"runat="server"KeyFieldName="ID"AutoGenerateColumns="false"OnRowUpdating="Grid_RowUpdating" ><SettingsEditingMode="Inline" /><Columns><dxwgv:GridViewCommandColumnVisibleIndex="0"ShowEditButton="True"/><dxwgv:GridViewDataTextColumnFieldName="Name"VisibleIndex="1" /><dxwgv:GridViewDataTextColumnFieldName="CategoriesString"Caption="Categories"VisibleIndex="2" ><%--BeginRegionEditItemTemplate--%><EditItemTemplate><asp:CheckBoxListID="List"runat="server"DataValueField="Name"DataSource="<%# Categories %>"OnDataBound="List_DataBound" /></EditItemTemplate><%--EndRegion--%></dxwgv:GridViewDataTextColumn></Columns></dxwgv:ASPxGridView></form></body></html>
ImportsMicrosoft.VisualBasicImportsSystemImportsSystem.DataImportsSystem.ConfigurationImportsSystem.WebImportsSystem.Web.SecurityImportsSystem.Web.UIImportsSystem.Web.UI.WebControlsImportsSystem.Web.UI.WebControls.WebPartsImportsSystem.Web.UI.HtmlControlsImportsSystem.Collections.GenericImportsDevExpress.Web.DataImportsSystem.CollectionsImportsDevExpress.WebPartialPublicClass _Default
Inherits System.Web.UI.Page
ProtectedReadOnlyProperty Persons() As List(Of Person)
GetConstkeyAsString = "DX1"If Session(key) IsNothingThen
Session(key) = CreatePersons()
EndIfReturnCType(Session(key), List(Of Person))
EndGetEndPropertyProtectedReadOnlyProperty Categories() As List(Of Category)
GetConstkeyAsString = "DX2"If Session(key) IsNothingThen
Session(key) = CreateCategories()
EndIfReturnCType(Session(key), List(Of Category))
EndGetEndPropertyProtectedOverridesSub OnInit(ByVal e As EventArgs)
MyBase.OnInit(e)
Grid.DataSource = Persons
Grid.DataBind()
EndSubProtectedSub Grid_RowUpdating(ByVal sender AsObject, 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)
EndIf
person.Categories.Clear()
ForEach item As ListItem In list.Items
If item.Selected Then
person.Categories.Add(FindCategoryByName(item.Value))
EndIfNext item
e.Cancel = True
Grid.CancelEdit()
EndSubProtectedFunction FindCategoryByName(ByVal categoryName AsString) As Category
ForEach item As Category In Categories
If item.Name = categoryName ThenReturn item
EndIfNext item
ReturnNothingEndFunctionProtectedFunction FindPersonById(ByVal id AsInteger) As Person
ForEach item As Person In Persons
If item.ID = id ThenReturn item
EndIfNext item
ReturnNothingEndFunctionProtectedFunction 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
EndFunctionProtectedFunction 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
EndFunctionProtectedSub List_DataBound(ByVal sender AsObject, 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())
ForEach item As ListItem In list.Items
item.Selected = hash.Contains(item.Value)
Next item
EndSubPrivateFunction CreatePersonCategoriesHash(ByVal catString AsString) As IDictionary
Dim table AsNew Hashtable()
Dim names() AsString = catString.Split(NewString() { Person.CategorySeparator }, StringSplitOptions.None)
ForEach name AsStringIn names
table.Add(name, Nothing)
Next name
Return table
EndFunction' workaround for std ListControl LoadPostDataPrivateSub LoadListControlPostDataOnCallback(ByVal control As ListControl)
If (Not Grid.IsEditing) ThenReturnEndIfForEach item As ListItem In control.Items
item.Selected = FalseNext item
ForEachkeyAsStringIn Request.Params.AllKeys
Dim dataHandler As IPostBackDataHandler = TryCast(control, IPostBackDataHandler)
Ifkey.StartsWith(control.UniqueID) Then
dataHandler.LoadPostData(key, Request.Params)
EndIfNextkeyEndSubEndClass
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.
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)