简体   繁体   English

JQuery数据表和Bootstrap 3日期选择器

[英]JQuery Datatables and Bootstrap 3 datepicker

I'm using JQuery datatables to sort some table with data. 我正在使用JQuery数据表对一些数据表进行排序。 I'm using custom items to sort, in my case I have a select element which sorts one of the columns. 我正在使用自定义项目进行排序,就我而言,我有一个select元素对一列进行排序。 And this works. 这可行。 I also have 2 inputs that serve as datepickers . 我也有2个可用作datepicker的输入。 These pickers have data formatted as same as on the table, so filtering works well, but my question is: 这些选择器的数据格式与表中的格式相同,因此过滤效果很好,但是我的问题是:

Is possible to filter column based on the range of pickers? 是否可以根据选择器的范围过滤列? So for example: from 1 sep 2017 to 10 sep 2017? 例如:从2017年9月1日到2017年9月10日?

I'm was looking for some custom function in datatables docs but I found nothing so it's why I'm asking StackOverflow community. 我一直在寻找datatables文档中的一些自定义函数,但没有发现任何东西,所以这就是为什么我要问StackOverflow社区的原因。

I think I need to check when second date one was selected and then get data of first datepicker and filter column based on this. 我想我需要检查何时选择第二个日期,然后基于此获取第一个日期选择器和过滤器列的数据。 But to make things easier, when the first picker is selected I will just show the second picker, so the user may know that selecting the first picker will trigger need of selecting the second one also.... 但是为了简化起见,当选择第一个选择器时,我将仅显示第二个选择器,因此用户可能会知道选择第一个选择器也会触发选择第二个选择器的需要。

$(document).ready(function() {

    var table = $('#scroll-wrc-changes-table table').DataTable({
        "paging": false,
    });

    var picker1 = $('#datetimepicker1').datetimepicker({
        format: 'DD MMM YYYY',
        defaultDate: new Date(),
    });
    var picker2 = $('#datetimepicker2').datetimepicker({
        format: 'DD MMM YYYY',
        defaultDate: new Date(),
    });

    picker1.on('dp.change',function() {
        table.columns([3] ).search( this.value ).draw();

    });

    picker2.on('dp.change',function() {
        table.columns([3] ).search( this.value ).draw();
    });

    // This is just select element
    $('#table-select').change(function() {
        table.columns([2] ).search( this.value ).draw();
    })

});

Maybe this link can help you. 也许此链接可以为您提供帮助。 Range Filtering 范围过滤

The idea is to make function for custom filtering. 这个想法是使功能用于自定义过滤。

$.fn.dataTable.ext.search.push(
  function( settings, data, dataIndex ) {
    var date1 = new Date( $('#datetimepicker1').val() );
    var date2 = new Date( $('#datetimepicker2').val() );
    var dateData = new Date( data[3] ); // use data from the date column

    if ( dateData >= date1 && dateData <= date2 )
    {
        return true;
    }
    return false;
});

Hope this help.. 希望有帮助。

Asuming you are using ajax datatable . If not draw idea from this example 
Add a row where you can set range for filter as:
<div class="col-md-3"> <label>From:</label> <input readonly="readonly" type="text" id="mindate" class="srchdp"> <i class="fa fa-times-circle-o" id="clear-mindate"></i></div>
                            <div class="col-md-3"> <label>To:</label> <input readonly="readonly" type="text" id="maxdate" class="srchdp"> <i class="fa fa-times-circle-o" id="clear-maxdate" ></i></div>
                            <div class="col-md-2"><button class="btn btn-primary" id="filter-record">Filter</button></div>

//initialize datepicker as

            $("input:text.srchdp").datetimepicker({
            changeMonth: true,
            changeYear: true,
            yearRange: "-100:+0",
            dateFormat: 'mm/dd/yy',
            controlType: 'select',
            timeFormat: 'hh:mm:ss TT',
        })

// now keep a event on filter button click


    $(document).on("click", "#filter-record", function () {

            assetListVM.search("").draw(); 
        });

// now on ajax request 

       public ActionResult Get([ModelBinder(typeof(DataTablesBinder))] IDataTablesRequest requestModel, string mindate,string maxdate, string searchbase)
        {
            DataBaseEntities db = new DataBaseEntities();
            IQueryable<Wishlist> query = db.Wishlists;
            var totalCount = query.Count();

            #region Filtering
            // Apply filters for searching

                var value = requestModel.Search.Value.Trim();
            if (!string.IsNullOrEmpty(searchbase))
            {
                if (!string.IsNullOrEmpty(mindate) && !string.IsNullOrEmpty(maxdate))
                {
                    DateTime datevaluemin;
                    DateTime datevaluemax;
                    var mindateval = DateTime.TryParse(mindate, out datevaluemin);
                    var maxdateval = DateTime.TryParse(mindate, out datevaluemax);

                    if (mindateval && maxdateval)
                    {
                        var minvalue = Convert.ToDateTime(mindate);
                        var maxvalue = Convert.ToDateTime(maxdate);
                        if (searchbase == "CreatedDate")
                        {
                            query = query.Where(p =>
                                                p.CreatedDate >= minvalue
                                                && p.CreatedDate <= maxvalue);
                        }
                    }
                }
                else if (!string.IsNullOrEmpty(mindate))
                {
                    DateTime datevalue;
                    var mindateval = DateTime.TryParse(mindate, out datevalue);

                    if (mindateval)
                    {
                        var minvalue = Convert.ToDateTime(mindate);
                        if (searchbase == "CreatedDate")
                        {
                            query = query.Where(p =>
                                                p.CreatedDate >= minvalue
                                                );
                        }

                    }
                }
            }
            if (requestModel.Search.Value != string.Empty)
            {      
                    query = query.Where(p => p.Id.ToString().Equals(value) ||
                             p.ProductId.ToString().Equals(value) ||
                             p.MemberId.ToString().Contains(value)


                       );                
            }

            var filteredCount = query.Count();

            #endregion Filtering

            #region Sorting
            // Sorting
            var sortedColumns = requestModel.Columns.GetSortedColumns();
            var orderByString = String.Empty;

            foreach (var column in sortedColumns)
            {
                orderByString += orderByString != String.Empty ? "," : "";
                orderByString += (column.Data) + (column.SortDirection == Column.OrderDirection.Ascendant ? " asc" : " desc");
            }

            query = query.OrderBy(orderByString == string.Empty ? " asc" : orderByString);

            #endregion Sorting

            // Paging
            query = query.Skip(requestModel.Start).Take(requestModel.Length);


            var data = query.Select(asset => new
            {
                Id = asset.Id,
                ProductId = asset.ProductId,
                ProductName = asset.Product.ProductName,           
                MemberId=asset.MemberId,
                CreatedDate = asset.CreatedDate.ToString(),
            }).ToList();

            return Json(new DataTablesResponse(requestModel.Draw, data, filteredCount, totalCount), JsonRequestBehavior.AllowGet);
        }
    }
}


this code is not complete hence it doesn't work alone.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM