I've inherited an application with a detail template which allows in-line editing of financial and other numerical data.
Currently the grid is set up to use an editor template that shows a numeric textbox which allows 2 decimal places. The users have requested that only records of a certain type (where the finance type name contains WTE) should allow 2 decimal places, every other line should only allow whole numbers.
Is this possible whilst still showing all the rows in the same grid?
The detail template is:-
<script id=
"detailsTemplate"
type=
"text/kendo-tmpl"
>
<div style=
"font-size:x-small;"
>
@(Html.Kendo().Grid<CIPAndRecovery.Models.vFinancialDetail>()
.Name(
"Data_#=Id#"
)
.HtmlAttributes(
new
{ style =
"font-weight:normal"
})
//.TableHtmlAttributes(new { style = "padding:0px;margin:0px;", @class="TemplateGrid" })
.Events(e => e.DataBound(
"GetGroupName"
))
.Events(e => e.DataBound(
"onFinDetailColour_Databound"
))
.Events(e=>e.DataBound(
"onFinDetail_Databound"
))
.Columns(c =>
{
c.Bound(o => o.Id).Title(
"Id"
).Hidden(
true
);
c.Bound(o => o.AccountDetail_Id).Title(
"AccountDetail Id"
).Hidden(
true
);
c.Bound(o => o.FinanceGroup).Title(
"FinanceGroup"
).Hidden(
true
);
c.Bound(o => o.FinanceGroupNo).Title(
"Finance Group No"
)
.ClientGroupHeaderTemplate(
"\\#=GetGroupName( value )\\# "
).Hidden(
true
);
c.Bound(o => o.FinanceType).Title(
"Type"
).Width(60);
c.Bound(o => o.M1).EditorTemplateName(
"DecimalMinus"
).ClientTemplate(
"\\#=onFinDetailColour_Databound(M1)\\#"
);
c.Bound(o => o.M2).EditorTemplateName(
"DecimalMinus"
).ClientTemplate(
"\\#=onFinDetailColour_Databound(M2)\\#"
);
c.Bound(o => o.M3).EditorTemplateName(
"DecimalMinus"
).ClientTemplate(
"\\#=onFinDetailColour_Databound(M3)\\#"
);
c.Bound(o => o.M4).EditorTemplateName(
"DecimalMinus"
).ClientTemplate(
"\\#=onFinDetailColour_Databound(M4)\\#"
);
c.Bound(o => o.M5).EditorTemplateName(
"DecimalMinus"
).ClientTemplate(
"\\#=onFinDetailColour_Databound(M5)\\#"
);
c.Bound(o => o.M6).EditorTemplateName(
"DecimalMinus"
).ClientTemplate(
"\\#=onFinDetailColour_Databound(M6)\\#"
);
c.Bound(o => o.M7).EditorTemplateName(
"DecimalMinus"
).ClientTemplate(
"\\#=onFinDetailColour_Databound(M7)\\#"
);
c.Bound(o => o.M8).EditorTemplateName(
"DecimalMinus"
).ClientTemplate(
"\\#=onFinDetailColour_Databound(M8)\\#"
);
c.Bound(o => o.M9).EditorTemplateName(
"DecimalMinus"
).ClientTemplate(
"\\#=onFinDetailColour_Databound(M9)\\#"
);
c.Bound(o => o.M10).EditorTemplateName(
"DecimalMinus"
).ClientTemplate(
"\\#=onFinDetailColour_Databound(M10)\\#"
);
c.Bound(o => o.M11).EditorTemplateName(
"DecimalMinus"
).ClientTemplate(
"\\#=onFinDetailColour_Databound(M11)\\#"
);
c.Bound(o => o.M12).EditorTemplateName(
"DecimalMinus"
).ClientTemplate(
"\\#=onFinDetailColour_Databound(M12)\\#"
);
c.Bound(o => o.Total).Title(
"Total"
).ClientTemplate(
"\\#=onFinDetailColour_Databound(Total)\\#"
);
c.Bound(o => o.FYE).EditorTemplateName(
"DecimalMinus"
).ClientTemplate(
"\\#=onFinDetailColour_Databound(FYE)\\#"
);
//c.ForeignKey(o => o.RoleId, (System.Collections.IEnumerable)ViewData["roles"], "Id", "RoleName").Title("Role")
// .EditorTemplateName("GridForeignKey");
c.Command(command => { command.Edit().Text(
" "
).CancelText(
" "
).UpdateText(
" "
); }).Title(
"Edit"
).Width(90);
//c.Group(e => e.HeaderTemplate("<span> #=GetGroupName(FinanceGroupNo)# </span>"));
})
//.ToolBar(toolbar =>
//{
// toolbar.Create();
// //toolbar.Save().SaveText(" ").Text(" ").CancelText(" ");
//})
.Editable(editable => editable.Mode(GridEditMode.InLine))
.DataSource(dataSource => dataSource
.Ajax()
.Events(e => e.RequestEnd(
"onFinDetailChange"
))
//.Batch(true)
.PageSize(16)
.Group(group => group.Add(p => p.FinanceGroupNo))
//.Sort(s=>s.Add(p=>p.SortOrder))
.Model(m =>
{
m.Id(p => p.Id);
m.Field(e => e.FinanceType).Editable(
false
);
m.Field(e => e.Total).Editable(
false
);
//m.Field(e => e.SpecificSystemsApprover).DefaultValue(new List<SystemsFormsMVC.Models.GenericLookup>());
})
.Read(read => read.Action(
"GetFinancials"
,
"PlanActions"
,
new
{ AccDetailId =
"#= Id #"
}))
.Create(create => create.Action(
"InsertFinancial"
,
"PlanActions"
,
new
{ AccDetailId =
"#= Id #"
}).Type(HttpVerbs.Post))
.Update(update => update.Action(
"UpdateFinancial"
,
"PlanActions"
).Type(HttpVerbs.Post))
.Destroy(
delete
=>
delete
.Action(
"DeleteFinancial"
,
"PlanActions"
))
)
//.Pageable()
//.Groupable()
.ToClientTemplate()
)
</div>
</script>
The editor template is:-
@model decimal?
@(Html.Kendo().NumericTextBoxFor(m => m)
.HtmlAttributes(
new
{ style =
"width:100%"
})
.Spinners(
false
)
.Decimals(2)
)
<script>
$(
function
() {
$(
"input[type=text]"
).bind(
"focus"
,
function
() {
var
input = $(
this
);
clearTimeout(input.data(
"selectTimeId"
));
var
selectTimeId = setTimeout(
function
() {
input.select();
});
input.data(
"selectTimeId"
, selectTimeId);
}).blur(
function
(e) {
clearTimeout($(
this
).data(
"selectTimeId"
));
});
})
</script>
Thanks
I have the following grid:
@(Html.Kendo().Grid(Model.Items)
.Name("Items")
.Columns(columns =>
{
columns.Command(command => command.Custom("-").Click("deleteNominalInvoiceRowItem").HtmlAttributes(new { @class = "button-small", id = "deleteId" })).Width(40);
columns.Bound(c => c.Id).Hidden(true).FormClientTemplate("Items", "Items");
columns.Bound(c => c.NominalCode)
.ClientTemplate("#=NominalCode#")
.EditorTemplateName("NominalInvoiceItemAccountCodeTemplate")
.FormClientTemplate("Items", "Items");
columns.Bound(c => c.Description).FormClientTemplate("Items", "Items");
columns.Bound(c => c.NetAmount).HtmlAttributes(new { style = "text-align: right;" })
.ClientFooterTemplate("#= gridItemsFooterNetAmount() #").Format("{0:c}").FormClientTemplate("Items", "Items");
columns.Bound(c => c.VatAmount).HtmlAttributes(new { style = "text-align: right;" })
.ClientFooterTemplate("#= gridItemsFooterVatAmount() #").Format("{0:c}").FormClientTemplate("Items", "Items");
columns.Bound(c => c.TotalAmount).HtmlAttributes(new { style = "text-align: right;" })
.ClientFooterTemplate("#= gridItemsFooterTotalAmount() #").Format("{0:c}").FormClientTemplate("Items", "Items");
})
.HtmlAttributes(new { style = "height: 300px;" })
.Scrollable()
.Navigatable()
.Selectable(x => x.Mode(GridSelectionMode.Single).Type(GridSelectionType.Cell).Enabled(true))
.Editable(x => x.Mode(GridEditMode.InCell).CreateAt(GridInsertRowPosition.Bottom))
.ToolBar(x =>
{
x.Create().Text(RCdisplay.Add_Nominal_Invoice_Item);
x.Custom().Text(RCdisplay.Clear_All).HtmlAttributes(new { id = "clearItems" });
})
.Events(x => x.Edit("onNominalInvoiceItemsGridEdit").Change("onNominalInvoiceItemsGridEdit").Save("onNominalInvoiceItemsGridSave"))
.DataSource(dataSource => dataSource
.Ajax()
.Read(read => read.Action("InvoiceItemsGrid_Read", "Invoicing", new { Area = "Invoicing" }))
.Create(create => create.Action("InvoiceItemsGrid_Insert", "Invoicing", new { Area = "Invoicing" }))
.Update(update => update.Action("InvoiceItemsGrid_Update", "Invoicing", new { Area = "Invoicing" }))
.Model(m =>
{
m.Id(p => p.Id);
m.Field(p => p.NominalCode);
m.Field(p => p.Description);
m.Field(p => p.NetAmount);
m.Field(p => p.VatAmount);
m.Field(p => p.TotalAmount);
})
)
The EditorTemplateName causes the grid to have an empty cell (it actually contains a hidden field with the value selected) when not in edit mode.
From what i read, the ClientTemplate as I have it should display the value selected.
Is there anything else I need to do to get the selected value displayed as a span when not in edit more?
Thanks
Is there a way to format the cell contents with strike-through and coloring where only the highlighted text gets the applied format and not the whole text string within the cell?
Here is my grid:
@(Html.Kendo().Grid<
tpnconnect.com.Models.Hub.ForkLiftTruck
>()
.Name("ForkLiftTruckGrid")
.Columns(columns =>
{
columns.Bound(f => f.ForkLiftTruckID).Title("ID").Hidden(true);
columns.Bound(f => f.Deleted).Title("Deleted");
columns.Bound(f => f.HubDepotNumber).Title("Depot Number").Locked(true);
columns.Bound(f => f.HubID).Title("Hub ID").Hidden(true);
columns.Bound(f => f.TruckNumber).Title("Truck Number");
})
.Editable(editable => editable.Mode(GridEditMode.InLine))
.ToolBar(toolbar => toolbar.Create())
.Pageable()
.Sortable()
.Filterable()
.Scrollable()
.HtmlAttributes(new { style = "height:720px;" })
.DataSource(dataSource => dataSource
.Ajax()
.Events(events => events.Error("FLT_Grid_error_handler"))
.Model(model => model.Id(d => d.ForkLiftTruckID))
.PageSize(16)
.ServerOperation(false)
.Create(update => update.Action("AddForkLiftTruck", "Warehouse"))
.Read(read => read.Action("GetForkLiftTrucks", "Warehouse").Type(HttpVerbs.Get))
.Update(update => update.Action("EditForkLiftTruck", "Warehouse"))
)
)
Here's my ForkLiftTruck definition:
namespace tpnconnect.com.Models.Hub
{
public class ForkLiftTruck
{
public int ForkLiftTruckID { get; set; }
public int TruckNumber { get; set; }
public int HubID { get; set; }
public string HubDepotNumber { get; set; }
public bool Deleted { get; set; }
}
}
Here's my controller code:
[HttpGet]
public ActionResult GetForkLiftTrucks([DataSourceRequest]DataSourceRequest request)
{
int depotID = Utilities.GetUserDepotID();
List<
Models.Hub.ForkLiftTruck
> flts = new List<
Models.Hub.ForkLiftTruck
>();
using (WarehouseService.WarehouseServicesClient ws = new WarehouseService.WarehouseServicesClient())
{
var serviceFLTs = ws.GetForkLiftTrucks(depotID);
foreach (var serviceFLT in serviceFLTs)
{
Models.Hub.ForkLiftTruck flt = new Models.Hub.ForkLiftTruck()
{
Deleted = serviceFLT.Deleted,
ForkLiftTruckID = serviceFLT.ForkLiftTruckID,
HubDepotNumber = serviceFLT.HubDepotNumber,
HubID = serviceFLT.HubID,
TruckNumber = serviceFLT.TruckNumber
};
flts.Add(flt);
}
var data = flts.ToDataSourceResult(request);
return Json(data, JsonRequestBehavior.AllowGet);
}
}
Attached files:
1. screenshot of Chrome's network traffic inspector for the response to the grid's read request
2. screenshot of the Kendo UI listener seeing the data bind event
How can i apply an TemplateName or TemplateId to the Edit-Popup-Window of an TreeList?
I've got a partial-view named: MotivTreeViewViewModelEdit and i i want to set it to the Popup Window like in ASP.NET MVC Grid
....Editable(editable => editable.Mode("popup").TemplateName("MotivTreeViewViewModelEdit"))
The HtmlHelper supports the feature but i think it is not renderd.
Kind regards!
Hi!
I'm using a scheduler in cshtml:
@(Html.Kendo().Scheduler<ITSV6.Areas.CoreApp.Models.SchedulerModel>()
.Name(
"scheduler"
)
.Date(
new
DateTime(2013, 6, 13))
.StartTime(
new
DateTime(2013, 6, 13, 7, 00, 00))
.MajorTick(60)
.Views(views =>
{
views.TimelineView(timeline => timeline.EventHeight(50));
views.TimelineWeekView(timeline => timeline.EventHeight(50));
views.TimelineWorkWeekView(timeline => timeline.EventHeight(50));
views.TimelineMonthView(timeline =>
{
timeline.StartTime(
new
DateTime(2013, 6, 13, 00, 00, 00));
timeline.EndTime(
new
DateTime(2013, 6, 13, 00, 00, 00));
timeline.MajorTick(1440);
timeline.EventHeight(50);
});
})
.Timezone(
"Etc/UTC"
)
.Group(group => group.Resources(
"SchedulerName"
,
"Employees"
).Orientation(SchedulerGroupOrientation.Vertical))
.Resources(resource =>
{
resource.Add(m => m.Type)
.Title(
"Type"
)
.Name(
"Type"
)
.DataTextField(
"Text"
)
.DataValueField(
"Value"
)
.DataColorField(
"Color"
)
.BindTo(
new
[] {
new
{ Text =
"Pay Code"
, Value = 1},
new
{ Text =
"Day Off"
, Value = 2},
new
{ Text =
"Shift"
, Value = 2}
});
resource.Add(m => m.SchedulerName)
.Title(
"Scheduler Group"
)
.Name(
"SchedulerName"
)
.DataTextField(
"sg_name"
)
.DataValueField(
"sg_group"
)
.DataColorField(
"Color"
)
.DataSource(source =>
{
source.Read(read =>
{
read.Action(
"getScheduleGroups"
,
"Scheduler"
);
});
});
resource.Add(m => m.Employees)
.Title(
"Employees"
)
.Name(
"Employees"
)
.Multiple(
true
)
.DataTextField(
"FullNM"
)
.DataValueField(
"emp_id"
)
.DataColorField(
"Color"
)
.DataSource(source =>
{
source.Read(read =>
{
read.Action(
"GetEmployees"
,
"Scheduler"
);
});
});
})
.DataSource(d => d
.Model(m =>
{
m.Id(f => f.SchedulerId);
m.Field(f => f.Title).DefaultValue(
"No title"
);
m.RecurrenceId(f => f.RecurrenceId);
m.Field(f => f.Title).DefaultValue(
"No title"
);
})
//.Read("Read", "Scheduler")
.Create(
"Create"
,
"Scheduler"
)
.Destroy(
"Destroy"
,
"Scheduler"
)
.Update(
"Update"
,
"Scheduler"
)
)
The "Employee" and the "RuleName" are associated by a field called "schedulerId".
I need to group "Employees" with a "SchedulerName" only if the Employee is associated to the SchedulerName just like the attached image.
Also, I need to add an empty line as "Empty Template" for add a new "Schedule Rule" like the first line in the attached image.
Its posible to do that with the scheduler?
Thanks a lot!
Best regards!
Hi Guys
I'm sure this is just a syntax issue.. but I'm stuffed if I can work it out.
If I set my messages ( for testing only) like this in the editor template it works fine.
<div data-container-For=
"recurrenceRule"
Class=
"k-edit-field"
>
<div data-bind=
"value:recurrenceRule"
name=
"recurrenceRule"
data-role=
"recurrenceeditor"
data-frequencies=
"['never','daily','weekly']"
data-messages=
"{'frequencies':{'never':'Nie','daily':'Täglich','weekly':'Wöchentlich','monthly':'Monatlich','yearly':'Jährlich'}}"
></div>
</div>
But if I try to set the data-messages to a javascript variable I can't get it to work. ( I wan't to do this as I want to be able to change the language based on the browser language.. so I want to have an externally defined message object.)
I've tried all sorts of ways to define the variable.. but it never works
var
rmessages = {
'frequencies'
:{
'never'
:
'Nie'
,
'daily'
:
'Täglich'
,
'weekly'
:
'Wöchentlich'
,
'monthly'
:
'Monatlich'
,
'yearly'
:
'Jährlich'
}};
// var rmessages = {frequencies:{never:"Nie",daily:"Täglich",weekly:"Wöchentlich",monthly:"Monatlich",yearly:"Jährlich"}};
//-------------------------------
<div data-container-For=
"recurrenceRule"
Class=
"k-edit-field"
>
<div data-bind=
"value:recurrenceRule"
name=
"recurrenceRule"
data-role=
"recurrenceeditor"
data-frequencies=
"['never','daily','weekly']"
data-messages=
"rmessages"
></div>
</div>
When I run , it seems that the data-messages are set to 'rmessages' ( as per the attached image) however is other parts of the same template I refer to javascript variable and this works. ( e.g setting the 'data-source' for this drop down which is on the same template.
<div id=
"selectsg"
style=
"display:none;"
>
<div Class=
"k-edit-label"
><label
for
=
"SGIDId"
>Queue</label></div>
<div data-container-For=
"SGID"
Class=
"k-edit-field"
>
<input name=
"SGIDId"
type=
"text"
id=
"SGIDId"
data-role=
"combobox"
data-source=
"sgdataSource"
data-text-field=
"name"
data-value-field=
"id"
data-bind=
"value:SGID"
data-placeholder=
"Select Queue..."
data-value-primitive=
"true"
/>
</div>
</div>
Can someone please point out my stupid error in syntax or thinking!
Many thanks
Rob
asdad
Hi All,
please let me know we put dropdownlist in grid as child control? And how it populate?