简体   繁体   English

使用Datepicker进行数据表内联编辑

[英]Datatables inline editing with datepicker

Ok so I have this datatable with around 90 fields being populated from a dbContext (Visual Studio MVC4). 好的,这样我就可以从dbContext(Visual Studio MVC4)填充约90个字段的数据表。 I added the .makeEditable() to enjoy inline editing... 我添加了.makeEditable()以享受内联编辑...

Most of my fields are of a type string (but a user CAN input a date if he opts to....even though its a text type field, the date will be input as simple text..) 我的大多数字段都是字符串类型(但用户可以选择输入日期,即使选择了文本类型,也可以将日期输入为简单文本。)

The problem I have is that even though I'm successfully being able to get the class of the edit form to become "datepicker", the calender isn't popping up and on other simple non-datatable pages, it runs just fine. 我的问题是,即使我能够成功获取编辑表单的类成为“ datepicker”,也不会弹出日历,而在其他简单的非数据表页面上,日历也可以正常运行。

I want to be able to set certain column cells to have inline datepicking ability.. 我希望能够将某些列单元格设置为具有内联日期选择功能。

I want my table to look like this thing http://jquery-datatables-editable.googlecode.com/svn/trunk/inline-edit-extra.html 我希望我的表格看起来像这样: http://jquery-datatables-editable.googlecode.com/svn/trunk/inline-edit-extra.html

I tried mimic-ing the code there but with no success....its always a textbox for editing instead of a calender view.. 我尝试在此处模仿代码,但没有成功..它始终是用于编辑的文本框,而不是日历视图。

UPDATE: I noticed that if I change the "type:" field in 更新:我注意到,如果我更改“类型:”字段

$.fn.editable.defaults = {
        name: 'value',
        id: 'id',
        type: 'datepicker',
        width: 'auto',
        height: 'auto',
        event: 'click.editable',
        onblur: 'cancel',
        loadtype: 'GET',
        loadtext: 'Loading...',
        placeholder: 'Double-Click to edit',
        loaddata: {},
        submitdata: {},
        ajaxoptions: {}
    };

My entire table gets a datepicker on editing mode... 我的整个桌子都处于编辑模式的日期选择器...

Apparently the intializing code to give certain columns datepicker options doesn't work as it should ....or at least I guess so 显然,为某些列提供datepicker选项的初始化代码无法正常工作..或者至少我猜是这样

**UPDATE END**** **更新结束****

This is my datatable initialization code: 这是我的数据表初始化代码:

<script language="javascript" type="text/javascript">

$(function() {
    $(".datepicker").datepicker({ dateFormat: 'dd-MM-yy' });
});
$(document).ready(function ()
{

    $('#myDataTable thead tr#filterrow th').each(function () {

        var title = $('#myDataTable thead th').eq($(this).index()).text();
        $(this).html('<input type="text" onclick="stopPropagation(event);" placeholder="Search ' + title + '""style="direction: ltr; text-align:left;" />');

    });
    $("#myDataTable thead input").on('keyup change', function () {
        table
            .column($(this).parent().index() + ':visible')
            .search(this.value)
            .draw();
    });

    var table = $('#myDataTable').DataTable({
        //"scrollY": "200",
        "scroller": "true",
        "deferRender": "true",
        "orderCellsTop": "true",
        "columnDefs": [
            { "visible": false, "targets": 1 },
             { "type": "datepicker", "aTargets": [6,7,8,9,10] },
           { 'sClass':"datepicker", "aTargets": [6, 7, 8, 9, 10] }
        ],
        "order": [[1, 'asc']],
        "displayLength": 25,
        "drawCallback": function (settings)
        {
            $(".datepicker").datepicker({ dateFormat: 'dd-MM-yy' });
            var api = this.api();
            var rows = api.rows({ page: 'current' }).nodes();
            var last = null;

            api.column(1, { page: 'current' }).data().each(function (group, i) {
                if (last !== group) {
                    $(rows).eq(i).before(
                        '<tr class="group"><td colspan="88">' + group + '</td></tr>'
                    );

                    last = group;
                }

            });
        },
        "fndrawCallback": function (settings) {
            $(".datepicker").datepicker({ dateFormat: 'dd-MM-yy' });
        }
    });
    // Apply the search
    table.columns().every(function () {
        var that = this;

        $('input', this.header()).on('keyup change', function () {
            that
                .search(this.value)
                .draw();
        });
    });

    // Order by the grouping
    $('#myDataTable tbody').on('click', 'tr.group', function () {
        var currentOrder = table.order()[0];
        if (currentOrder[0] === 1 && currentOrder[1] === 'asc') {
            table.order([1, 'desc']).draw();
        }
        else {
            table.order([1, 'asc']).draw();
        }
    });
 //$('#myDataTable thead').append($('#myDataTable thead tr:eq(0)')[0]);
    $('#myDataTable').dataTable().makeEditable({
        "aoColumnDefs": [
           { "type": "hasDatepicker", "aTargets": 4 },
           { "sClass": "hasDatepicker", "aTargets": 4 }
        ]
    });
});

function stopPropagation(evt) {
    if (evt.stopPropagation !== undefined) {
        evt.stopPropagation();
    } else {
        evt.cancelBubble = true;
    }
}

this is the datepicker.js 这是datepicker.js

// add :focus selector
jQuery.expr[':'].focus = function (elem) {
    return elem === document.activeElement && (elem.type || elem.href);
};

$.editable.addInputType(' datepicker', {

    /* create input element */
    element: function (settings, original) {
        var form = $(this),
            input = $('class ="datepicker" <input />');
       // input.attr('class', 'datepicker');
        input.attr('autocomplete', 'off');
        form.append(input);
        return input;
    },

    /* attach jquery.ui.datepicker to the input element */
    plugin: function (settings, original) {
        var form = this,
            input = form.find("input");

        // Don't cancel inline editing onblur to allow clicking datepicker
        settings.onblur = 'nothing';

        datepicker = {
            onSelect: function () {
                // clicking specific day in the calendar should
                // submit the form and close the input field
                form.submit();
            },

            onClose: function () {
                setTimeout(function () {
                    if (!input.is(':focus')) {
                        // input has NO focus after 150ms which means
                        // calendar was closed due to click outside of it
                        // so let's close the input field without saving
                        original.reset(form);
                    } else {
                        // input still HAS focus after 150ms which means
                        // calendar was closed due to Enter in the input field
                        // so lets submit the form and close the input field
                        form.submit();
                    }

                    // the delay is necessary; calendar must be already
                    // closed for the above :focus checking to work properly;
                    // without a delay the form is submitted in all scenarios, which is wrong
                }, 150);
            }
        };

        if (settings.datepicker) {
            jQuery.extend(datepicker, settings.datepicker);
        }

        input.datepicker(datepicker);
    }
});   

So after a lot of trial and error..... 因此,经过大量的反复试验.....

I manually input the type of each of my 90 columns, and it manually worked....columnDefs with targeting a list of columns is probably bugged as in jeditable.datepicker it doesn't parse a list of columns passedin the settings.... 我手动输入了我的90列中的每一列的类型,并且手动地工作了....以列列表为目标的columnDefs可能像jeditable.datepicker中的错误一样,它不解析设置中传递的列的列表... 。

Hope this helps a lost soul later on... 希望这可以帮助以后失去的灵魂...

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

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