永利官方网站自打上班之老二天开始便直接在描写项目文档和吃开发人员培训。框架。

总结:

话说男女搭配,干活不累,是发出那么点道理。

 

using System;
namespace Tree
{
    public interface IDropDownTree : IDisposable
    {
        /// <summary>
        /// 返回Dictionary里分别指向承诺ID,文本,如果无子节点返回null
        /// </summary>
        /// <param name=”parentID”>父节点ID</param>
        /// <returns></returns>
        Dictionary<string, string> GetChildList(string parentID);

5:TreeGrid的绑定:

以职能权限这同样片,需要为此到TreeGrid这种格式,最终发现决定上下级的json,是叫“_parentId”,还有该字段未可知指定一个不存的上级,不然不显示。

对这,我吧刻画了一个简短的转移函数:

 /// <summary>
        /// 将表格转成为GreeGrid对应之Json.
        /// </summary>
        /// <param name=”dt”></param>
        /// <returns></returns>
        public static string ToTreeGridJson(MDataTable dt)
        {
            int index = dt.Columns.GetIndex(“ParentID”);
            if (index > -1)
            {
                dt.Columns[index].ColumnName = “_parentId”;
                int value = 0;
                foreach (MDataRow row in dt.Rows)
                {
                    value = row.Get<int>(index);
                    if (value == 0 || row.Get<int>(“id”) == value)//GreeGrid不在的父ID不能够出现
                    {
                        row[index].Value = DBNull.Value;
                    }
                }
            }
            return dt.ToJson(true, false);
        }

树形的功用就是出去了:

永利官方网站 1 

目前项目刚好开头,只遇到并处理了即几乎独核心的问题,后续要有问题待定。 

 

4:Tree 的绑定(MDataTable表直接转Json,不用反复查询数据库):

研讨了瞬间Tree的绑定的json格式,然后形容了一个递归函数,直接拿一个MDataTable转成为树型的Json。

 // string id,string parentID,string text,string state,string url
        /// <summary>
        /// 将表格转成为Tree对应之Json,对应之字段为(id,parentiID,text,state,url)
        /// </summary>
        /// <param name=”dt”></param>
        /// <param name=”parentID”>为0或为空</param>
        /// <returns></returns>
        public static string ToTreeJson(MDataTable dt, string parentID)
        {
            List<MDataRow> firstDt = dt.FindAll(“ParentID='” + parentID + “‘”);//第一级菜单
            if (firstDt.Count > 0)
            {
                MDataRow row = null;
                JsonHelper json = new JsonHelper();
                string id, text, url;
                for (int i = 0; i < firstDt.Count; i++)
                {
                    row = firstDt[i];
                    id = row.Get<string>(“id”);
                    text = row.Get<string>(“text”);
                    json.Add(“id”, id);
                    json.Add(“text”, text);

                    url = row.Get<string>(“url”);
                    if (!string.IsNullOrEmpty(url))
                    {
                        json.Add(“attributes”, “{\”url\”:\”” + url + “\”}”, true);
                    }
                    string children = ToTreeJson(dt, id);
                    if (!string.IsNullOrEmpty(children))
                    {
                        if (row.Get<bool>(“state”))
                        {
                            json.Add(“state”, “closed”);
                        }
                        json.Add(“children”, children, true);
                    }
                    json.AddBr();
                }
                return json.ToString(true);
            }
            return string.Empty;

对传进来之MDataTable,需要修改列名和呼应的字段对达成,然后保留一个通用的上级字段(ParentID)就可以了,最终便出来这种格式了。

永利官方网站 2 

 

1:兼容IE8问题

话说当前流行版本easyUI
1.3.4未支持ie8,听说是jq2.0勿支持之原委,只好降级使用及easyui
1.3.2,对应的jq1.8本。

后台:

2:Form表单的CheckBox问题

easyUI有个Form表单的自动赋值:$(“#id”).form(‘load’,json);

同开始为此如此的代码:

using (MAction action = new MAction(TableNames.Roles))
{
   if (action.Fill(ID))
   {
     return  action.Data.ToJson();
   }
}

结果发现返回的json怎么也让checkbox赋不了价值,网上也无相应的材料好寻,最后调一下js,看到普通的input赋值,想到了on。

于是乎将返回的true替换成on,[action.Data.ToJson().Replace(“True”, “on”)] 就好了。

 

亚:数据库数据准备

前言:

话说到新的公司现已呆了三单周末了,从上班的次上开始即径直于写项目文档和让开发人员培训,以至于我之QQ签名从”我不是来做培训之“到最后直接换成”我是来干培训之“。

尽管如此名义开发经营,但下目前就2人口,手下的人尽管混了了2年工龄,但连进程,线程,泛型,面向对象等基础还摸不着头脑的有点女孩,要要他们写代码,只好时不时的抽空吃说基础了。

话说下周的下周尚见面起Boss的院所里招来二十几只学生过来实习,要自己说项目,写起详细的文档,然后简短培训生学生,让学员看正在文档就能做事,明白了自己是来将培训的。

好了,玩笑了后,下面说说即用EasyUI遇到的几接触问题:

 

3:DataGrid里的CheckBox问题:

对此表格,需要以或多或少bool型的字段格式化成checkbox显示,找到了大体上天,发现只有用formatter格式化出来好的体:

 var formatCheckBox = function (value, row, index) {
        if (value == “1” || value == “True”) {
            return “<input type=’checkbox’ checked=’checked’ disabled=’disabled’ />”;
        } else {
            return “<input type=’checkbox’ disabled=’disabled’  />”;
        }
    }

接下来界面指定:

 <th  data-options=”field:’IsEnabled’,formatter:formatCheckBox” > 是否启用</th>

悲催的凡,格式出来的控件,没有对应之API可以获相关的值,目前底处理方式只好通过加点击事件,来拍卖后续状态改变后值的交由。

 

        /// <summary>
        /// 绑定连动级的下拉菜单
        /// </summary>
        /// <param name=”ddlGoodsType”>传进一个深受绑定的DropDownList</param>
        /// <param name=”removeID”>被铲除绑定的节点ID</param>
        public void Bind(ListControl dropDown, string removeID, string parentID)
        {
            
            ListItem listItem = null;
            string currentID = parentID;//根节点/父ID
            string currentSign = string.Empty;//当前节点符号;
            string parrentSign = string.Empty; //父节点符号;
            bool HasChild = true;//是否有子
            Queue<string> parentKeyList = new Queue<string>();//存 有子节点的 节点ID
            Queue<string> parentSignList = new Queue<string>();//对承诺节点ID的前缀符号
            int itemIndexOf = 0;//父节点所在的位置 
            while (HasChild)
            {
                int lastOneCount = 1;//用于计算在同级别中是否最终一个
                Dictionary<string, string> childList = _DropDownTree.GetChildList(currentID);// 得到子节点列表
                if (childList != null)
                {
                    if (!string.IsNullOrEmpty(removeID) && childList.ContainsKey(removeID))
                    {
                        childList.Remove(removeID);
                    }
                    foreach (KeyValuePair<string, string> entry in childList)
                    {
                        if (_DropDownTree.GetChildList(entry.Key) != null)//存在子
                        {
                            currentSign = GetPreFix(lastOneCount == childList.Count, true, parrentSign);
                            listItem = new ListItem(currentSign + entry.Value, entry.Key);

永利官方网站 3永利官方网站 4

                            parentKeyList.Enqueue(entry.Key);//当前底节点ID
                            parentSignList.Enqueue(currentSign);//当前之节点符号
                        }
                        else//不存在子
                        {
                            currentSign = GetPreFix(lastOneCount == childList.Count, false, parrentSign);
                            listItem = new ListItem(currentSign + entry.Value, entry.Key);
                        }
                        if (dropDown.Items.Count != 0)
                        {
                            itemIndexOf = string.IsNullOrEmpty(currentID) ? itemIndexOf + 1 : dropDown.Items.IndexOf(dropDown.Items.FindByValue(currentID)) + lastOneCount;
                        }
                        dropDown.Items.Insert(itemIndexOf, listItem);//添加子节点
                        lastOneCount++;
                    }
                    if (parentKeyList.Count > 0)//存在子节点时
                    {
                        currentID = parentKeyList.Dequeue();
                        parrentSign = parentSignList.Dequeue();
                    }
                    else
                    {
                        HasChild = false;
                    }
                }
                else
                {
                    break;
                }

            }
            _DropDownTree.Dispose();
        }
        #endregion
    }
}

B:实现接口

 protected void Page_Load(object sender, EventArgs e)
 {
     new Tree.ProductTree().DropDownTree.Bind(ddlProduct,null, “0”);
 }

简化后的代码如下:

季:展示下结果

一律:新建项目

        #endregion

1:项目添加CYQ.Data引用

namespace Entity
{
    public enum TableNames
    {
        Product
    }
    public enum Product
    {
        ID,
        ParentID,
        Name
    }
}

ps:他管示例的另代码当成是 CYQ.Data
框架 里的代码。

前言:

类解决方案一经下图:

1:为便于示例,这里用了Access数据库,新建一个Product表,并也之补充加了几乎实施数据,如图:

 

        public DropDownTree DropDownTree
        {
            get
            {
                return new DropDownTree(this);
            }
        }

永利官方网站 5

 

        #endregion
    }
}

<appSettings>
    <add key=”AccessDbNameForWeb” value=”App_Data/tree.mdb”/>
</appSettings>
<connectionStrings>
    <add name=”Conn” connectionString=”Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}” providerName=”System.Data.OleDb”/>
</connectionStrings>

永利官方网站 6

 

本文将针对前的代码进行小小的的简化,并为的树一个圆的运示范,以下也正式以步骤:

1:新建测试站点WebDemo项目,并以数据库放到App_Data目录下,如图:

A:为说明增加枚举,如下:

永利官方网站 7

PS:传说点一下推荐会发10只园豆,喜欢麻烦点一下“推荐”,thank you very
much!!

namespace Tree
{
    /// <summary>
    /// 作者:路过秋天
    /// 博客:http://cyq1162.cnblogs.com
    /// 秋色园:http://www.cyqdata.com
    /// </summary>
    public class ProductTree : IDropDownTree
    {
        int count = 0;
        private MAction action;
        public ProductTree()
        {
            action = new MAction(TableNames.Product);
        }

            MDataTable table = action.Select(0, 0, “ParentID=” + parentID, out count);
            Dictionary<string, string> dic = null;
            if (count > 0)
            {
                dic = new Dictionary<string, string>();
                foreach (MDataRow row in table.Rows)
                {
                    dic.Add(row.Get<string>(Product.ID), row.Get<string>(Product.Name));
                }
            }
            return dic;
        }

 

 

 

永利官方网站 8

using System.Collections.Generic;
using System.Web.UI.WebControls;
namespace Tree
{
    public sealed class DropDownTree
    {
        IDropDownTree _DropDownTree;
        public DropDownTree(IDropDownTree dropDownTree)
        {
            _DropDownTree = dropDownTree;
        }
        /// <summary>
        /// 用于培养的前缀
        /// </summary>
        /// <param name=”IsLast”>是否是同级节点受到之尾声一个</param>
        /// <param name=”HasChild”>本节点是否具子节点</param>
        /// <param name=”ParentString”>父节点前缀符号</param>
        /// <returns>本节点的先头缀</returns>
        private string GetPreFix(bool isLast, bool hasChild, string parentString)
        {
            string result = string.Empty;
            if (!string.IsNullOrEmpty(parentString))
            {
                parentString = parentString.Remove(parentString.Length – 1).Replace(“├”, “│”).Replace(“└”, “ ”);
                result += parentString;
            }
            result += isLast ? “└” : “├”;
            result += hasChild ? “┬” : “─”;
            return result;
        }
        #region 绑定下拉菜单

永利官方网站 9

2:新建ProductTree类,实现IDropDownTree接口

3:Default.界面调用代码

 

1:提供示范源码下载:–点击下载 [近年十二分少写文,点击下载的君转移忘了点下推荐哦^-^]]

        #region IDropDownTree 成员

永利官方网站 10永利官方网站 11IDropDownTree

        public Dictionary<string, string> GetChildList(string parentID)
        {

using Tree;
using CYQ.Data;
using Entity;
using CYQ.Data.Table;
using System.Collections.Generic;

 

        /// <summary>
        /// 实现之代码里写return new Tree.DropDownTree(this);
        /// </summary>
        DropDownTree DropDownTree
        {
            get;
        }
    }
}

今天当群里有人提问于了自己一个于远古的题材:带线的无限级下拉树列表他运行不起来。

加大一下拉框:<asp:DropDownList ID=”ddlProduct” runat=”server”></asp:DropDownList>

永利官方网站 12永利官方网站 13DropDownTree

 

其三:引用CYQ.Data框架来促成

 

不过要之同时拉上了CYQ.Data
框架,让自家一时觉得比悬,因为文章是08年常写的,而框架最今年才发力完善的,

2:Web.config配置好数据库链接如下:

2:秋色园V2.5将以最近颁布,欢迎提前浏览 http://www.cyqdata.com

因而两者应是从未有过啥关系的,不过当下同样咨询可,给了自一个写是文章的时机。

DropDownTree

        public void Dispose()
        {
            action.Close();
        }

using System.Collections.Generic;

永利官方网站 14永利官方网站 15

 

末了提醒:

1:将IDropDownTree及DropDownTree放到类里,如下图:

4:最后的输出结果,如图

IDropDownTree

        #region IDisposable 成员

前台:

相关文章