编程思路———c#.net.mvc:字典

原创 2014年06月22日 08:28:54

这次这个项目和上次的三级连联动框基本类似,只不过上次只是做个查询,这次涉及到增删改查。

先贴出效果图:





1.项目要求:

根据Field中的Field.ID对应的Key中的 Key.FieldId做增删改查.


举个例子;

Field表中有个“标题”(当然还有其他文章,分类,等等),标题下有一级二级三级字典,这些字典时单独存在另一表key中.当我点击标题时,编辑标题下对应的字典。这个字典可以就一级,这里写了个三级,也就是一级中的每一项还有二级目录和三级目录。


2.思路:

(这个表页面不是单独页面,是个弹出页面,也就是嵌套在页面中的div,单击编辑时才显示出来的。因此我在做这个项目时,主体是用到了异步的方法。)

1.当我单击编辑页面中的“标题”时,弹出此表(此时我已经将标题对应的id获取到),也就当前表所显示和我们将要操作的都是基于对标题下的字典的操作。

  //生成首元素
    function CheckKey(id) {
        //获得当前fieldid
        $("#hfFiledId").val(id);
        var $select1 = $("#KeyTable").find("select").eq(0);
        ShowPanelCenter('divEditDictionary', null);
        if (id != undefined) {
            $.getJSON("/Services/GetParentKey?fieldid=" + id + "&&parentid=" + 0, null, function (json) {
                if (json.length > 0) {
                    $.each(json, function (i, item) {
                        $("<option id=" + item.Id + " value=" + item.ParentId + ">" + item.KeyName + "</option>").appendTo($select1);
                    });
                }
                $("<option class='KikeMe'" + " id=" + 0 + " value=" + id + ">单击添加元素.</option>").appendTo($select1);
                $("#hiddenAddNewKey").val(id);
            });
        }
    }

——————————————————————————————————————————————————————————————

select单击事件的代码:此部分很关键,很多数据的参数是通过单击动态获得的。这些参数就是我要来增删改的。

        //查看字典分类
        var $select = $("#KeyTable").find("select");
        $select.live("click", function () {
            $("#txtCurrentNodeName").attr("readonly", "true");
            var id = $(this).find("option:selected").attr("id");
            var NodeName = $(this).find("option:selected").text();
            var index = parseInt($(this).attr("data-index"));
            //保存当前元素的参数
            $("#txtCurrentNodeName").val(NodeName);
            $("#hiddenEditNodeId").val(id);
            $("#hiddenSelectIndex").val(index);
            if (index <= 2) {
                var $next = $select.eq(index);
                $next.html("");
                if (id != undefined && id != 0) {
                    $.getJSON("/Services/GetKeys?parentId=" + id, null, function (json) {
                        if (json.length > 0) {
                            $.each(json, function (i, item) {
                                $("<option id=" + item.Id + " value=" + item.ParentId + ">" + item.KeyName + "</option>").appendTo($next);
                            });
                        }
                        $("<option class='KikeMe'" + " value=" + id + ">单击添加元素.</option>").appendTo($next);
                        $("#hiddenAddNewKey").val(id);


                    });
                }
                if (index == 1) {
                    $select.eq(2).html("");
                }
            }
        });

——————————————————————————————————————————————————————————————

新增:

单击“单击添加元素”,光标的焦点会移动到下面的文本框中,输入你想要加入的元素,新增即可(这里为了增强可视性,在新增时,除了数据库新增外,页面上也动态新增显出出来)。注意,这个新增的元素是有父子对应关系的。

举例:134-1345-134566是个三级对应关系,你要是在一级下添加的,则便是根元素,如果是在134下新增的则是134下的子元素。

————————————————————————————————————————————————————————————————

编辑:

单击某个<option>,下面的文本框会显示你当前查看的元素,此时文本框为只读状态(不能编辑),单击编辑才可编辑,之后保存即可。

————————————————————————————————————————————————————————————————

删除:

删除有点复杂,因为这取决于删除的是几级下的元素,打个比方:我要删除的是一级目录中的元素,则对应的二三级目录将全部删除.

因此在后台异步方法中要涉及到多个判断和查询。

下面这个方法就是删除,主要看思路,水平有限,可能代码不是很简洁。

    /// <summary>
        /// 删除元素
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet]
        public JsonResult DeleteKey(int id,int fieldid)
        {
            JsonResult json = null;
            List<Key> keythird = null;
            List<Key> keysecond = null;
            List<Key> allkeys = this.keyRespository.Query(t => t.FiledId == fieldid).ToList<Key>();
            Key keyfirst = this.keyRespository.Single(t=>t.Id==id &&t.FiledId==fieldid);


                if (keyfirst.ParentId == 0 &&allkeys.Find(t=>t.ParentId==keyfirst.Id) !=null)
                {
                    keysecond = this.keyRespository.Query(t => t.ParentId == keyfirst.Id).ToList<Key>();
                    if (keysecond.Count()!=0)
                    { 
                        foreach(var k in keysecond)
                        {
                        keythird = this.keyRespository.Query(t => t.ParentId ==k.Id).ToList<Key>();
                        }
                        this.keyRespository.Delete(keythird);
                    }
                    this.keyRespository.Delete(keysecond);
                    this.keyRespository.Delete(keyfirst);
                }
                else
                {
                    if (allkeys.Find(t => t.ParentId == keyfirst.Id) != null)
                    {
                        keythird = this.keyRespository.Query(t => t.ParentId == keyfirst.Id).ToList<Key>();
                        this.keyRespository.Delete(keythird);
                        this.keyRespository.Delete(keyfirst);
                    }
                    else
                    {
                        this.keyRespository.Delete(keyfirst);
                    }
                }
            json = new JsonResult
            {
                ContentEncoding=Encoding.Default, 
                JsonRequestBehavior=JsonRequestBehavior.AllowGet,
                ContentType="applicaion/json",
                Data="",
            };
            return json;
        }

——————————————————————————————————————

另外在异步方法中涉及一些查询数据的方法,在异步中我是调用封装好的,为了规范化,将一些方法放在key.cs中,下面这两个是大部分查询数据要用到的方法

        public Key(SqlDataReader r)
        {
            this.Id = Convert.ToInt32(r["Id"].ToString());
            this.KeyName=r["KeyName"].ToString();
            this.ParentId =Convert.ToInt32(r["ParentId"].ToString());
            this.FiledId = Convert.ToInt32(r["FiledId"].ToString());
        }


        /// <summary>
        /// 查询字典的二三级目录
        /// </summary>
        /// <param name="parentid"></param>
        /// <returns></returns>
        public static List<Key> GetAll(int parentid)
        {
            List<Key> records = new List<Key>();


            using (SqlConnection conn = new SqlConnection(connectionstring))
            {
                using (SqlCommand cmd = new SqlCommand(String.Format("select * from {0} where ParentId ={1}", Key.TABLE,parentid), conn))
                {
                    cmd.CommandType = CommandType.Text;
                    conn.Open();
                    SqlDataReader r = cmd.ExecuteReader();
                        while (r.Read())
                        {
                            records.Add(new Key(r));
                        }                       
                    conn.Close();
                }
            }
            return records;
        }

——————————————————————————————————————————————————————————————————

by木拓风

不足之处还望之处,欢迎交流~

编程思路——c#.net mvc 项目经验:三级联动框

项目要求: 单击

编辑技巧——c#.net.mvc.jquery:异步刷新

在做到一个项目关于

C#.NET MVC 枚举转dictionary自动装载生成下拉框

C#MVC开发中经常会遇到生成下拉框的情况,往往下拉框的内容会跟枚举进行关联,此代码是读取枚举字段的描述内容作为下拉框text值(当描述不存在时取字段名称),枚举的value作为下拉框的value值自...

Halcon C#.net 编程指导(3): 元组(Tuples)的使用

1. 使用单个值或元组调用函数 你可以从参考手册(refrence manual)里查看算子是否可以处理元组(tuples)。例如下面列出了AreaCenter和GenRectang...

C#.Net Socket网络通讯编程

1 、理解socket  1) 、 Socket 接口是TCP/IP 网络的应用程序接口(API )。Socket 接口定义了许多函数和例程,程序员可以用它们来开发TCP/IP 网络应用程序。Soc...
  • snlei
  • snlei
  • 2013年01月06日 08:40
  • 1064

C#.NET网络程序开发的基本类(一)(C#---网络编程)

C#.NET网络程序开发的基本类 C#.NET的System.NET命名空间为Internet网络上使用的多种协议提供了便利的编程接口。 IPAddress 类  IPAddress 类提供的是主机...

c#.net多线程编程教学(2):Thread类

这章将向大家介绍.NET中的线程API,怎么样用C#创建线程,启动和停止线程,设置优先级和状态.   在.NET中编写的程序将被自动的分配一个线程.让我们来看看用C#编程语言创建线程并且继续学习...
  • noaskme
  • noaskme
  • 2011年11月17日 14:40
  • 524

小白自学C#之《C#.net_经典编程例子400个》实例001带历史信息的菜单 附自学源码

第一部分,原文章程序 实例001  带历史信息的菜单 实例说明 在开发图纸管理软件时,要求在菜单上记录用户最近打开的档案或图纸,以方便下次使用。如图1.1所示,单击“文件”菜单下的“打开文件”子菜单,...

C#.NET:高级编程之系统内置委托(有Func/无返回值Action)

转载声明:转载本文是为了方便自己查看,有需要的朋友建议查看原文(注:原文中有作者纠正的评论,我没有搬运) 原文地址:http://www.cnblogs.com/akwwl/p/3232679.ht...

C#.net 地图控件开发(三) GDI+图形图像编程基础1.

GDI+绘图基础        编写图形程序时需要使用GDI(Graphics Device Interface,图形设备接口),从程序设计的角度看,GDI包括两部分:一部分是GDI对象,另一部分是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编程思路———c#.net.mvc:字典
举报原因:
原因补充:

(最多只允许输入30个字)