This question is locked. New answers and comments are not allowed.
Have a grid with remote json kendo datasource, and in the schema/data/model I specifiy my column type: "date" and in the grid/columns i specify the format: "{0:MM/dd/yyyy hh:mm:ss}".
If I pull down the column filter and pick equal to 5/29/2012 nothing shows up but if I say is after 5/28/2012 then rows with "5/29/2012 3:15:00" show up... how can I get column filtering to work with time ignored if they only specify date (which is the only option out of box date filtering)?
If I pull down the column filter and pick equal to 5/29/2012 nothing shows up but if I say is after 5/28/2012 then rows with "5/29/2012 3:15:00" show up... how can I get column filtering to work with time ignored if they only specify date (which is the only option out of box date filtering)?
3 Answers, 1 is accepted
0
Accepted
Hi Zack,
Generally speaking, such functionality is not supported out of the box, but you could achieve it using custom implementation. The approach that I would suggest is to prevent the default filter behavior and create a custom filter function. For convenience I created a simple project which illustrates such approach in action.
Kind regards,
Iliana Nikolova
the Telerik team
Generally speaking, such functionality is not supported out of the box, but you could achieve it using custom implementation. The approach that I would suggest is to prevent the default filter behavior and create a custom filter function. For convenience I created a simple project which illustrates such approach in action.
Kind regards,
Iliana Nikolova
the Telerik team
Join us on our journey to create the world's most complete HTML 5 UI Framework - download Kendo UI now!
Vihang
commented on 07 May 2013, 01:15 PM
Top achievements
Rank 1
Hi Iliana,
I am wondering how your solution would work with Remote data binding.
Please guide me to achieve the same from server side using "IEnumerable.ToDataSourceResult(dataSourceRequest)".
Hope this helps,
Thanks & Regards,
Vihang.
I am wondering how your solution would work with Remote data binding.
Please guide me to achieve the same from server side using "IEnumerable.ToDataSourceResult(dataSourceRequest)".
Hope this helps,
Thanks & Regards,
Vihang.
BishMan
commented on 31 Jul 2013, 02:08 PM
Top achievements
Rank 1
Hello,
Can I have an example how to do this on the server side? The last comment asked the same thing but no reply.
Can I have an example how to do this on the server side? The last comment asked the same thing but no reply.
Matt
commented on 01 Aug 2013, 06:23 AM
Top achievements
Rank 1
Hi BishMan,
You can achieve this using two DateTime properties in your binding ViewModel.
e.g.
Here is a viewModel consists of two properties 'CreatedDate' and 'CreateDateTime'. 'CreateDate' would contain datetime original data from DB. 'CreateDateOnly' would contain date only data calculated from 'CreateDate'.
Now initialise your kendo grid like:
Here 'CreatedDate' is bound to the column on which "dataSourceRequest" would generate filterable/groupable clauses. 'CreatedDateOnly' is used just for display purpose to the user.
Hope this helps.
You can achieve this using two DateTime properties in your binding ViewModel.
e.g.
public class MyViewModel { public int Id { get; set; } public DateTime CreatedDate { get; set; } public DateTime CreateDateTime { get { return (this.CreatedDate.Date); } } }Now initialise your kendo grid like:
grid = jQuery("#grid").kendoGrid( { "columns": [ { "width": "140px", "title": "Date Created", "field": "CreatedDate", template: '#= kendo.toString(CreatedDateOnly,\"dd MMM yy\") #', "filterable": true, "groupable": true, attributes: { style: "text-align: center;" }}... ] });Hope this helps.
BishMan
commented on 01 Aug 2013, 02:44 PM
Top achievements
Rank 1
Hi Matt,
Thank you so much for your response this helped me a ton. I am running into a different problem. I want to display the date with date time and I want to filter using the Date only of the date time, but when I sort I want the sorting to work with DateTime as well so that the user can sort records that are run on the same day based on the time of the record. How Can I tell the grid, to filter using one value and to sort using another value. I hope my question makes sense
my code is:
I am able to filter fine, but when I sort I want the time in the date time to be part of the sorting. Any suggestions?
Thank you so much for your response this helped me a ton. I am running into a different problem. I want to display the date with date time and I want to filter using the Date only of the date time, but when I sort I want the sorting to work with DateTime as well so that the user can sort records that are run on the same day based on the time of the record. How Can I tell the grid, to filter using one value and to sort using another value. I hope my question makes sense
my code is:
columns.Bound(p => p.TimeCreatedDateOnly) .Title("Created") .ClientTemplate("#=kendo.toString(TimeCreated,'g')#");
Matt
commented on 02 Aug 2013, 06:22 AM
Top achievements
Rank 1
Hi BishMan,
I am glad that my solution helped you in your challenge.
For your next challenge, you can use this method:
and then call this method in your action method serverside:
Hope this helps.
I am glad that my solution helped you in your challenge.
For your next challenge, you can use this method:
static void ProcessSorts(DataSourceRequest request) { if (request.Sorts != null) { foreach (var sort in request.Sorts) { if (sort.Member.Equals("TimeCreatedDateOnly", StringComparison.OrdinalIgnoreCase)) sort.Member = "TimeCreated"; } } }public JsonResult GetData([DataSourceRequest] DataSourceRequest request){ ProcessFilter(request); ... DataSourceResult result = models.ToDataSourceResult(request); return Json(result);}
BishMan
commented on 02 Aug 2013, 02:11 PM
Top achievements
Rank 1
Matt,
Many thanks your advise helped me a ton. Much appreciated.
Many thanks your advise helped me a ton. Much appreciated.
0
Heiko Falk
Top achievements
Rank 1
answered on 20 Sep 2013, 11:36 AM
I found a much easier and automatic way to do solve the problem with sorting and filtering of datetime columns:
First of all, we need a class that inherits from DataSourceRequestAttribute (which is applied to all reqest parameter of grid read actions):
The CustomDataSourceRequestModelBinder:
So the only thing we need to do in future, is to use the CustomDataSourceRequestAttribute instead of the Kendo DataSourceRequestAttribute:
Simple as that!
Regards
Heiko
First of all, we need a class that inherits from DataSourceRequestAttribute (which is applied to all reqest parameter of grid read actions):
namespace MyNameSpace.Attributes{ using System.Web.Mvc; using Kendo.Mvc.UI; using KVpro.WebPflege.Definitions.ModelBinder; /// <summary> /// This class serves as a wrapper for the Kendo DataSourceRequestAttribute, which maps /// the incoming request data in aDataSourceRequest Object. This usually happens with the /// DataSourceRequestModelBinder. To get the result of the kendo model binder /// we need to use a custom model binder CustomDataSourceRequestModelBinder /// </summary> public class CustomDataSourceRequestAttribute : DataSourceRequestAttribute { public CustomDataSourceRequestAttribute(string gridName) { this.GridName = gridName; } public string GridName { get; set; } public override IModelBinder GetBinder() { return new CustomDataSourceRequestModelBinder() { GridName = this.GridName }; } }}namespace MyNamespace.ModelBinder{ using System; using System.Web.Mvc; using Kendo.Mvc; using Kendo.Mvc.UI; /// <summary> /// This class is used by the CustomDataSourceRequestAttribute, which again is beeing /// adapted in all read methods for kendo grids. The current binding context is beeing /// passed to the original kendo modelbinder. We then transform critical datetime filter /// in a correct format and return the request to the action /// </summary> public class CustomDataSourceRequestModelBinder : IModelBinder { public string GridName { get; set; } public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { // Get an instance of the original kendo model binder and call the binding method DataSourceRequestModelBinder baseBinder = new DataSourceRequestModelBinder(); DataSourceRequest request = (DataSourceRequest)baseBinder.BindModel(controllerContext, bindingContext); // If there are any filters, we may transform those which are date filters if (request.Filters.Count > 0) { foreach (IFilterDescriptor filterDescriptor in request.Filters) { this.SetDateTimeFilter(filterDescriptor); } } return request; } /// <summary> /// If a date is filtered, we need to set the time of the date to either 00:00:00 or 23:23:59. /// It's actually 00:00:00 by default, we do both ways just for convenience. /// </summary> private void SetDateTimeFilter(IFilterDescriptor typeFilterDescriptor) { if (typeFilterDescriptor is CompositeFilterDescriptor) { CompositeFilterDescriptor compositeFilterDescriptor = typeFilterDescriptor as CompositeFilterDescriptor; foreach (IFilterDescriptor filterDescriptor in compositeFilterDescriptor.FilterDescriptors) { this.SetDateTimeFilter(filterDescriptor); } } else { FilterDescriptor filterDescriptor = typeFilterDescriptor as FilterDescriptor; if (filterDescriptor.Value is DateTime) { DateTime value = (DateTime)filterDescriptor.Value; if (filterDescriptor.Operator == FilterOperator.IsGreaterThan || filterDescriptor.Operator == FilterOperator.IsGreaterThanOrEqualTo) { filterDescriptor.Value = new DateTime(value.Year, value.Month, value.Day, 0, 0, 0); } else if (filterDescriptor.Operator == FilterOperator.IsLessThan || filterDescriptor.Operator == FilterOperator.IsLessThanOrEqualTo) { filterDescriptor.Value = new DateTime(value.Year, value.Month, value.Day, 23, 59, 59); } else { throw new Exception(string.Format("Grid {0}: Not accepted filter für {1}. Operator {} is not supported", this.GridName, filterDescriptor.Member, filterDescriptor.Operator)); } } } } }}So the only thing we need to do in future, is to use the CustomDataSourceRequestAttribute instead of the Kendo DataSourceRequestAttribute:
[HttpPost] public ActionResult ReadProducts([CustomDataSourceRequestAttribute(ConstantsProvider.GridNames.Aenderungsverfolgung)] DataSourceRequest request) { DataSourceResult result = this.GetProducts().ToDataSourceResult(request); return Json(result); }Regards
Heiko
Grady
commented on 20 Nov 2013, 10:50 PM
Top achievements
Rank 1
Heiko, I just wanted to thank you for your post. You saved me hours of time probably. Thank you!
Heiko Falk
commented on 21 Nov 2013, 08:51 AM
Top achievements
Rank 1
Grady, you're welcome, glad that someone adapted my workaround!
Mario
commented on 19 Nov 2014, 09:12 AM
Top achievements
Rank 1
$("th[data-title=Date]") .data("kendoFilterMenu") .formYour attached source works pretty well with old version of Kendo Grid (2012), in newer version ".form" is not available as shown in this example. Can you please tell me the way to get to the form in latest version of Kendo Grid ?
Nicolo
commented on 12 Apr 2015, 11:35 AM
Top achievements
Rank 1
Hi Iliana
How can this custom filter be implemented with AngularJS? Could you provide an adapted version of your sample project to illustrate this?
Kind regards
Nicolo
Iliana Dyankova
commented on 16 Apr 2015, 07:38 AM
Telerik team
Hi Nicolo,
This thread is relatively old and outdated. In the latest versions Kendo UI Grid provides different filtering templates - check the following options:
- Columns.filterable.ui
- Columns.filterable.cell
- Columns.filterable.multi
If you have any particular questions please open new conversations for them.
Regards,
Iliana Nikolova
Telerik
This thread is relatively old and outdated. In the latest versions Kendo UI Grid provides different filtering templates - check the following options:
- Columns.filterable.ui
- Columns.filterable.cell
- Columns.filterable.multi
If you have any particular questions please open new conversations for them.
Regards,
Iliana Nikolova
Telerik
Join us on our journey to create the world's most complete HTML 5 UI Framework - download Kendo UI now!
0
Hi Mario,
In order to get the form I would suggest to use the suggested logic in the filterMenuInit (instead of the $(document).ready()).
Regards,
Iliana Nikolova
Telerik
In order to get the form I would suggest to use the suggested logic in the filterMenuInit (instead of the $(document).ready()).
Regards,
Iliana Nikolova
Telerik
Join us on our journey to create the world's most complete HTML 5 UI Framework - download Kendo UI now!