天天看點

jqery easyui 利用treeview實作菜單的增删改查

****cshtml代碼****


@{
    ViewBag.Title = null;
}

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Basic TreeGrid - jQuery EasyUI Demo</title>
    @*<link rel="stylesheet" type="text/css" href="~/Content/js/Menu/easyui.css">
        <link rel="stylesheet" type="text/css" href="~/Content/js/Menu/icon.css">
        <link rel="stylesheet" type="text/css" href="~/Content/js/Menu/demo.css">
        <script type="text/javascript" src="~/Content/js/Menu/jquery-1.8.0.min.js"></script>
        <script type="text/javascript" src="~/Content/js/Menu/jquery.easyui.min.js"></script>*@
</head>

<body>

    <table id="tg"></table>

</body>
</html>



<script type="text/javascript">


    $(function () {


        //function onEndEdit(index, row) {
        //    debugger;
        //    var ed = $(this).datagrid('getEditor', {
        //        index: index,
        //        field: 'IsEnable'
        //    });
        //    debugger;
        //    row.IsEnable = $(ed.target).checkbox('getChecked');
        //    row.IsOpen = true;

        //    //row.productname = $(ed.target).combobox('getText');
        //};

        $('#tg').treegrid({
            url: '/Menu/GetNavgitionData',
            idField: 'BaseId',
            treeField: 'Name',
            iconCls: 'icon-ok',
            state: 'closed',
            rownumbers: true, //行号
            animate: true,   //點選節點的動畫效果
            collapsible: true,//定義是否可折疊按鈕
            fitColumns: true,    //    置為true将自動使列适應表格寬度以防止出現水準滾動。
            showFooter: true,//定義是否顯示行底(如果是做統計表格,這裡可以顯示總計等)。
            striped: false,//設定為true将交替顯示行背景。
            onDblClickRow: function (row) { edit() },//輕按兩下節點是觸發
            //onClickRow: function (row) { save() },//點選節點時觸發
            columns: [[

                { field: 'Name', title: '子產品名稱', editor: 'text', width:  },
                { field: 'Domain', title: '導航領域', editor: 'text', width:  },
                { field: 'Path', title: '跳轉路徑', editor: 'text', width:  },
                { field: 'Sequence', title: '排序序号', editor: 'text', width:  },
                {
                    field: 'Parent', title: '上級菜單', width: ,
                    formatter: function (value, row, index) {

                        if (value != null)
                            return value.Name;
                },
                {
                    field: 'IsEnable', title: '是否啟用', width: ,
                    formatter: function (value, row, index) {

                        if (value == true || value == 'true') {
                            var d = '<input type="checkbox" checked="checked" class="zhen" disabled="disabled" />&nbsp;&nbsp;';

                            row.IsEnable = 'true';  //此處如果不裝換為字元串類型,下面的編輯器将不會有預設值
                        }
                        else {
                            var d = '<input type="checkbox" disabled="disabled" />&nbsp;&nbsp;';

                            row.IsEnable = 'false';
                        }


                        return d;
                    },
                    editor: {   //編輯器
                        type: 'checkbox',
                        options: {
                            on: true, off: false,  //此出實際傳回字元串類型
                        }
                    }
                },
                {
                    field: 'IsOpen', title: '是否公開', width: ,
                    formatter: function (value, row, index) {
                        //alert(rec.isPresent);
                        if (value == true) {
                            var d = '<input type="checkbox" checked="checked" name="IsOpen"/>&nbsp;&nbsp;';
                            row.IsOpen = 'true';
                        }
                        else {
                            var d = '<input type="checkbox"  name="IsOpen"/>&nbsp;&nbsp;';
                            row.IsOpen = 'false';
                        }
                        return d;
                    },
                    editor: {   //編輯器
                        type: 'checkbox',
                        options: {
                            on: true, off: false,  //此出實際傳回字元串類型
                        }
                    }

                }
            ]],
            toolbar: [
                     {
                        text: '添加根菜單', iconCls: 'icon-add', handler: function () {
                                appendroot();
                                              }
                                          }, '-',
                      {
                          text: '添加子菜單', iconCls: 'icon-add', handler: function () {
                              append();
                          }
                      }, '-',
                      {
                          text: '删除', iconCls: 'icon-remove', handler: function () {
                              remove();
                          }
                      }, '-',
                      {
                          text: '編輯', iconCls: 'icon-edit', handler: function () {
                              edit();
                          }
                      }, '-',
                      {
                          text: '儲存', iconCls: 'icon-save', handler: function () {
                              save();
                          }
                      }, '-',
                      {
                          text: '取消編輯', iconCls: 'icon-undo', handler: function () {
                              $('#tg').treegrid('cancelEdit', editingId);
                              editingId = undefined;
                          }
                      }, '-',
                      {
                          text: '全部折疊', iconCls: 'icon-fold', handler: function () {
                              $('#tg').treegrid('collapseAll');
                          }
                      }, '-',
                      {
                          text: '全部展開', iconCls: 'icon-unfold', handler: function () {
                              $('#tg').treegrid('expandAll');
                          }
                      },
            ],

        }
        );



    })


    var editingId;
    function IsEditingId() {
        if (editingId) {
            $('#tg').treegrid('endEdit', editingId);
            editingId = undefined;
        }
    }
    function edit() {
        debugger;
        if (undefined != editingId) {
            utils.message('error', '請先儲存目前節點!');
            return;
        }
        var row = $('#tg').treegrid('getSelected');
        if (undefined == row) {
            utils.message('error', '請選中一個節點!');
        }
        if (row) {
            editingId = row.BaseId;
            $('#tg').treegrid('beginEdit', editingId);
        }
    }
    function save() {


        if (editingId != undefined) {
            editId = editingId;
            $('#tg').treegrid('endEdit', editingId);
            utils.message('confirm', '确認儲存目前操作嗎?', function (b) {
                if (b) {


                    var row = $('#tg').treegrid('find', editingId);
                    if (row.IsEnable == 'false') {
                        row.IsEnable == false
                    }
                    if (row.IsEnable == 'true') {
                        row.IsEnable = true
                    }
                    if (row.IsOpen == 'true') {
                        row.IsOpen = true;
                    }
                    if (row.IsOpen == 'false') {
                        row.IsOpen = false;
                    }

                    var node = {
                        BaseId: row.BaseId, Domain: row.Domain, Name: row.Name, Path: row.Path, ParentId: row._parentId, Sequence: row.Sequence, IsEnable: row.IsEnable, IsOpen: row.IsOpen
                    };
                    var data;
                    $.ajax({
                        type: "post",
                        async: false,
                        data: node,
                        url: '/Menu/SaveNewNode',
                        success: function (res) {
                            data = res;
                        }
                    });
                    if (data == 'success') {
                        utils.message('success', '儲存成功!');
                        $('#tg').treegrid('refresh', editingId);
                        $('#tg').treegrid('acceptChanges');
                    }
                    else  {
                        utils.message('error', data);
                        $('#tg').treegrid('rejectChanges');
                        $('#tg').treegrid('refresh', editingId);
                        //$('#tg').treegrid('remove', editingId);
                        // $('#tg').treegrid('cancelEdit', editingId);
                        //$('#tg').treegrid('rejectChanges');
                        editingId = undefined;
                        return;
                    }

                    editingId = undefined;
                }
            }

                        )


        }

    }
    function appendroot() {
        debugger;
        $('#tg').treegrid('append', {
            parent: null,  // 節點有一個'id'值,定義是通過'idField'屬性
            data: [{
                BaseId: guid(),
                Name: '',
                Path: '',
                Parent: null,
                IsEnable: false,
                IsOpen: false,

            }]
        });
        //$('#tg').treegrid('expand', node.BaseId);
        $('#tg').treegrid('select', editingId);
        $('#tg').treegrid('beginEdit', editingId);
    }
    function append() {
        if (undefined != editingId) {
            utils.message('error', '請先儲存目前節點!');
            return;
        }
        var node = $('#tg').treegrid('getSelected');
        if (!node) {
            utils.message('error', '請選擇節點!');
            return;
        }

        $('#tg').treegrid('append', {
            parent: node.BaseId,  // 節點有一個'id'值,定義是通過'idField'屬性
            data: [{
                BaseId: guid(),
                Name: '',
                Path: '',
                Parent: node,
                IsEnable: false,
                IsOpen: false,

            }]
        });
        $('#tg').treegrid('expand', node.BaseId);
        $('#tg').treegrid('select', editingId);
        $('#tg').treegrid('beginEdit', editingId);

    }

    function remove() {

        var node = $('#tg').treegrid('getSelected');
        if (undefined != editingId) {
            if (editingId != node.BaseId) {
                utils.message('error', '請先儲存目前節點!');
                return;
            }
        }

        if (null == node) {
            utils.message('error', '請選擇要删除的節點!');

            return;
        }
        var id = node.BaseId;

        utils.message('confirm', '确認删除嗎?', function (b) {
            if (b) {
                $('#tg').treegrid('endEdit', id);
                $.post('/Menu/DeleteNode', { id: id }, function (data) {
                    if (data == 'error') {
                        utils.message('error', '删除失敗!');
                        $('#tg').treegrid('rejectChanges');
                    }
                    if (data == 'success') {
                        $('#tg').treegrid('remove', node.BaseId);
                        utils.message('success', '删除成功!');
                        editingId = undefined;
                        // $('#tg').treegrid('reload', id);
                        $('#tg').treegrid('acceptChanges');
                    }
                });
            }
        });
    }
    //表示全局唯一辨別符 (GUID)。 因為操作菜單需要id 是以要自己生成id 來儲存到資料庫
    function guid() {
        function S4() {
            return ((( + Math.random()) * ) | ).toString().substring();
        }
        editingId = (S4() + S4() + S4() + S4() + S4() + S4() + S4() + S4());

        return editingId;
    }
</script>
           

//背景查詢菜單展示的方法 用到遞歸方法

public ActionResult GetNavgitionData()
    {
        ArrayList arr = new ArrayList();
        var top = new Navigation().GetRootNav();
        IList<Navigation> lists = new Navigation().FindAll<Navigation>();
        foreach (var item in top)
        {
            TreeGridModel m = new TreeGridModel()//這個是自己建立的Model類
            {
                BaseId = item.BaseId,
                Domain = item.Domain,
                Name = item.Name,
                Path = item.Path,
                Sequence = item.Sequence,
                IsEnable = item.IsEnable,
                IsOpen = item.IsOpen,
                children = new List<TreeGridModel>(),
            };
            DiGui(m, lists);
            arr.Add(m);
        }
        return Json(arr);
    }

    private void DiGui(TreeGridModel m, IList<Navigation> lists)//遞歸方法。
    {
        //當沒有子節點的時候方法結束 
        if (lists.Where(a => null != a.Parent && a.Parent.BaseId == m.BaseId).Count() == 0) { return; }
        var sub = lists.Where(a => null != a.Parent && a.Parent.BaseId == m.BaseId).ToList<Navigation>();
        foreach (var item in sub)
        {
            TreeGridModel m2 = new TreeGridModel()
            {
                BaseId = item.BaseId,
                Domain = item.Domain,
                Name = item.Name,
                Path = item.Path,
                Parent = item.Parent,
                Sequence = item.Sequence,
                IsEnable = item.IsEnable,
                IsOpen = item.IsOpen,
                children = new List<TreeGridModel>(),
            };
            m.children.Add(m2);
            DiGui(m2, lists);
        }
    }
           

//背景儲存方法

public string SaveNewNode(NewNode node)

{

string message = "success";
        bool IsSave = false;//是否是新增
        Navigation IsNEW = new Navigation().FindById<Navigation>(node.BaseId);
        try
        {
            Convert.ToInt32(node.Sequence);
            Navigation nav = new Navigation().FindSingle<Navigation>(n => n.Domain == node.Domain);
            if (null == IsNEW)
            {
                if (null != nav)
                {
                    return "導航領域已存在!";
                }
            }
        }
        catch (System.Exception e)
        {
            return "排序序号隻能填寫數字!";
        }
        try
        {

            if (null == IsNEW)
            {
                IsNEW = new Navigation();
                IsSave = true;
            }

            Navigation navigation = null;
            if (null != node.ParentId)
            {
                navigation = new Navigation().FindById<Navigation>(node.ParentId);
            }

            //Navigation newnode = new Navigation();

            IsNEW.Name = node.Name;
            IsNEW.Domain = node.Domain;
            IsNEW.Path = node.Path;
            if (null != navigation)
            {
                IsNEW.Parent = navigation;
            }
            IsNEW.Sequence = node.Sequence;
            IsNEW.IsEnable = node.IsEnable;
            IsNEW.IsOpen = node.IsOpen;


            IsNEW.BaseId = node.BaseId;
            if (IsSave)
            {

                IsNEW.Insert();
            }
            else
            {

                IsNEW.Update();
            }

            message = "success";
            return message;

        }
        catch (System.Exception e)
        {
            message = "儲存失敗";
            return message;
        }
        return message;
    }
           

繼續閱讀