在Bootstrap開發(fā)框架中使用dataTable直接錄入表格行數(shù)據(jù)

在Winform開發(fā)的時(shí)候,我們很多時(shí)候可以利用表格控件來直接錄入數(shù)據(jù)尤误,不過在Web上較少看到侠畔,其實(shí)也可以利用dataTable對象處理直接錄入表格行數(shù)據(jù),這個(gè)可以提高數(shù)據(jù)的錄入方便损晤,特別是在一些簡單業(yè)務(wù)的明細(xì)數(shù)據(jù)的時(shí)候软棺,看起來會(huì)比彈出窗口錄入方便一些,也高大上一點(diǎn)尤勋。本篇主要介紹在Bootstrap開發(fā)框架中使用dataTable直接錄入表格行數(shù)據(jù)喘落。

1、基于表格直接錄入數(shù)據(jù)和Winform的界面回顧

在開始Web界面直接錄入表格行數(shù)據(jù)前最冰,我們先來看看Winform界面的處理情況瘦棋,如我在流程管理里面,對于具有主從明細(xì)的報(bào)銷業(yè)務(wù)表的數(shù)據(jù)處理暖哨,采用了下面的界面赌朋。

image

這種明細(xì)表單可以直接在表格控件Griview上進(jìn)行新增、編輯處理。

而對于Web界面沛慢,如果我們要保持和這個(gè)布局類似的話赡若,采用dataTable直接錄入表格行數(shù)據(jù)也可以達(dá)到。

image

上面的界面處理明細(xì)數(shù)據(jù)的時(shí)候团甲,可以直接使用新增記錄逾冬,直接在錄入框中輸入數(shù)據(jù),然后保存起來躺苦,保存后數(shù)據(jù)變?yōu)橹蛔x身腻,如果需要修改,還可以單擊編輯按鈕進(jìn)行修改匹厘。

而這些明細(xì)的數(shù)據(jù)嘀趟,也僅僅存在JS的對象里面,還沒有保存到后臺(tái)數(shù)據(jù)庫中集乔,我們可以在最后保存(如上界面的確定按鈕)處理中再獲取全部添加的數(shù)據(jù)進(jìn)行提交即可去件。

在這些數(shù)據(jù)提交之后,我們在查看界面里面可以可以Bootstrap Table插件來展示數(shù)據(jù)即可扰路。

image

2尤溜、在Web上使用dataTable直接錄入表格行數(shù)據(jù)的實(shí)現(xiàn)

上面的界面展示了在Web上使用dataTable直接錄入表格行數(shù)據(jù)和數(shù)據(jù)展示,這里開始介紹它們的界面和實(shí)現(xiàn)代碼汗唱。

界面部分主要是這個(gè)明細(xì)的處理宫莱。

image

界面視圖的HTML代碼如下所示。

<div class="portlet light portlet-fit ">
    <div class="portlet-title">
        <div class="caption">
            <i class="icon-settings font-red"></i>
            <span class="caption-subject font-red sbold uppercase">明細(xì)清單</span>
        </div>
    </div>
    <div class="portlet-body">
        <div class="table-toolbar">
            <div class="row">
                <div class="col-md-6">
                    <div class="btn-group">
                        <button id="detail_editable_1_new" class="btn green">
                            新增記錄
                            <i class="fa fa-plus"></i>
                        </button>
                    </div>
                </div>
            </div>
        </div>
        <table class="table table-striped table-hover table-bordered" id="detail_editable_1">
            <thead>
                <tr>         
                    <th>序號(hào)</th>
                    <th> 費(fèi)用類型 </th>
                    <th> 發(fā)生時(shí)間 </th>
                    <th> 費(fèi)用金額(元) </th>
                    <th> 費(fèi)用說明 </th>
                    <th> 編輯 </th>
                    <th> 刪除 </th>
                </tr>
            </thead>
            <tbody>
                @*<tr>
                    <td> 1 </td>
                    <td> 交通費(fèi) </td>
                    <td> 2018-10-01 </td>
                    <td> 2000 </td>
                    <td> 備注信息 </td>
                    <td>
                        <a class="edit" href="javascript:;"> 編輯 </a>
                    </td>
                    <td>
                        <a class="delete" href="javascript:;"> 刪除 </a>
                    </td>
                </tr>*@
            </tbody>
        </table>
    </div>
</div>

其中主要是ID為 detail_editable_1 的標(biāo)記哩罪,這個(gè)就是承載明細(xì)信息的表格授霸,我們可以定義我們需要的表頭信息,而輸入框的內(nèi)容际插,則可以通過dataTable插件的對象進(jìn)行動(dòng)態(tài)添加碘耳。

            //定義dataTable對象
            var table = $('#detail_editable_1');
            var oTable = table.dataTable({
                "lengthMenu": [
                    [5, 15, 20, -1],
                    [5, 15, 20, "All"] // 改變每頁的行數(shù)
                ],

                // 使用漢化
                "language": {
                    url: '//cdn.datatables.net/plug-ins/3cfcc339e89/i18n/Chinese.json'
                },

                //初始化
                "pageLength": 5,
                "columnDefs": [{ // 設(shè)置默認(rèn)列設(shè)置
                    'orderable': true,
                    'targets': [0]
                }, {
                    "searchable": true,
                    "targets": [0]
                }],
                "order": [
                    [0, "asc"]
                ] // 將第一列設(shè)置為asc的默認(rèn)排序
            });

編輯行記錄,就是動(dòng)態(tài)增加一些Input控件框弛,讓用戶可以錄入數(shù)據(jù)辛辨,如下代碼所示。

//編輯行
function editRow(oTable, nRow) {
    var aData = oTable.fnGetData(nRow);
    var jqTds = $('>td', nRow);
    jqTds[0].innerHTML = '<input type="text" class="form-control input-small" value="' + aData[0] + '" readonly>';
    jqTds[1].innerHTML = '<input type="text" class="form-control input-small" value="' + aData[1] + '">';
    jqTds[2].innerHTML = '<input type="date" class="form-control input-small" value="' + aData[2] + '">';
    jqTds[3].innerHTML = '<input type="number" class="form-control input-small" value="' + aData[3] + '">';
    jqTds[4].innerHTML = '<input type="text" class="form-control input-small" value="' + aData[4] + '">';
    jqTds[5].innerHTML = '<a class="edit" href="">保存</a>';
    jqTds[6].innerHTML = '<a class="cancel" href="">取消</a>';
}

保存數(shù)據(jù)后瑟枫,通過把記錄更新到對應(yīng)TD對象里面斗搞,如下所示。

//費(fèi)用類型 發(fā)生時(shí)間 費(fèi)用金額 費(fèi)用說明
var objList = [];    
//保存行數(shù)據(jù)慷妙,切換到普通模式
function saveRow(oTable, nRow) {
    var jqInputs = $('input', nRow);
    //更新行中每個(gè)input的值
    oTable.fnUpdate(jqInputs[0].value, nRow, 0, false);
    oTable.fnUpdate(jqInputs[1].value, nRow, 1, false);
    oTable.fnUpdate(jqInputs[2].value, nRow, 2, false);
    oTable.fnUpdate(jqInputs[3].value, nRow, 3, false);
    oTable.fnUpdate(jqInputs[4].value, nRow, 4, false);
    oTable.fnUpdate('<a class="edit" href="">編輯</a>', nRow, 5, false);
    oTable.fnUpdate('<a class="delete" href="">刪除</a>', nRow, 6, false);
    oTable.fnDraw();
}

在界面上的幾個(gè)出來動(dòng)作按鈕僻焚,如新增、編輯膝擂、保存虑啤、刪除等按鈕處理事件如下所示隙弛。

    var addRow = 1;
    $('#detail_editable_1_new').click(function (e) {
        e.preventDefault();

        if (nNew && nEditing) {
            if (confirm("前面記錄沒有保存,您是否需要保存?")) {
                saveRow(oTable, nEditing);
                //$(nEditing).find("td:first").html("未保存");
                nEditing = null;
                nNew = false;
            } else {
                oTable.fnDeleteRow(nEditing); // cancel
                nEditing = null;
                nNew = false;
                return;
            }
        }

        //添加一條新的記錄
        var aiNew = oTable.fnAddData([addRow++, '', '', '', '', '', '']);
        var nRow = oTable.fnGetNodes(aiNew[0]);
        editRow(oTable, nRow);
        nEditing = nRow;
        nNew = true;
    });
    //刪除操作
    table.on('click', '.delete', function (e) {
        e.preventDefault();
        if (confirm("您確認(rèn)要?jiǎng)h除該行記錄嗎?") == false) {
            return;
        }
        //獲取上一級(jí)tr行的數(shù)據(jù)
        var nRow = $(this).parents('tr')[0];
        var aData = oTable.fnGetData(nRow);

        var found = false;
        $.each(objList, function (i, item) {
            if (item["seq"] == aData[0]) {
                found = true;
                objList.splice(i, 1);
            }
        });
        oTable.fnDeleteRow(nRow);
    });
    //取消操作
    table.on('click', '.cancel', function (e) {
        e.preventDefault();
        if (nNew) {
            oTable.fnDeleteRow(nEditing);
            nEditing = null;
            nNew = false;
        } else {
            restoreRow(oTable, nEditing);
            nEditing = null;
        }
    });
    //編輯操作
    table.on('click', '.edit', function (e) {
        e.preventDefault();
        nNew = false;

        /*獲取所擊連接的行對象*/
        var nRow = $(this).parents('tr')[0];

        if (nEditing !== null && nEditing != nRow) {
            /* 當(dāng)前正在編輯 - 但不是此行 - 在繼續(xù)編輯模式之前恢復(fù)舊版 */
            restoreRow(oTable, nEditing);
            editRow(oTable, nRow);
            nEditing = nRow;
        } else if (nEditing == nRow && this.innerHTML == "保存") {
            /* 編輯該行咐旧,并準(zhǔn)備保存記錄 */
            saveRow(oTable, nEditing);
            nEditing = null;

        } else {
            /* No edit in progress - let's start one */
            editRow(oTable, nRow);
            nEditing = nRow;
        }
    });
}

我們在最后一步驶鹉,提交數(shù)據(jù)的時(shí)候绩蜻,就是遍歷整個(gè)表格铣墨,獲取每行的數(shù)據(jù),并把它們放到JSON對象列表里面办绝,在提交到后臺(tái)錄入即可伊约,如下是獲取列表數(shù)據(jù)的JS代碼

//獲取表格的數(shù)據(jù),并返回對象列表
function GetData() {
    var list = [];    
    var trs = table.fnGetNodes();
    for (var i = 0; i < trs.length; i++) {
        var data = table.fnGetData(trs[i]);//獲取指定行的數(shù)據(jù)

        var obj = {};
        //obj["seq"] = data[0];//序號(hào)
        obj["FeeType"] = data[1];
        obj["OccurTime"] = data[2];
        obj["FeeAmount"] = data[3];
        obj["FeeDescription"] = data[4];
        list.push(obj);
    }
    return list;
};

獲取到表格明細(xì)的數(shù)據(jù)后孕蝉,我們就是確定如何提交到MVC后臺(tái)接口來處理了屡律,下面是業(yè)務(wù)里面關(guān)于明細(xì)數(shù)據(jù)提交MVC后臺(tái)的JS代碼。

image

后臺(tái)MVC控制器的C#處理邏輯代碼如下所示降淮。

/// <summary>
/// 保存申請單主從表數(shù)據(jù)
/// </summary>
/// <returns></returns>
[HttpPost]
public ActionResult SaveApply(JObject param)
{
    dynamic obj = param;
    if (obj != null)
    {
        var result = new CommonResult();

        if (obj.info != null)
        {
            //獲取主信息
            var info = (JObject.FromObject(obj.info)).ToObject<ReimbursementInfo>();

            //轉(zhuǎn)換為明細(xì)信息
            List<ReimbursementDetailInfo> details = null;
            if (obj.details != null)
            {
                details = (JArray.FromObject(obj.details)).ToObject<List<ReimbursementDetailInfo>>();
            }

            if (info != null)
            {
                //修改部分信息
                OnBeforeInsert(info);
                bool succeed = BLLFactory<Reimbursement>.Instance.Insert(info);
                if (succeed)
                {
                    if (details != null)
                    {
                        foreach (var detailInfo in details)
                        {
                            //設(shè)置關(guān)鍵信息
                            detailInfo.Apply_ID = info.Apply_ID;
                            detailInfo.Header_ID = info.ID;
                            BLLFactory<ReimbursementDetail>.Instance.InsertUpdate(detailInfo, detailInfo.ID);
                        }
                    }
                    result.Success = succeed;
                }
            }
        }
        return ToJsonContent(result);
    }
    else
    {
        throw new MyApiException("傳遞參數(shù)錯(cuò)誤");
    }
}

其中對于提交上來的數(shù)據(jù)超埋,對象信息用JObject進(jìn)行轉(zhuǎn)換,而對于明細(xì)列表則使用JArray.FromObject進(jìn)行轉(zhuǎn)換佳鳖,其他部分就是如何保存主表和明細(xì)表的接口了霍殴。

上面的處理邏輯和代碼就是處理明細(xì)表的前臺(tái)獲取,提交處理系吩,以及后臺(tái)的接口處理来庭,整個(gè)過程主要用來介紹在Bootstrap開發(fā)框架中使用dataTable直接錄入表格行數(shù)據(jù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末穿挨,一起剝皮案震驚了整個(gè)濱河市月弛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌科盛,老刑警劉巖帽衙,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贞绵,居然都是意外死亡厉萝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門但壮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冀泻,“玉大人,你說我怎么就攤上這事蜡饵〉妫” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵溯祸,是天一觀的道長肢专。 經(jīng)常有香客問我舞肆,道長,這世上最難降的妖魔是什么博杖? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任椿胯,我火速辦了婚禮,結(jié)果婚禮上剃根,老公的妹妹穿的比我還像新娘哩盲。我一直安慰自己,他們只是感情好狈醉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布廉油。 她就那樣靜靜地躺著,像睡著了一般苗傅。 火紅的嫁衣襯著肌膚如雪抒线。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天渣慕,我揣著相機(jī)與錄音嘶炭,去河邊找鬼。 笑死逊桦,一個(gè)胖子當(dāng)著我的面吹牛眨猎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卫袒,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宵呛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了夕凝?” 一聲冷哼從身側(cè)響起宝穗,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎码秉,沒想到半個(gè)月后逮矛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡转砖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年须鼎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片府蔗。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晋控,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姓赤,到底是詐尸還是另有隱情赡译,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布不铆,位于F島的核電站蝌焚,受9級(jí)特大地震影響裹唆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜只洒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一许帐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毕谴,春花似錦成畦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔑穴。三九已至忠寻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間存和,已是汗流浹背奕剃。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捐腿,地道東北人纵朋。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像茄袖,于是被迫代替她去往敵國和親操软。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容