根据数据库表的内容生成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值就可以了。
[解决办法]
[解决办法]
路过~
[解决办法]
[解决办法]
不懂
帮你顶
[解决办法]
如果按照楼主的要求
现在我想把它改成生成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