首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

根据数据库表的内容生成XML文件绑定到menu,顶者有分喽解决方法

2012-04-12 
根据数据库表的内容生成XML文件绑定到menu,顶者有分喽protected void Page_Load(object sender, EventArgs

根据数据库表的内容生成XML文件绑定到menu,顶者有分喽
protected void Page_Load(object sender, EventArgs e)
  {
  if (!IsPostBack)
  {
  OracleConnection conn = new OracleConnection(Page_SQL_CONN_Entity);
  conn.Open();
  OracleCommand cmd = new OracleCommand("select * from sys_action_column", conn);
  OracleDataReader dr = cmd.ExecuteReader();
  while (dr.Read())
  {
  TreeNode tn = new TreeNode();
  tn.Text = dr[1].ToString();
  tn.Value = dr[0].ToString();
  tn.NavigateUrl = "#";
  AddNodes(tn);
  TreeView1.Nodes.Add(tn);
  }
  dr.Close();
  conn.Close();
  conn.Dispose();
  }
  }

  private void AddNodes(TreeNode tn)
  {
  OracleConnection conn = new OracleConnection(Page_SQL_CONN_Entity);
  conn.Open();
  OracleCommand cmd = new OracleCommand("select id,action_name from sys_action where action_column_id=" + tn.Value, conn);
  OracleDataReader dr = cmd.ExecuteReader();
  while (dr.Read())
  {
  TreeNode subtn = new TreeNode();
  subtn.Text = dr[1].ToString();
  subtn.Value = dr[0].ToString();
  subtn.NavigateUrl = "xxx.aspx?xx=" + subtn.Value;
  tn.ChildNodes.Add(subtn);
  }
  dr.Close();
  conn.Close();
  conn.Dispose();

以上代码实现了将数据库中的两个表动态的绑定到一个TreeView上,生成了一个二级树,现在我想把它改成生成xml文件
一样的产生一个二级菜单,然后绑定到mune控件上,请大家指导一下。

[解决办法]
up
[解决办法]
楼主的意思是把数据写成XML文件,然后把文件作为数据源给Menu吗? 我觉得这样就涉及到IO操作了,会影响速度。
[解决办法]
menu可以直接绑定xml文件么?

[解决办法]
考虑使用迭代数据源的方式,参考一下这段代码,是采用迭代数据源的方式实现了一个DataSource控件:

public class CLocationDataSource : HierarchicalDataSourceControl, IHierarchicalDataSource
{

public CLocationDataSource() : base() { }

// Return a strongly typed view for the current data source control.
private CLocationDataSourceView view = null;
protected override HierarchicalDataSourceView GetHierarchicalView(string viewPath)
{
// 这里是代码的关键,viewPath可以理解为用于获取子元素集合的父元素票据,例如父节点的Value
// 对根节点的viewPath为空字符串,要注意这里的问题
viewPath = string.IsNullOrEmpty(viewPath) ? m_StartPosition.ToString() : viewPath;
view = new CLocationDataSourceView(viewPath);
return view;
}

// This can be used declaratively. To enable declarative use, 
// override the default implementation of CreateControlCollection 
// to return a ControlCollection that you can add to.
protected override ControlCollection CreateControlCollection()
{
return new ControlCollection(this);
}
}


public class CLocationDataSourceView : HierarchicalDataSourceView
{

private string _viewPath;
public CLocationDataSourceView(string viewPath)
{
// 对根节点的处理
_viewPath = string.IsNullOrEmpty(viewPath) ? "0" : viewPath;

}

public override IHierarchicalEnumerable Select()
{
// 这里用代码实现数据源的迭代体


CLocationCollection collection = new CLocationCollection();
foreach (CLocation category in CLocation.GetCatalogs())
{
if (category.ParentID.ToString() == _viewPath)
collection.Add(category);
}

return collection;
}

}

通过这种方式实现了一个DataSource控件后,就可以把他拖拽到你的页面上,然后设置你的TreeView/Menu控件的DataSourceID属性为这个控件的ID值就可以了。

[解决办法]

探讨
menu可以直接绑定xml文件么?


[解决办法]
路过~
[解决办法]

[解决办法]
不懂
帮你顶
[解决办法]
如果按照楼主的要求

现在我想把它改成生成xml文件 
一样的产生一个二级菜单,然后绑定到mune控件上,请大家指导一下。
==
可以先把DataSet里的数据写到xml (ds.WriteXml(path)),然后再使用XmlDataSource绑定,如果楼主真想这么做,我有空写写
[解决办法]
要不,你直接从数据源生成两份数据
[解决办法]
回帖是一种美德!传说每天回帖即可获得 10 分可用分!
[解决办法]
这样的话,岂不是绕了一个弯,干嘛要这样呢。
如果楼主是在想这样做,那么可以参看以下数据有DataSet到XML,然后读取XML作为数据源,不过这样好像又回来了。
不甚理解楼主之意。
[解决办法]

[解决办法]
关注!!
帮你顶!!
[解决办法]
学习研究..
帮顶!
[解决办法]
看标题来的,帮你顶了,今天看了太多问题,累了,不考虑程序,直接帮你顶,接分就可以了!不要吝啬哦!
[解决办法]
接分!
顶!
[解决办法]
把你的查询语句让我看看

你肯定没注意这句
C# code
        //将Categories1 的源表映射到DataSet 表Forums        da.TableMappings.Add("Categories1", "Forums");
[解决办法]
SqlDataAdapter da = new SqlDataAdapter("Select CategoryID, CategoryName From Categories order by CategoryPosition; Select CategoryID, ForumID, ForumName, ForumDescription From Forums order by CategoryID, ForumPosition", cn);
//将Categories1 的源表映射到DataSet 表Forums
da.TableMappings.Add("Categories1", "Forums");这个Forums对应第二个表名,至于为什么是Categories1,是因为DataSet默认生成的表名是Table和Table1,如果你指名了第一个表名,就像下面一样说明了是Categories,那么DataSet的两个表名就是Categories和Categories1,你必须在这之前说清楚把Categories1映射的表名为Forums
DataSet ds = new DataSet();
cn.Open();
da.Fill(ds, "Categories"); //这个Categories对应第一个表名
cn.Close();

[解决办法]
听说顶也有分?我多顶顶,哈哈~学习
[解决办法]
up
[解决办法]

放入我的网摘....
[解决办法]
楼主为什么要这样做呢,我感觉这样很没有必要呀。等于每次好像都在循环。
[解决办法]
楼主,你这个还没结贴,做天看你问这个问题,我觉得有意思,就写了一个例子,还以为你已经结贴了。既然你还没结贴,那你点我的头像,里面,我的博客里有一个例子。
------解决方案--------------------


up
[解决办法]
给你弄一段,可以参考参考 
private bool ReadData() 

bool result = false; 
DataSet ds=new DataSet(); 
DataBase db=new DataBase(); 
string strSql = ""; 
try 

strSql = "select bclassid,bclassname from city_bclass"; 
ds = db.GetDataTable(strSql, "bclass"); 
XmlDocument doca = new XmlDocument(); 

doca.Load(Server.MapPath("../Xml/") + "Class.xml"); 

XmlNode roota = doca.SelectSingleNode("DataTotal"); 
if (roota.ChildNodes.Count > 0) 

roota.RemoveAll(); 


doca.Save(Server.MapPath("../Xml/") + "Class.xml"); 
this.FillXml(ds, "bclass"); 
strSql = "select sid,sname from city_sort"; 
ds = db.GetDataTable(strSql, "Sort"); 
this.FillXml(ds, "Sort"); 

catch { } 
finally 

result = true; 

return result; 


private void FillXml(DataSet ds,string tableName) 


if (ds.Tables[tableName].Rows.Count > 0) 

XmlDocument doc = new XmlDocument(); 

doc.Load(Server.MapPath("../Xml/") + "Class.xml"); 

XmlNode root = doc.SelectSingleNode("DataTotal"); 
if (tableName == "bclass") 

for (int i = 0; i < ds.Tables[tableName].Rows.Count; i++) 

XmlElement ShopSort = doc.CreateElement("ShopSort"); 

XmlElement bid = doc.CreateElement("Bid"); 
bid.InnerText = ds.Tables[tableName].Rows[i][0].ToString().Trim(); 
ShopSort.AppendChild(bid); 
XmlElement SortName = doc.CreateElement("SortName"); 
SortName.InnerText = ds.Tables[tableName].Rows[i][1].ToString().Trim(); 
ShopSort.AppendChild(SortName); 
root.AppendChild(ShopSort); 

doc.Save(Server.MapPath("../Xml/") + "Class.xml"); 

if (tableName == "Sort") 

for (int i = 0; i < ds.Tables[tableName].Rows.Count; i++) 

XmlElement Sorts = doc.CreateElement("Sorts"); 

XmlElement Sid = doc.CreateElement("Sid"); 
Sid.InnerText = ds.Tables[tableName].Rows[i][0].ToString().Trim(); 
Sorts.AppendChild(Sid); 
XmlElement Sort = doc.CreateElement("Sort"); 
Sort.InnerText = ds.Tables[tableName].Rows[i][1].ToString().Trim(); 
Sorts.AppendChild(Sort); 
root.AppendChild(Sorts); 

doc.Save(Server.MapPath("../Xml/") + "Class.xml"); 









[解决办法]

[解决办法]
时刻关注!
[解决办法]
mark
[解决办法]
學習一下
[解决办法]
把menu放到xml里,我也想过,这样子的话,如果菜单发生变化,你还得到后台表查询的过程,放到xml时是脱裤子放屁-多此一举,除非你的菜单不再做变化.
思路如下:
1先查主菜单表,增加到TreeView中;
2循环主菜单表,找到子菜单表内容,增加各主菜单的子菜单.
楼上已有说明
关于fill 提示是字符出错
1\sql语句 在数据库里是否能正常执行;
2\select action_column_id,action_column_name from sys_action_column; select id,action_column_id,action_name from sys_action" 写在一起我想肯定错,
分成两个sql写,做两次da.Fill.
3\da.Fill(ds, "sys_action_column") sys_action_column 太长或多了"_";
肯定解决了.


[解决办法]
你可以考虑用xslt把你的xml格式转换为sitemap的xml格式,然后用SiteMapProvider+Menu。你也可以自己写一个针对你的xml格式的SiteMapProvider。
[解决办法]
up

热点排行