1. 程式人生 > >[asp.net] 解決easyui datagrid刪除資料後不能自動更新

[asp.net] 解決easyui datagrid刪除資料後不能自動更新

easyui datagrid外掛資料的重新整理是通過其reload方法實現的,資料的插入和更新都能夠實時看到插入和修改的效果,reload方法實際上是重新向伺服器傳送了ajax請求。而今天在做檔案上傳的時候,刪除操作的效果只能夠通過重新整理頁面才能看到。

1.針對這一情況,筆者起初選擇手動呼叫location.reload()手動重新整理頁面,顯示刪除後的資料。該方法的缺點在於是通過重新整理頁面達到資料更新的目的,如果想彈出提示框就,那麼就會被頁面重新整理效果所覆蓋。

2.根據easyui的api,可以看出,easyui提供了對dom元素的增刪改查操作,實現前臺資料和後臺資料的同步增刪改查。


下面給出筆者的實現程式碼(詳細內容在deleteFile方法中):

<!DOCTYPE html>
<html>
<head>
    <title>管理員專家管理文件介面</title>
    <meta http-equiv="pragma" content="no-cache" />
    <script src="/Scripts/loading.js" type="text/javascript"></script>
    <link href="/EasyUI/themes/icon.css" rel="stylesheet" type="text/css" />
    <link href="/EasyUI/themes/gray/easyui.css" rel="stylesheet" type="text/css" />
    <script src="/EasyUI/jquery.min.js" type="text/javascript"></script>
    <script src="/EasyUI/jquery.easyui.min.js" type="text/javascript"></script>
    <script src="/Scripts/distinguishBrowser.js" type="text/javascript"></script>
    <script src="../EasyUI/locale/easyui-lang-zh_CN.js" type="text/javascript"></script>
    <script type="text/javascript">
        function doSearch() {
            //查詢檔案
            $.ajax({
                url: '/File/FileHandler.ashx?action=GetFile',
                type: 'POST',
                data: {
                    Name: $("#ss").val()
                },
                beforeSend: function () {
                    $.messager.progress({
                        text: '正在處理中...'
                    });
                },
                success: function (data) {
                    $.messager.progress('close');
                    data = eval('(' + data + ')');      //將一個json字串解析成js物件
                    $("#dg").datagrid('loadData', data);
                }
            });
        }
    </script>
</head>
<body>
    <table id="dg" class="easyui-datagrid" title="檔案列表" url="/File/FileHandler.ashx?action=GetAll"
        pagination="true" toolbar="#toolbar" rownumbers="false" fitcolumns="true" singleselect="false">
        <thead>
            <tr>
                <th field="ck" checkbox="true">
                </th>
                <th field="Id" width="100" data-options="align:'center'">
                    文件編號
                </th>
                <th field="Name" width="150" data-options="align:'center'">
                    文件名
                </th>
                <th field="JZId" width="120" data-options="align:'center',type:'combobox',valueField: 'text', textField: 'id', url: '/JZ/JZHandler.ashx?action=GetAllJZId', required: true">
                    機組編號
                </th>
                <th field="UploadTime" width="120" data-options="align:'center'">
                    上傳時間
                </th>
                <th field="Note" width="120" data-options="align:'center',formatter:myformatter">
                    操作
                </th>
            </tr>
        </thead>
    </table>
    <div id="toolbar" border="true" style="border: 1px solid #ddd; height: 32px; padding: 2px 5px;
        background: #fafafa;">
        <div style="float: left;">
            <a href="#" class="easyui-linkbutton" plain="true" onclick="addFile()" icon="icon-add">
                新增</a>
        </div>
        <div class="datagrid-btn-separator">
        </div>
        <div style="float: left;">
            <a href="#" class="easyui-linkbutton" plain="true" onclick="deleteFile()" icon="icon-remove">
                刪除</a>
        </div>
        <div id="tb" style="float: right;">
            <input id="ss" class="easyui-searchbox" searcher="doSearch" prompt="請輸入檔名" style="width: 160px;
                vertical-align: middle;"></input>
        </div>
    </div>
    <!--對話方塊-->
    <div id="dlg" class="easyui-dialog" style="width: 400px; padding: 10px 20px" closed="true"
        buttons="#dlg-buttons">
        <form id="fm" method="post" enctype="multipart/form-data">
        <div style="margin-bottom: 20px">
            <input id="cc2" class="easyui-combobox" name="JZId" label="機組編號" style="width: 100%"
                data-options="valueField: 'id', textField: 'text', url: '/JZ/JZHandler.ashx?action=GetAllJZId',required:true" />
        </div>
        <div style="margin-bottom: 20px">
            <input id="File" class="easyui-filebox" name="File" style="width: 100%" data-options="label:'文件名:',required:true,buttonText:'選擇檔案',prompt:'不限制檔案格式'" />
        </div>
        <div style="margin-bottom: 20px">
            <input id="cc1" class="easyui-textbox" name="Type" label="型別" style="width: 100%"
                data-options="valueField:'id',textField:'text',required:false">
        </div>
        </form>
    </div>
    <div id="dlg-buttons">
        <a href="#" class="easyui-linkbutton" iconcls="icon-ok" onclick="saveFile()">儲存</a>
        <a href="#" class="easyui-linkbutton" iconcls="icon-cancel" onclick="javascript:$('#dlg').dialog('close')">
            取消</a>
    </div>
    <script type="text/javascript">
        function myformatter(value) {
            return "<a href='" + value + "' >下載</a>";
        }
        function addFile() {
            $('#dlg').dialog('open').dialog('setTitle', '新增文件資訊');
            $('#fm').form('clear');
        }
        function deleteFile() {
            //刪除時先獲取選擇行
            var rows = $("#dg").datagrid("getSelections");
            //選擇要刪除的行
            if (rows.length > 0) {
                $.messager.confirm("提示", "你確定要刪除嗎?", function (r) {
                    if (r) {
                        //獲取所有要刪除的文件的編號
                        var ids = [];
                        var rowindex = [];
                        for (var i = 0; i < rows.length; i++) {
                            ids.push(rows[i].Id);
                            var index = $("#dg").datagrid('getRowIndex', rows[i]);
                            //儲存列的資訊
                            rowindex.push(index);
                        }
                        //按照從小到大排序
                        rowindex.sort();
                        //執行資料刪除操作
                        $.ajax({
                            url: '/File/FileHandler.ashx?action=Delete',
                            type: 'POST',
                            async: false,
                            data: {
                                Id: ids.join(',')
                            },
                            beforeSend: function () {
                                $.messager.progress({
                                    text: '正在處理中...'
                                });
                            },
                            success: function (data) {
                                $.messager.progress('close');
                                data = eval('(' + data + ')');      //將一個json字串解析成js物件
                                if (data.Success) {
                                    //手動刪除表格資料
                                    for (var i = rowindex.length - 1; i >= 0; i--) {
                                        $("#dg").datagrid('deleteRow', rowindex[i]);
                                    }
                                    $.messager.show({
                                        title: '操作提醒',
                                        msg: data.Message
                                    });
                                } else {
                                    $.messager.show('刪除失敗', data.Message, 'warning');
                                }
                            }
                        });
                    }
                });
            } else {
                $.messager.alert("操作提示", "請選中需要刪除的文件所在的行!", 'info');
            }
        }
        function saveFile() {
            url1 = '/File/FileHandler.ashx?action=Add';
            if (getBrowserType() == "Chrome") {
                $.ajax({
                    url: url1,
                    async: false,
                    type: "POST",
                    cache: false, //上傳檔案不需要快取
                    processData: false, // 告訴jQuery不要去處理髮送的資料
                    contentType: false, // 告訴jQuery不要去設定Content-Type請求頭
                    data: new FormData($('#fm')[0]), 
                    beforeSend: function () {
                        return $('#fm').form('validate');
                    },
                    success: function (data) {
                        data = eval('(' + data + ')');      //將一個json字串解析成js物件
                        $.messager.alert("操作提示", data.Message, 'info'); //顯示後臺資訊
                        if (data.Success) {
                            $('#dlg').dialog('close'); 	    //關閉彈出框
                            $("#dg").datagrid('reload');
                        }
                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                        alert(XMLHttpRequest.status);
                        alert(XMLHttpRequest.readyState);
                        alert(textStatus);
                    }
                });
            } else {
                $('#fm').form('submit', {
                    url: url1, //注意新增和修改的url不同
                    onSubmit: function () {
                        //驗證表單是否合法
                        return $(this).form('validate');
                    },
                    success: function (res) {
                        data = eval('(' + res + ')');      //將一個json字串解析成js物件
                        $.messager.alert("操作提示", data.Message, 'info'); //提示後臺錯誤資訊
                        if (data.Success) {
                            $('#dlg').dialog('close'); 	    //關閉彈出框
                            $('#dd').datagrid('reload');    //重新載入資料
                        }
                    }
                });
            }
        }
    </script>
</body>
</html>

不過有一點更奇怪的是,saveFile方法同樣採用reload,卻可以實時顯示檔案新增的動態效果。如果哪位大神知道的話希望能夠評論指教。

對資料元素進行刪除的時候一般是倒序刪除,原因是正序刪除可能會發生索引編號錯位。具體操作入下:

//從行集合中刪除若干行
function deleterows(allrows, selectedrows) {
      //尋找選擇行所在的索引行
      var idsarr = [];
      for (var i = 0; i < selectedrows.length; i++) {
          for (var j = 0; j < allrows.length; j++) {
              if (allrows[j].Id == selectedrows[i].Id) {
                  idsarr.push(j);
              }
           }
      }
      //倒序排列
      idsarr = idsarr.sort();
      idsarr = idsarr.reverse();
      //刪除元素
      for (var i = 0; i < idsarr.length; i++) {
         allrows.splice(idsarr[i], 1);
      }
}
function callQueue(){
	edit_url = "queueRecord.htm?op=callQueue";
	var row = $('#dg').datagrid('getSelected');
	// 獲取選中行的Index的值
	var rowIndex=$('#dg').datagrid('getRowIndex',$('#dg').datagrid('getSelected'));
	if(rowIndex != 0){
		$.messager.alert("提示","請按照排號順序叫號!");
		return false;
	}else{
		$('#call').dialog('open').dialog('setTitle', '叫號');
		$('#callfm').form('clear');
		$("#id").val(row.id);
		$("#code").val(row.numberType+row.code);
	}
}