Telerik Grid Filter not working on Date column

后端 未结 2 918
無奈伤痛
無奈伤痛 2021-01-29 02:17

I have a Telerik Grid with one of the column having Date Time values, but the filter on that field is not working as the filter only accepts date by default. Is there any way we

相关标签:
2条回答
  • 2021-01-29 02:58
    protected void ItemsRadGrid_ItemCommand(object source, GridCommandEventArgs e)
        {
            if (e.CommandName == RadGrid.FilterCommandName)
            {
                try
                {
                    FillItemsGrid();
                    FilterByDate(ItemsRadGrid, e);
                }
                catch (Exception ex)
                {
                    //ExceptionLogClass.InsertError(ex);
                }
    
            }
    
        }
    
    public static void FilterByDate(RadGrid grid, GridCommandEventArgs e)
        {
            Pair filterPair = e.CommandArgument as Pair;
            string columnName = Convert.ToString(filterPair.Second);
            if (filterPair.First.ToString() == "NoFilter")
            { }
            else
            {
                if (grid.Columns.FindByDataField(columnName).DataType.Name == "DateTime")
                {
                    try
                    {
                        TextBox FilterColumnField = ((TextBox)((GridFilteringItem)e.Item)[columnName].Controls[0]);
                        string oldDate = FilterColumnField.Text;
                        FilterColumnField.Text = DateTime.ParseExact(FilterColumnField.Text, "dd.MM.yyyy", CultureInfo.InvariantCulture).ToString("MM/dd/yyyy 12:00:00 tt");
                    }
                    catch (FormatException)
                    {
                        e.Canceled = true;
                    }
                }
            }
        }
    
    0 讨论(0)
  • 2021-01-29 03:08

    I know it's an old post but I will put a solution for those people search for it

    I have customized this solution, it works with all scenarios and you can use it also if you have more than one column have a date time filter use this function in the need data source event first put this function in your code

      Protected Sub manageDateFilter(ByVal columnName As String, ByVal source As Object, ByVal filter As String, ByVal columnindex As Integer)
    
    
            Select Case DirectCast(DirectCast(source, Telerik.Web.UI.RadGrid).Columns.Item(columnindex), Telerik.Web.UI.GridDateTimeColumn).CurrentFilterFunction
                Case GridKnownFunction.EqualTo
                    Dim date1 As datetime = convert.todatetime(DirectCast(DirectCast(source, Telerik.Web.UI.RadGrid).Columns.Item(columnindex), Telerik.Web.UI.GridDateTimeColumn).CurrentFilterValue)
    
    
                    grdReport.MasterTableView.FilterExpression = filter.replace("([" + columnName + "] = " + filter.substring(filter.indexof(columnName) + (columnName.length + 4)).trim().substring(0, filter.substring(filter.indexof(columnName) + (columnName.length + 4)).indexof("M") + 2) + ")".trim(), "([" + columnName + "] >= '" + date1.tostring() + "') AND ([" + columnName + "] < '" + date1.affffdays(1).tostring() + "')")
    
                Case GridKnownFunction.NotEqualTo
                    Dim date1 As datetime = convert.todatetime(DirectCast(DirectCast(source, Telerik.Web.UI.RadGrid).Columns.Item(columnindex), Telerik.Web.UI.GridDateTimeColumn).CurrentFilterValue)
    
    
                    grdReport.MasterTableView.FilterExpression = filter.replace("([" + columnName + "] <> " + filter.substring(filter.indexof(columnName) + (columnName.length + 4)).trim().substring(0, filter.substring(filter.indexof(columnName) + (columnName.length + 5)).indexof("M") + 2) + ")".trim(), "(([" + columnName + "] < '" + date1.tostring() + "') OR ([" + columnName + "] >= '" + date1.affffdays(1).tostring() + "'))")
    
                Case GridKnownFunction.GreaterThanOrEqualTo
                    Dim date1 As datetime = convert.todatetime(DirectCast(DirectCast(source, Telerik.Web.UI.RadGrid).Columns.Item(columnindex), Telerik.Web.UI.GridDateTimeColumn).CurrentFilterValue)
    
    
                    grdReport.MasterTableView.FilterExpression = filter.replace("([" + columnName + "] >= " + filter.substring(filter.indexof(columnName) + (columnName.length + 4)).trim().substring(0, filter.substring(filter.indexof(columnName) + (columnName.length + 4)).indexof("M") + 2) + ")".trim(), "([" + columnName + "] >= '" + date1.tostring() + "')")
    
                Case GridKnownFunction.LessThanOrEqualTo
                    Dim date1 As datetime = convert.todatetime(DirectCast(DirectCast(source, Telerik.Web.UI.RadGrid).Columns.Item(columnindex), Telerik.Web.UI.GridDateTimeColumn).CurrentFilterValue)
    
    
                    grdReport.MasterTableView.FilterExpression = filter.replace("([" + columnName + "] <= " + filter.substring(filter.indexof(columnName) + (columnName.length + 4)).trim().substring(0, filter.substring(filter.indexof(columnName) + (columnName.length + 5)).indexof("M") + 2) + ")".trim(), "([" + columnName + "] <= '" + date1.affffdays(1).tostring() + "') ")
    
                Case GridKnownFunction.GreaterThan
                    Dim date1 As datetime = convert.todatetime(DirectCast(DirectCast(source, Telerik.Web.UI.RadGrid).Columns.Item(columnindex), Telerik.Web.UI.GridDateTimeColumn).CurrentFilterValue)
    
    
                    grdReport.MasterTableView.FilterExpression = filter.replace("([" + columnName + "] > " + filter.substring(filter.indexof(columnName) + (columnName.length + 4)).trim().substring(0, filter.substring(filter.indexof(columnName) + (columnName.length + 4)).indexof("M") + 2) + ")".trim(), "([" + columnName + "] >= '" + date1.affffdays(1).tostring() + "') ")
    
            End Select
    

    and then you call it from the need data source event for the grid like this

    Dim filter As String = grdReport.MasterTableView.FilterExpression
                If (filter.contains("LAST_UPD_DATE")) Then
                    manageDateFilter("LAST_UPD_DATE", source, filter, 6)
                End If
    

    and for multi date column you can use it like this

    Dim filter As String = ReportGrid.MasterTableView.FilterExpression
                If (filter.contains("START_DATE")) Then
                    manageDateFilter("START_DATE", source, filter, 5)
                End If
                filter = ReportGrid.MasterTableView.FilterExpression
                If (filter.contains("END_DATE")) Then
                    manageDateFilter("END_DATE", source, filter, 6)
                End If
    

    enjoy :)

    0 讨论(0)
提交回复
热议问题