菜单数据(树形)结构的使用-- ---数据的列存储转换为行存储

一、菜单数据表中的存储结构

二、转换后的数据结构

三、 转换过程

1、确定菜单数据的最大级别


        /// <summary>
/// 获得Nature定义的最大目录级别,以便于确定Nature的DataTable表结构中的列数目
/// </summary>
/// <returns></returns>
public int GetMaxNatureLevel()
{
if (dtNature == null && dtNature.Rows.Count == 0)
{
dtNature = GetNatureData();
}

int maxLevel = 0;
foreach (DataRow dr in dtNature.Rows)
{
int currentLevel = 0;
GetLevelByNatureID(dr["natureid"].ToString(), ref currentLevel);
if (currentLevel > maxLevel)
{
maxLevel = currentLevel;
}
}
return maxLevel;
}

public void GetLevelByNatureID(string natureid, ref int level)
{
if (dtNature == null || dtNature.Rows.Count == 0)
{
dtNature = GetNatureData();
}

if (dtNature.Rows.Count > 0)
{
DataRow[] drs = dtNature.Select(string.Format("natureid=‘{0}‘", natureid));
if (drs.Count() > 0)
{
level++;
string parentid = drs[0]["parentid"].ToString();
DataRow[] drst = dtNature.Select(string.Format("natureid=‘{0}‘", parentid));
if (drst.Length > 0)
{
GetLevelByNatureID(parentid, ref level);
}
}
}
}

2、 构造存储该数据的表结构


        /// <summary>
/// 依据Nature目录的最大级别,声明表的存储结构
/// </summary>
/// <returns></returns>
public DataTable DeclareNatureTable()
{
DataTable dt = new DataTable();
if (dtNature == null && dtNature.Rows.Count == 0)
{
dtNature = GetNatureData();
}
dt.Columns.Add("natureid");

int MaxLevel = GetMaxNatureLevel();
for (int i = 1; i <= MaxLevel; i++)
{
dt.Columns.Add("nature" + i.ToString());
}
return dt;
}

三、 获得菜单数据的全部信息


   /// <summary>
/// 获得数据库中Nature的所有信息
/// </summary>
/// <returns></returns>
public DataTable GetNatureData()
{
DataTable dt = new DataTable();
try
{
string sQuery = string.Format(" SELECT natureid,naturenm,parentid,seqnumbr FROM dbo.CRNATUREM0 WHERE dsblflag =0 ORDER BY seqnumbr ");
Database db = DatabaseFactory.CreateDatabase();
DataSet ds = db.ExecuteDataSet(CommandType.Text, sQuery);

if (ds != null)
{
dt = ds.Tables[0];
}
}
catch (Exception ex)
{
MessageBox.Show("查询数据失败:" + ex.Message);
}
return dt;
}

四、将数据的树形存储转为线性存储


        public DataTable GetNatureTable()
{
try
{
if (dtNature != null && dtNature.Rows.Count == 0)
{
dtNature = GetNatureData();
}

dtResult = DeclareNatureTable(); // 声明表的结构
foreach (DataRow dr in dtNature.Rows)
{
DataRow drn = dtResult.NewRow();
string natureid = dr["natureid"].ToString();
drn["natureid"] = natureid;
int level = 0;
GetLevelByNatureID(natureid, ref level);
int leve11 = 0;
Dictionary<int, string> natureDict = new Dictionary<int, string>();
GetNatureValsByID(natureid, ref leve11,natureDict);
foreach (KeyValuePair<int, string> keyNature in natureDict)
{
string colName = "nature" + (level - keyNature.Key).ToString();
drn[colName] = keyNature.Value;
}
dtResult.Rows.Add(drn);
}
}
catch (Exception ex)
{
MessageBox.Show("查询数据失败:" + ex.Message);
}
return dtResult;
}

/// <summary>
/// 依据Natureid 获得相应的所有级类目信息
/// </summary>
/// <param name="natureid"></param>
/// <param name="level"></param>
/// <param name="natureDict"></param>
public void GetNatureValsByID(string natureid, ref int level,Dictionary<int, string> natureDict)
{
if (dtNature != null && dtNature.Rows.Count == 0)
{
dtNature = GetNatureData();
}

if (dtNature != null && dtNature.Rows.Count > 0)
{
DataRow[] drs = dtNature.Select(string.Format("natureid=‘{0}‘", natureid));
natureDict.Add(level, drs[0]["naturenm"].ToString());
natureid = drs[0]["parentid"].ToString();

if(natureid.Trim().Length > 0)
{
++level;
GetNatureValsByID(natureid, ref level, natureDict);
}
}

}

五、总结(整体代码概览)


    public class NatureData
{
private DataTable dtNature = new DataTable();
private DataTable dtResult = new DataTable();
public NatureData()
{

}

public DataTable GetNatureTable()
{
try
{
if (dtNature != null && dtNature.Rows.Count == 0)
{
dtNature = GetNatureData();
}

dtResult = DeclareNatureTable(); // 声明表的结构
foreach (DataRow dr in dtNature.Rows)
{
DataRow drn = dtResult.NewRow();
string natureid = dr["natureid"].ToString();
drn["natureid"] = natureid;
int level = 0;
GetLevelByNatureID(natureid, ref level);
int leve11 = 0;
Dictionary<int, string> natureDict = new Dictionary<int, string>();
GetNatureValsByID(natureid, ref leve11,natureDict);
foreach (KeyValuePair<int, string> keyNature in natureDict)
{
string colName = "nature" + (level - keyNature.Key).ToString();
drn[colName] = keyNature.Value;
}
dtResult.Rows.Add(drn);
}
}
catch (Exception ex)
{
MessageBox.Show("查询数据失败:" + ex.Message);
}
return dtResult;
}

/// <summary>
/// 依据Natureid 获得相应的所有级类目信息
/// </summary>
/// <param name="natureid"></param>
/// <param name="level"></param>
/// <param name="natureDict"></param>
public void GetNatureValsByID(string natureid, ref int level,Dictionary<int, string> natureDict)
{
if (dtNature != null && dtNature.Rows.Count == 0)
{
dtNature = GetNatureData();
}

if (dtNature != null && dtNature.Rows.Count > 0)
{
DataRow[] drs = dtNature.Select(string.Format("natureid=‘{0}‘", natureid));
natureDict.Add(level, drs[0]["naturenm"].ToString());
natureid = drs[0]["parentid"].ToString();

if(natureid.Trim().Length > 0)
{
++level;
GetNatureValsByID(natureid, ref level, natureDict);
}
}

}

public void GetLevelByNatureID(string natureid, ref int level)
{
if (dtNature == null || dtNature.Rows.Count == 0)
{
dtNature = GetNatureData();
}

if (dtNature.Rows.Count > 0)
{
DataRow[] drs = dtNature.Select(string.Format("natureid=‘{0}‘", natureid));
if (drs.Count() > 0)
{
level++;
string parentid = drs[0]["parentid"].ToString();
DataRow[] drst = dtNature.Select(string.Format("natureid=‘{0}‘", parentid));
if (drst.Length > 0)
{
GetLevelByNatureID(parentid, ref level);
}
}
}
}

/// <summary>
/// 获得Nature定义的最大目录级别,以便于确定Nature的DataTable表结构中的列数目
/// </summary>
/// <returns></returns>
public int GetMaxNatureLevel()
{
if (dtNature == null && dtNature.Rows.Count == 0)
{
dtNature = GetNatureData();
}

int maxLevel = 0;
foreach (DataRow dr in dtNature.Rows)
{
int currentLevel = 0;
GetLevelByNatureID(dr["natureid"].ToString(), ref currentLevel);
if (currentLevel > maxLevel)
{
maxLevel = currentLevel;
}
}
return maxLevel;
}

/// <summary>
/// 依据Nature目录的最大级别,声明表的存储结构
/// </summary>
/// <returns></returns>
public DataTable DeclareNatureTable()
{
DataTable dt = new DataTable();
if (dtNature == null && dtNature.Rows.Count == 0)
{
dtNature = GetNatureData();
}
dt.Columns.Add("natureid");

int MaxLevel = GetMaxNatureLevel();
for (int i = 1; i <= MaxLevel; i++)
{
dt.Columns.Add("nature" + i.ToString());
}
return dt;
}

/// <summary>
/// 获得数据库中Nature的所有信息
/// </summary>
/// <returns></returns>
public DataTable GetNatureData()
{
DataTable dt = new DataTable();
try
{
string sQuery = string.Format(" SELECT natureid,naturenm,parentid,seqnumbr FROM dbo.CRNATUREM0 WHERE dsblflag =0 ORDER BY seqnumbr ");
Database db = DatabaseFactory.CreateDatabase();
DataSet ds = db.ExecuteDataSet(CommandType.Text, sQuery);

if (ds != null)
{
dt = ds.Tables[0];
}
}
catch (Exception ex)
{
MessageBox.Show("查询数据失败:" + ex.Message);
}
return dt;
}

}

六、运行效果;如下图

数据结构:


CREATE TABLE [dbo].[CRNATUREM0](
[natureid] [nvarchar](10) NOT NULL,
[naturenm] [nvarchar](100) NULL,
[parentid] [nvarchar](10) NULL,
[seqnumbr] [int] NULL,
[dsblflag] [bit] NULL,
[lstupdby] [nvarchar](30) NULL,
[lstupddt] [datetime] NULL,
[natext] [text] NULL,
CONSTRAINT [PK_CRNATUREM0] PRIMARY KEY CLUSTERED
(
[natureid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

附源代码:下载

菜单数据(树形)结构的使用-- ---数据的列存储转换为行存储,码迷,mamicode.com

时间: 2024-08-26 05:41:33

菜单数据(树形)结构的使用-- ---数据的列存储转换为行存储的相关文章

Atitit.各种 数据类型 ( 树形结构,表形数据 ) 的结构与存储数据库 attilax 总结

Atitit.各种  数据类型 ( 树形结构,表形数据  ) 的结构与存储数据库 attilax  总结 1. 数据结构( 树形结构,表形数据,对象结构 ) 1 2. 编程语言中对应的数据结构 java c# php ( Dic/Map      List    datatable ) 1 3. 数据库存储数据  1 4. 数据的表形显示( 多条记录 与单条记录 ) 2 5. ASP.NET 数据控件:GridView,DataList,Repeater ,DetailsView,FormVie

easyui中的下拉菜单是树形结构时如何实现onchange方法

今天碰到一个问题就是我写的代码中的一个下拉列表显示的是树型菜单,代码如下(使用的是easyui): .... <tr> <td>地区:</td> <td><input type="combo" id="areaId" name="areaId" class="easyui-combotree" data-options="{url:'areaTree'}"

专利:结构化大数据通信协议(2)

说明2:数据的唯一性是实现"数据全球通"的基础 在班.组这样的小环境中可以用每个人的姓名而区分出每一个人,然而在全国范围内,由于人数太多,重名的很多,因此仅靠姓名就不能准确无误地识别出每一个人.大数据时代以前的关系数据库中的数据只是应用于某个机构内部,因此各个数据就容易识别,然而如果把关系数据库中的数据放到大数据环境中,那么这些数据就成了不可识别的数据.在大数据环境中,有关人的所有数据都必须含有"身份证号",这是为了表明数据的唯一性. 关系数据库用"ID&

专利:结构化大数据通信协议

发明专利技术 结构化大数据通信协议 发明人:樊永正 [email protected] 技术领域 结构化大数据通信协议是一种通信协议,也是一种让数据成为合格的结构化大数据的技术.结构化大数据通信协议也类似于ETL,ETL是处理现有的信息系统所产生的数据的问题,而结构化大数据通信协议是在设计信息系统之初就开始预防数据产生问题.ETL是为数据治病,结构化大数据通信协议是预防数据产生疾病.ETL是对现有技术所产生的问题进行小修小补,结构化大数据通信协议提出了新的数据处理方案.结构化大数据通信协议也是一

easyUI树形结构

树形结构是常见也是常用的,之前一直在使用但是基本都是调用别人写好的方法,好像也没调用太明白的感觉,这次在开发ITOO的时候终于研究了一番,发现其实要实现树形结构其实不是一件困难的事,而且实现方法也不是唯一的,之前大家都很倾向使用zTree,网上搜了一下发现zTtree是一个比较强大"树插件"但是觉得对于目前的我来说并不是很合适,首先我们的前台框架使用的easyUI,easyUI有自己的树形结构控件,再引入一个zTree没有多大的必要:而且对于我来说相对于js代码来说我更熟悉使用后台ja

Delphi中根据分类数据生成树形结构的最优方法

一. 引言:    TreeView控件适合于表示具有多层次关系的数据.它以简洁的界面,表现形式清晰.形象,操作简单而深受用户喜爱.而且用它可以实现ListView.ListBox所无法实现的很多功能,因而受到广大程序员的青睐.    树形结构在Windows环境中被普遍应用,但在数据库开发中面对层次多.结构复杂的数据,如何快速构造树形目录并实现导航呢?    二. 实现关键技术:    在Delphi提供的控件中包含了TreeView控件,但树的具体形成还需要用户编写代码.即它的列表项要在程序

通用列表数据转化为树形结构

近期做项目用的是JQuery  easyUI 控件, 尽管非常强大,可是高级控件对于数据的格式要求比較严格遇到 例如以下问题 1.使用comboTree 控件   绑定树形的组织结构   可是 数据库查到的数据格式是 列表形式,并不符合  combotree的数据结构 以下是我的数据和  combotree 数据个对照 通用的数据结构   命名A "[{"UnitID":"7cf57594a7074c46b94dcd6c985b0ced","Un

关于html嵌入xml数据岛如何穿过树形结构关系的问题

作者: 字体:[增加 减小] 类型:转载 html里面引用xml的数据岛,如何穿过树形结构的关系,我不知道这个datafld里面应该如何使用xml里面的标签名称,如何加前缀,如何从resume得到name子元素 如下面的代码细节,html里面引用xml的数据岛,如何穿过树形结构的关系? 我不知道这个datafld里面应该如何使用xml里面的标签名称,如何加前缀,如何从resume得到name子元素?同时我的html文件应该如何修改呢? read.qidian.com/BookReader/144

Silverlight项目笔记7:xml/json数据解析、MVVM下实现多级树形结构TreeView、忽视引用类型导致数据绑定错误、通过流或动态空间加载图片、虚拟目录设置、silverlight安全机制引发的问题、WebClient缓存问题

涉及的内容主要有: 1.xml/json数据解析 2.多级树形结构TreeView 3.忽视引用类型导致数据绑定错误 4.通过流或动态空间加载图片 5.虚拟目录设置 6.silverlight安全机制引发的问题 7.webclient缓存问题 1.xml/json数据解析 (1)xml数据解析 使用WebClient获取数据,获取到的数据实例化为一个XDocument,使用XDocument的Descendants(XName)方法获得对应节点的数据集合,再通过Element这个方法对数据集合进