Occasionally, you will have a need to have a form element of one binder being bound to another data source. Sitefinity client binders support nesting of GenericCollectionBinder inside of other binders and in this article we will demonstrate how to nest a bound SELECT element, bound RADIO list and bound CHECKBOX list.
Before We start, though, let us take a look at the following screenshots to visualize the task that we wish to accomplish.
<div id="storeForm" runat="server">
</div>
<sitefinity:FormBinder ID="formBinder" runat="server"
ServiceUrl="~/Sitefinity/Services/Commerce/Stores.svc"
TargetId="storeForm"
OnClientBinderInitialized="FormBinderInitialized"
OnClientItemDataBound="FormItemDataBound"
DataKeyNames="Id"
DataMembers="Name, Description, ManagerName">
<Containers>
<sitefinity:BinderContainer runat="server">
<fieldset>
<legend>Store info:</legend>
<label for="Name">Store name:</label>
<br />
<input id="Name" type="text" value="{{Name}}" />
<br />
<label for="Description">Store description:</label>
<br />
<textarea id="Description" rows="5">{{Description}}</textarea>
<br />
<label for="ManagerName">Manager name:</label>
<br />
<select id="ManagerName" class="optionList"></select>
<br />
<input type="button" value="Save" sys:onclick="SaveStore();" />
or
<a sys:href="#" sys:onclick="CancelStore();">Cancel</a>
</fieldset>
</sitefinity:BinderContainer>
</Containers>
</sitefinity:FormBinder>
The ItemEventArgs object passed to us in this function eases the whole process quite a lot. Let us examine this code line by line:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="StoresDropDown.aspx.cs" Inherits="StoresDropDown" %>
<%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %>
<%@ Register TagPrefix="sitefinity" Namespace="Telerik.Sitefinity.Web.UI" Assembly="Telerik.Sitefinity" %>
<head runat="server">
<title></title>
</head>
<form id="form1" runat="server">
<asp:ScriptManager ID="scriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Name="MicrosoftAjax.js" Path="~/Sitefinity/Scripts/MicrosoftAjax.js" />
<asp:ScriptReference ScriptMode="Inherit" Path="~/Sitefinity/Scripts/MicrosoftAjaxTemplates.js" />
<asp:ScriptReference ScriptMode="Inherit" Path="~/Sitefinity/Scripts/MicrosoftAjaxAdoNet.js" />
</Scripts>
</asp:ScriptManager>
<h2>
Stores drop down
</h2>
<a href="Employees.aspx">Employees</a>
|
<strong>Stores drop down</strong>
|
<a href="StoresCheckboxes.aspx">Stores checkboxes</a>
|
<a href="StoresRadioButtons.aspx">Stores radiobuttons</a>
<hr />
<input id="NewStoreButton" type="button" value="New store" onclick="NewStore();" />
<div id="storeForm" runat="server">
</div>
<telerik:RadGrid ID="storesGrid" runat="server" AutoGenerateColumns="false">
<MasterTableView>
<Columns>
<telerik:GridTemplateColumn UniqueName="BinderContainer0"></telerik:GridTemplateColumn>
<telerik:GridTemplateColumn UniqueName="BinderContainer1"></telerik:GridTemplateColumn>
<telerik:GridTemplateColumn UniqueName="BinderContainer2"></telerik:GridTemplateColumn>
<telerik:GridTemplateColumn UniqueName="BinderContainer3"></telerik:GridTemplateColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
<sitefinity:FormBinder ID="formBinder" runat="server"
ServiceUrl="~/Sitefinity/Services/Commerce/Stores.svc"
TargetId="storeForm"
OnClientBinderInitialized="FormBinderInitialized"
OnClientItemDataBound="FormItemDataBound"
DataKeyNames="Id"
DataMembers="Name, Description, ManagerName">
<Containers>
<sitefinity:BinderContainer runat="server">
<fieldset>
<legend>Store info:</legend>
<label for="Name">Store name:</label>
<br />
<input id="Name" type="text" value="{{Name}}" />
<br />
<label for="Description">Store description:</label>
<br />
<textarea id="Description" rows="5">{{Description}}</textarea>
<br />
<label for="ManagerName">Manager name:</label>
<br />
<select id="ManagerName" class="optionList"></select>
<br />
<input type="button" value="Save" sys:onclick="SaveStore();" />
or
<a sys:href="#" sys:onclick="CancelStore();">Cancel</a>
</fieldset>
</sitefinity:BinderContainer>
</Containers>
</sitefinity:FormBinder>
<sitefinity:RadGridBinder ID="gridBinder" runat="server"
ServiceUrl="~/Sitefinity/Services/Commerce/Stores.svc"
TargetId="storesGrid"
BindOnLoad="true"
OnClientBinderInitialized="GridBinderInitialized"
OnClientItemEditCommand="GridEditCommand"
DataKeyNames="Id"
DataMembers="Name, Description, ManagerName">
<Containers>
<sitefinity:BinderContainer runat="server">
<input type="button" value="Edit" class="editCommand" />
</sitefinity:BinderContainer>
<sitefinity:BinderContainer runat="server">
{{Name}}
</sitefinity:BinderContainer>
<sitefinity:BinderContainer runat="server">
{{Description}}
</sitefinity:BinderContainer>
<sitefinity:BinderContainer runat="server">
{{ManagerName}}
</sitefinity:BinderContainer>
</Containers>
</sitefinity:RadGridBinder>
<sitefinity:GenericCollectionBinder ID="employeesBinder" runat="server"
ServiceUrl="~/Sitefinity/Services/Commerce/Employees.svc"
OnClientBinderInitialized="EmployeesBinderInitialized"
DataKeyNames="Id"
DataMembers="Name">
<Containers>
<sitefinity:BinderContainer runat="server" RenderContainer="false" TemplateHolderTag="Select">
<option value="{{Name}}">{{Name}}</option>
</sitefinity:BinderContainer>
</Containers>
</sitefinity:GenericCollectionBinder>
<script type="text/javascript">
var formBinder;
var gridBinder;
var employeesBinder;
function FormBinderInitialized(sender, args) {
formBinder = sender;
formBinder.AddValidationRule('Name', 'required', 'Name is a required field');
}
function GridBinderInitialized(sender, args) {
gridBinder = sender;
}
function EmployeesBinderInitialized(sender, args) {
employeesBinder = sender;
}
function NewStore() {
formBinder.New();
formBinder.get_globalDataKeys()["Id"] = formBinder.GetEmptyGuid();
}
function SaveStore() {
if (formBinder.SaveChanges()) {
formBinder.ClearTarget();
gridBinder.DataBind();
}
}
function CancelStore() {
formBinder.ClearTarget();
return false;
}
function GridEditCommand(sender, args) {
formBinder.get_globalDataKeys()["Id"] = args.get_key()["Id"];
formBinder.DataBind();
}
function FormItemDataBound(sender, args) {
var target = args.FindControl('ManagerName');
if (args.get_dataItem()) {
employeesBinder.set_selectedValue(args.get_dataItem().ManagerName);
}
employeesBinder.set_target(target);
employeesBinder.DataBind();
}
</script>
</body>
</html>