FineUI开源版之TreeGrid实现
FineUI开源版是没有树表格的,但是又需要,怎么办呢?在博客园看到一位大大的文章
http://www.cnblogs.com/shiworkyue/p/4211002.html
然后参考,不知道为什么这位大大的代码我运行不了,有问题,然后自己修改了下,逻辑什么的各位可以前往这个大大的博客看,下面放上代码
FineUI的Grid.cs代码
添加的代码
#region hzh modify
/// <summary>
/// 是否启用树(扩展)
/// </summary>
[Category(CategoryName.OPTIONS)]
[DefaultValue(null)]
[Description("是否启用树(扩展)")]
public bool EnableTree
{
get
{
object obj = FState["EnableTree"];
return obj == null ? false : (bool)obj;
}
set
{
FState["EnableTree"] = value;
if (value)
{
EnableRowClickEvent = false;
}
}
} /// <summary>
/// 是否展开树(扩展)
/// </summary>
[Category(CategoryName.OPTIONS)]
[DefaultValue(null)]
[Description("是否展开树(扩展)")]
public bool ExpandAll
{
get
{
object obj = FState["ExpandAll"];
return obj == null ? true : (bool)obj;
}
set
{
FState["ExpandAll"] = value;
if (value)
{
EnableRowClickEvent = false;
}
}
}
/// <summary>
/// 树节点列名(扩展)
/// </summary>
[Category(CategoryName.OPTIONS)]
[DefaultValue(null)]
[Description("树节点列名(扩展)")]
public string TreeName
{
get
{
object obj = FState["TreeName"];
return obj == null ? "" : (string)obj;
}
set
{
FState["TreeName"] = value;
}
} /// <summary>
/// 主键ID(扩展)
/// </summary>
[Category(CategoryName.OPTIONS)]
[DefaultValue(null)]
[Description("主键ID(扩展)")]
public string TreeDataIDField
{
get
{
object obj = FState["TreeDataIDField"];
return obj == null ? "" : (string)obj;
}
set
{
FState["TreeDataIDField"] = value;
}
}
/// <summary>
/// 父节点列名(扩展)
/// </summary>
[Category(CategoryName.OPTIONS)]
[DefaultValue(null)]
[Description("父节点列名(扩展)")]
public string TreeDataParentIDField
{
get
{
object obj = FState["TreeDataParentIDField"];
return obj == null ? "" : (string)obj;
}
set
{
FState["TreeDataParentIDField"] = value;
}
} /// <summary>
/// 得到当然行的层级(扩展)
/// </summary>
/// <param name="row">当前行</param>
/// <param name="Rows">行数据集</param>
/// <returns>层级</returns>
private int GetLevelNub(GridRow row, GridRowCollection Rows)
{
int lub = ;
//ID所在列
int IDindex = FindColumn(TreeDataIDField).ColumnIndex;
//父ID所在列
int ParentIDindex = FindColumn(TreeDataParentIDField).ColumnIndex;
//如果过是第第一级就是0
if (row.Values[ParentIDindex].ToString() == "" || row.Values[ParentIDindex].ToString() == "")
{
return lub;
}
else
{
foreach (GridRow gr in Rows)
{
//如果有父级
if (gr.Values[IDindex].ToString() == row.Values[ParentIDindex].ToString())
{
//层级加1
lub++;
//查看父级的父级
int nub = GetLevelNub(gr, Rows);
lub += nub == ? : nub;
}
}
}
return lub;
} private List<GridRow> InsertRowToList(List<GridRow> toList, List<GridRow> sourceRows, int idindex, int pridindex)
{
for (int i = toList.Count - ; i >= ; i--)
{
GridRow torow = toList[i];
bool ismodify = false;
if (sourceRows == null || sourceRows.Count <= )
return toList;
for (int j = sourceRows.Count - ; j >= ; j--)
{
GridRow baserow = sourceRows[j];
if (baserow.Values[pridindex].ToString() != "" && baserow.Values[pridindex].ToString() == torow.Values[idindex].ToString())
{
toList.Insert(i + , baserow);
sourceRows.RemoveAt(j);
ismodify = true;
}
}
if (sourceRows.Count <= )
{
sourceRows.Clear();
sourceRows = null;
return toList;
}
if (ismodify == false)
{
if (sourceRows.Count > )
{
foreach (GridRow item in sourceRows)
{
toList.Add(item);
}
sourceRows.Clear();
sourceRows = null;
}
return toList;
}
}
return InsertRowToList(toList, sourceRows, idindex, pridindex);
} /// <summary>
/// 对rows进行重新排序(扩展)
/// </summary>
private void SortTreeRows()
{
List<GridRow> sourceRows = new List<GridRow>();
foreach (GridRow row in Rows)
{
sourceRows.Add(row);
}
Rows.Clear(); List<GridRow> toList = new List<GridRow>(); int pidindex = FindColumn(TreeDataParentIDField).ColumnIndex;
int idindex = FindColumn(TreeDataIDField).ColumnIndex;
for (int i = sourceRows.Count - ; i >= ; i--)
{
GridRow row = sourceRows[i];
if (row.Values[pidindex].ToString() == "" || row.Values[pidindex].ToString() == "")
{
toList.Insert(, row);
sourceRows.RemoveAt(i);
}
} toList = InsertRowToList(toList, sourceRows, idindex, pidindex);
toList.ForEach(p => Rows.Add(p));
for (int i = ; i < Rows.Count; i++)
{
Rows[i].RowIndex = i;
}
toList.Clear();
toList = null;
} /// <summary>
/// 给树赋值(扩展)
/// </summary>
private void SetValueTree()
{
if (EnableTree)
{
foreach (GridRow row in Rows)
{
//下级行数
string Nextindex = GetNextIndex(row, Rows);
//默认图标
Icon iconindex = FineUI.Icon.ControlBlankBlue;
// string iconname = "page.png";
//图片ID,点击用,绑定事件
string imgid = ClientID + "_tree_icon_" + row.RowIndex;
//父节点图标
if (Nextindex != "")
{
if (ExpandAll)
{
iconindex = FineUI.Icon.ControlRemoveBlue;
//设置展开行
RowCollapsed.Add(row.RowIndex.ToString());
}
else
{
iconindex = FineUI.Icon.ControlAddBlue;
}
// iconname = "folder.png"; //加入图标和ID,注意加过的就不加了
if (row.Values[FindColumn(TreeName).ColumnIndex].ToString().IndexOf(ClientID + "_tree_icon_") < )
{
row.Values[FindColumn(TreeName).ColumnIndex] = "<img id=\"" + imgid + "\" src=\"" + IconHelper.GetResolvedIconUrl(iconindex) + "\" width=\"16\" height=\"16\" style=\"margin-top:-5px;margin-bottom:-2px;cursor: pointer\"/>" + row.Values[];
}
}
}
}
} /// <summary>
/// 得到下级行号
/// </summary>
/// <param name="row">本节点</param>
/// <param name="Rows">集合</param>
/// <returns>集合以,隔开</returns>
private string GetNextIndex(GridRow row, GridRowCollection Rows)
{
string topindex = "";
int pridindex = FindColumn(TreeDataParentIDField).ColumnIndex;
int idindex = FindColumn(TreeDataIDField).ColumnIndex;
foreach (GridRow gr in Rows)
{
//父ID等于本ID添加到集合
if (gr.Values[pridindex].ToString() != "" && gr.Values[pridindex].ToString() == row.Values[idindex].ToString())
{
topindex += topindex == "" ? gr.RowIndex.ToString() : "," + gr.RowIndex.ToString();
}
}
return topindex;
} /// <summary>
/// 得到所有子类行号
/// </summary>
/// <param name="row">本节点</param>
/// <param name="Rows">集合</param>
/// <param name="strIndexs">集合以,隔开</param>
/// <returns>集合以,隔开</returns>
private void GetAllNextIndex(int rowindex, GridRowCollection Rows, ref string strIndexs)
{
string index = GetNextIndex(Rows[rowindex], Rows);
if (string.IsNullOrEmpty(index.Trim()))
return;
strIndexs = string.IsNullOrEmpty(strIndexs) ? index : (strIndexs + "," + index);
string[] indexs = index.Split(',');
foreach (string item in indexs)
{
GetAllNextIndex(int.Parse(item), Rows, ref strIndexs);
}
} /// <summary>
/// 点击事件只给有子集的点击事件(扩展)
/// </summary>
private void TreeClick()
{
StringBuilder sbx = new StringBuilder();
foreach (GridRow row in Rows)
{
//有下级菜单才绑定事件
string Nextindex = GetNextIndex(row, Rows);
if (Nextindex != "")
{
string imgid = ClientID + "_tree_icon_" + row.RowIndex;
sbx.Append("$('#" + imgid + "').click(function(){F.customEvent(\"GridTreeClick_" + row.RowIndex + "\");});");
}
}
PageContext.RegisterStartupScript(sbx.ToString());
} // private static string _moveindex;//移除的数据
/// <summary>
/// 移除的数据(扩展)
/// </summary>
public List<string> MoveIndex
{
get
{
object obj = ViewState["MoveIndex"];
return obj == null ? new List<string>() : obj as List<string>;
}
set
{ ViewState["MoveIndex"] = value;
}
} // private static List<string> _RowCollapsed;//展开集合
/// <summary>
/// 展开集合(扩展)
/// </summary>
public List<string> RowCollapsed
{
get
{
object obj = ViewState["RowCollapsed"];
return obj == null ? new List<string>() : obj as List<string>;
}
set
{ ViewState["RowCollapsed"] = value;
}
} /// <summary>
/// 第一次显示数方法(扩展)
/// </summary>
private void ShowTree()
{
//初始化树
if (EnableTree)
{
if (!ExpandAll)
{
List<string> lstMove = new List<string>();
//循环行
foreach (GridRow row in Rows)
{
//得到层级
int lub = GetLevelNub(row, Rows);
if (lub != )
{
//子集删除
if (!lstMove.Contains(row.RowIndex.ToString()))
lstMove.Add(row.RowIndex.ToString());
}
}
//排序(重要) 从大到小排序,不排序会删除1后造成2变成1
lstMove.Sort(delegate(string str1, string str2) { return int.Parse(str2) - int.Parse(str1); });
if (MoveIndex == null || MoveIndex.Count == )
MoveIndex = lstMove;
string strMoveIndex = string.Empty;
foreach (string item in lstMove)
{
strMoveIndex += string.IsNullOrEmpty(strMoveIndex) ? item : ("," + item);
} string js = string.Empty;
if (!string.IsNullOrEmpty(strMoveIndex))
{
//放入缓存记录已经消除的行 js = ""
+ "var store =" + XID + ".getStore();"
+ "var rows = [" + strMoveIndex + "];"
+ "Ext.Array.each(rows, function (rowIndex, index) {"
+ " store.removeAt(rowIndex);"
+ "});"
//刷新行号,(重要)
+ XID + ".view.refresh();"; }
if (!string.IsNullOrEmpty(js))
PageContext.RegisterStartupScript(js);
//绑定树点击事件
TreeClick();
}
else
{
List<string> _RowCollapsed = new List<string>();
//循环行
foreach (GridRow row in Rows)
{
//得到层级
if (!string.IsNullOrEmpty(GetNextIndex(row, Rows)))
{
if (!_RowCollapsed.Contains(row.RowIndex.ToString()))
_RowCollapsed.Add(row.RowIndex.ToString());
}
}
RowCollapsed = _RowCollapsed;
//绑定树点击事件
TreeClick();
}
}
} /// <summary>
/// 点击树事件(扩展)
/// </summary>
/// <param name="treenode">点击的节点(行号)</param>
public void DoTreeClick(string treenode)
{
if (EnableTree)
{
StringBuilder sb = new StringBuilder();
List<string> _MoveIndex = MoveIndex;
List<string> _RowCollapsed = RowCollapsed;
//集合
if (_RowCollapsed == null)
{
_RowCollapsed = new List<string>();
}
//每次点击更改集合,移出和新增
if (_RowCollapsed.Contains(treenode))
{
_RowCollapsed.Remove(treenode);
string strids = string.Empty;
GetAllNextIndex(int.Parse(treenode), Rows, ref strids);
if (!string.IsNullOrEmpty(strids.Trim()))
{
string[] ids = strids.Split(',');
foreach (string item in ids)
{
_RowCollapsed.Remove(item);
if (!_MoveIndex.Contains(item))
_MoveIndex.Add(item);
}
}
}
else
{
if (!_RowCollapsed.Contains(treenode))
_RowCollapsed.Add(treenode);
string strids = GetNextIndex(Rows[int.Parse(treenode)], Rows);
if (!string.IsNullOrEmpty(strids.Trim()))
{
string[] ids = strids.Split(',');
foreach (string item in ids)
{
_MoveIndex.Remove(item);
}
}
} int PIDindex = FindColumn(TreeDataParentIDField).ColumnIndex;
int IDindex = FindColumn(TreeDataIDField).ColumnIndex; if (_MoveIndex.Count >= )
{
_MoveIndex.Sort(delegate(string str1, string str2) { return int.Parse(str2 == "" ? "" : str2) - int.Parse(str1 == "" ? "" : str1); });
}
string strMoveIndex = string.Empty;
foreach (string ss in _MoveIndex)
{
strMoveIndex += strMoveIndex == "" ? ss : "," + ss;
} RowCollapsed = _RowCollapsed;
MoveIndex = _MoveIndex; if (strMoveIndex != null)
{
string js = ""
+ "var store =" + XID + ".getStore();"
+ "var rows = [" + strMoveIndex + "];"
+ "Ext.Array.each(rows, function (rowIndex, index) {"
+ " store.removeAt(rowIndex);"
+ "});"
//刷新行号,(重要)
+ XID + ".view.refresh();"; //string js = ""
// + "var store =F('" + ClientID + "').getStore();"
// + "var rows = [" + moveindex + "];"
// + "Ext.Array.each(rows, function (rowIndex, index) {"
// + " store.removeAt(rowIndex);"
// + "});" // + "F('" + ClientID + "').view.refresh();"; sb.Append("F('" + ClientID + "').f_loadData();");
sb.Append(js); } foreach (string item in RowCollapsed)
{
string imgid = ClientID + "_tree_icon_" + item;
sb.Append( "$(\"#" + imgid + "\").attr(\"src\",\"" + IconHelper.GetResolvedIconUrl(FineUI.Icon.ControlRemoveBlue) + "\");");
} PageContext.RegisterStartupScript(sb.ToString());
TreeClick();
} }
/// <summary>
/// 循环子集(扩展)
/// </summary>
/// <param name="treeindex"></param>
/// <param name="movelist"></param>
private void DoNextTreeClick(string treeindex, ref List<string> movelist, bool Collapsed)
{
if (EnableTree)
{
StringBuilder sb = new StringBuilder();
int PIDindex = FindColumn(TreeDataParentIDField).ColumnIndex;
int IDindex = FindColumn(TreeDataIDField).ColumnIndex;
//得到下一菜单
string nextindex = GetNextIndex(Rows[Convert.ToInt32(treeindex)], Rows);
if (nextindex != "")
{
string[] s = nextindex.Split(',');
for (int i = ; i < s.Length; i++)
{
GridRow dr = Rows[Convert.ToInt32(s[i])];
string rowindex = dr.RowIndex.ToString();
//展开
if (movelist.Contains(rowindex) && Collapsed)
{
movelist.Remove(rowindex);
}
//收起
if (!Collapsed && !movelist.Contains(rowindex))
{
movelist.Add(rowindex);
}
//展开子集在展开集合中则执行该子集的展开
if (Collapsed && RowCollapsed.Contains(rowindex))
{
DoNextTreeClick(rowindex, ref movelist, true);
}
}
}
}
}
#endregion
修改的代码(主要是修改AfterDataBind方法)
private void AfterDataBind(int recordCount)
{
#region hzh modify
if (EnableTree && !string.IsNullOrEmpty(TreeName) && !string.IsNullOrEmpty(TreeDataIDField) && !string.IsNullOrEmpty(TreeDataParentIDField))
{
SortTreeRows();
SetValueTree();
ShowTree();
}
#endregion
if (!IsDatabasePaging)
{
// 如果不是数据库分页,则每次DataBind都要更新RecordCount的值
// 数据库分页的话,RecordCount需要用户显式的赋值
RecordCount = recordCount;
} // 在所有行都绑定结束后,需要检查模拟树显示的列,并重新计算当前列的内容(在列内容前加上树分隔符)
// 1.查找需要模拟树显示的列
BaseField simulateTreeColumn = null;
foreach (GridColumn gridColumn in AllColumns)
{
BaseField column = gridColumn as BaseField;
if (column != null && !String.IsNullOrEmpty(column.DataSimulateTreeLevelField))
{
simulateTreeColumn = column;
break;
}
}
#region hzh modify
if (EnableTree)
{
if (!string.IsNullOrEmpty(TreeName))
{
simulateTreeColumn = FindColumn(TreeName) as BaseField;
}
}
#endregion // 2.如果找到这样的列
if (simulateTreeColumn != null)
{
List<SimulateTreeNode> silumateTree = new List<SimulateTreeNode>(); // 存在需要模拟树显示的列
for (int rowIndex = , rowCount = Rows.Count; rowIndex < rowCount; rowIndex++)
{
GridRow row = Rows[rowIndex];
int level = ;
#region hzh modify
if (EnableTree)
{
level = GetLevelNub(row, Rows) - ;
}
else
{
object treeLevelObj = row.GetPropertyValue(simulateTreeColumn.DataSimulateTreeLevelField);
if (treeLevelObj != null && treeLevelObj != DBNull.Value)
{
level = Convert.ToInt32(treeLevelObj);
}
}
#endregion
object content = row.Values[simulateTreeColumn.ColumnIndex]; SimulateTreeNode node = new SimulateTreeNode();
node.Text = content.ToString();
node.Level = level;
node.HasLittleBrother = false;
node.ParentNode = null;
silumateTree.Add(node);
} // 计算树
SimulateTreeHeper treeHelper = new SimulateTreeHeper();
treeHelper.ResolveSimulateTree(silumateTree, true); // 赋值
for (int rowIndex = , rowCount = Rows.Count; rowIndex < rowCount; rowIndex++)
{
Rows[rowIndex].Values[simulateTreeColumn.ColumnIndex] = silumateTree[rowIndex].Text;
}
} }
有标记“hzh modify”就是我修改和添加的
然后看一下测试页面的代码
页面代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestPage.aspx.cs" Inherits="FineUI.Examples.TestPage" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<f:PageManager ID="PageManager1" runat="server" OnCustomEvent="PageManager_CustomEvent"/>
<f:Grid EnableCollapse="true" Width="800px" Height="400px" runat="server" DataKeyNames="Id,Name"
ID="Grid1" EnableTree="true" TreeName="name" TreeDataIDField="id" TreeDataParentIDField="topID"
ShowBorder="true" ShowHeader="true" Title="树表格" EnableRowClickEvent="false" ExpandAll="false">
<Columns>
<f:RowNumberField />
<f:BoundField ColumnID="name" ExpandUnusedSpace="true" DataField="name" HeaderText="名称">
</f:BoundField>
<f:BoundField ColumnID="id" DataField="id" Width="50px" HeaderText="ID">
</f:BoundField>
<f:BoundField ColumnID="topID" DataField="topID" Width="50px" HeaderText="topID">
</f:BoundField>
<f:BoundField DataField="levelcode" Width="100px" HeaderText="层级编号">
</f:BoundField>
<f:BoundField ColumnID="levelnub" DataField="levelnub" Width="100px" HeaderText="层级数">
</f:BoundField>
<f:BoundField DataField="subitem" Width="100px" HeaderText="是否为子菜单">
</f:BoundField>
<f:BoundField DataField="url" Width="100px" HeaderText="地址">
</f:BoundField>
</Columns>
</f:Grid>
</form>
<script src="./res/js/jquery.min.js"></script>
</body>
</html>
后台代码:
using System;
using System.Collections.Generic; using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data; namespace FineUI.Examples
{
public partial class TestPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("topID", typeof(string));
dt.Columns.Add("levelcode", typeof(string));
dt.Columns.Add("levelnub", typeof(int));
dt.Columns.Add("subitem", typeof(bool));
dt.Columns.Add("url", typeof(string)); DataRow dr1 = dt.NewRow();
dr1[] = "首页";
dr1[] = ;
dr1[] = ;
dr1[] = "";
dr1[] =;
dr1[] = false;
dr1[] = "adfsdfds";
dt.Rows.Add(dr1); DataRow dr2 = dt.NewRow();
dr2[] = "测试页";
dr2[] = ;
dr2[] = ;
dr2[] = "";
dr2[] = ;
dr2[] = false;
dr2[] = "adfsdfds";
dt.Rows.Add(dr2); //==================== DataRow dr11 = dt.NewRow();
dr11[] = "首页下级1";
dr11[] = ;
dr11[] = ;
dr11[] = "";
dr11[] = ;
dr11[] = true;
dr11[] = "adfsdfds";
dt.Rows.Add(dr11); DataRow dr12 = dt.NewRow();
dr12[] = "首页下级2";
dr12[] = ;
dr12[] = ;
dr12[] = "";
dr12[] = ;
dr12[] = true;
dr12[] = "adfsdfds";
dt.Rows.Add(dr12); DataRow dr13 = dt.NewRow();
dr13[] = "首页下级3";
dr13[] = ;
dr13[] = ;
dt.Rows.Add(dr13); //======================== DataRow dr21 = dt.NewRow();
dr21[] = "测试页下级1";
dr21[] = ;
dr21[] = ;
dr21[] = "";
dr21[] = ;
dr21[] = true;
dr21[] = "adfsdfds";
dt.Rows.Add(dr21); DataRow dr22 = dt.NewRow();
dr22[] = "测试页下级2";
dr22[] = ;
dr22[] = ;
dr22[] = "";
dr22[] = ;
dr22[] = true;
dr22[] = "adfsdfds";
dt.Rows.Add(dr22); DataRow dr221 = dt.NewRow();
dr221[] = "测试页下下级1";
dr221[] = ;
dr221[] = ;
dr221[] = "";
dr221[] = ;
dr221[] = true;
dr221[] = "adfsdfds";
dt.Rows.Add(dr221); DataRow dr00 = dt.NewRow();
dr00[] = "00测试";
dr00[] = ;
dr00[] = ;
dr00[] = "";
dr00[] = ;
dr00[] = true;
dr00[] = "adfsdfds";
dt.Rows.Add(dr00); Grid1.DataSource = dt;
Grid1.DataBind();
} protected void PageManager_CustomEvent(object sender, CustomEventArgs e)
{
if (e.EventArgument.IndexOf("GridTreeClick_") >= )
{
string rowindex = e.EventArgument.ToString().Split('_')[];
Grid1.DoTreeClick(rowindex);
}
}
}
}
然后就是效果图了

再次感谢 @北京-没想好
FineUI开源版之TreeGrid实现的更多相关文章
- FineUI开源版之TreeGrid(修改)
上篇文章中做了简单实现,但是还是有bug的,还需要在外面写事件的处理,今天又进行修改了. 下面放出代码,同样的 hzh modify标记的就是我进行修改的地方 grid.cs 添加代码 #regio ...
- FineUI开源版(ASP.Net)初学手册
女朋友鄙视我原创少... 1.下载 进入官方论坛:http://www.fineui.com/bbs/ 要用到下载源代码和空项目下载 http://fineui.codeplex.com/ http: ...
- FineUI开源版(ASP.Net)开发实践-目录
点我订阅 目前所有博客的截图,方便离线观看,点图片 FineUI初学手册 下载,实例项目搭建 FineUI初学手册-部分JS整理 部分JS整理 ASP.NET-FineUI开发实践-1 实际开发环境是 ...
- FineUI开源版(ASP.Net)初学手册-部分JS整理
有人老找JS,我吧FineUI自己写的JS沾过来方便大家看看,在实现前端的时候更灵活 JS 实例 注释 控件 F.ready F.ready(function(){}); 就是ready 很多方法 ...
- FineUI(开源版)v6.0中FState服务器端验证的实现原理
前言 1. FineUI(开源版)是完整开源,最早发起于 2008-04,下载全部源代码:http://fineui.codeplex.com/ 2. 你可以通过捐赠作者来支持FineUI(开源版)的 ...
- FineUI(开源版)v4.2.2发布(8年125个版本,官网示例突破300个)!
开源版是 FineUI 的基石,从 2008 年至今已经持续发布了 120 多个版本,拥有会员 15,000 多位,捐赠会员达到 1,200 多位. FineUI(开源版)v4.2.2 是 8 年 ...
- FineUI(专业版)v1.2.0 和 FineUI(开源版)v4.1.1 同时发布!
FineUI(开源版)v4.1.1 (建议所有 v4.x 升级到此版本):http://fineui.com/demo/ +2014-08-15 v4.1.1 -修正Form中表单字段设 ...
- 这个接口管理平台 eoLinker 开源版部署指南你一定不想错过
本文主要内容是讲解如何在本地部署eoLinker开源版. 环境要求 1.PHP 5.5+ / PHP7+(推荐) 2.Mysql 5.5+ / Mariadb 5.5+ 3.Nginx(推荐) / A ...
- 开源免费接口管理平台eoLinker AMS开源版 V3.2.0更新,增加批量导出导入接口功能!
eoLinker是一个免费开源的针对开发人员需求而设计的接口管理工具,通过简单的操作来帮助开发者进行接口文档管理.接口自动化测试.团队协作.数据获取.安全防御监控等功能,降低企业的接口管理成本,提高项 ...
随机推荐
- HDU 2841 Visible Trees(数论)
标题效果:给你个m*n方格,广场格从(1,1)开始. 在树中的每个点,然后让你(0,0)点往下看,问:你能看到几棵树. 解题思路:假设你的视线被后面的树和挡住的话以后在这条线上的树你是都看不见的啊.挡 ...
- 写一个根据id字段查找记录的缓存函数(javascript)
前不久在参加面试的时候遇到了这样一道题,"写一个根据id字段查找记录的缓存函数,如果之前查过,则直接返回之前查找过的对象,而无须重新查找".当时由于时间较短加上时间比较紧张,考虑并 ...
- 基于Servlet、JSP、JDBC、MySQL登录模块(包括使用的过滤器和配置)
遇见前文的注冊模块,本篇是登录模块.主要包含登录主界面,和登录相关编写的LoginAction.LoginDao和LoginService.以及配置的Filter.以下按逻辑顺序记录具体过程和代码: ...
- 归并排序 & 快速排序
归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有 ...
- Access to the temp directory is denied. Identity 'NT AUTHORITY\NETWORK SERVICE' under which XmlSerializer is running does not have sufficient permiss
造成错误的原因是用bat代码清理系统垃圾时造成的权限丢失而引起的 错误描述 1.An error occurred creating the configuration section handler ...
- BAT 特殊符号总结
原文:BAT 特殊符号总结 BAT特殊符号总结,用好特殊符号,利用提高开发效率.^ 转义符 用在特殊符号之前 比如: echo 非常^&批处理 如果不加^ 那么"批处理"将 ...
- ArcEngine下纵断面图的绘制
我是採用Dev控件中的画图控件来绘制的纵断面图,以下主要来介绍下输电线路选址以及纵断面图的实时绘制的实现流程. 一.关于输电线路的选址,首先要准备好基础地理数据,包含选线区的DOM,DEM,DLG以及 ...
- 走进windows编程的世界-----windows进程
Windows进程 1 Windows进程 进程是一个容器,包括了一个应用程序实例的各种资源.Windows多任务的操作系统,因此能够同一时候运行多个进程. 2 Windows进程的 ...
- JavaScript-RegExp对象仅仅能使用一次
下面的代码,是測试从字符串中识别出年月日,能够看到创建的rYMD这个RegExp对象运行了一次后,又运行了一次. var DateStr = "2014-9-8"; var rYM ...
- javascript 验证 yyyy-MM-dd HH:mm:ss 的正则表达式
原文:javascript 验证 yyyy-MM-dd HH:mm:ss 的正则表达式 ^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13 ...