DNN开发中的一些细节(2)
上篇文章留下的问题还是很费了我一番劲的!不过搞定后有小小的快感!
老问题
上篇的问题是:如何在Treeview中加上编辑的小图表,而且这个层次数据对应的每个对象都不一样?
达到如下效果:

新问题
由于TreeView的自动绑定,我是通过一个XML的查询得到数据源的,但是发现如果数据源不是所有分支都到根(比如有的分支只有一层)绑定将会因为找不到对应的字段而出错,并且他要求是一个标准的XML文档,就是只能有唯一的根元素。这些都是我不方便保证的。我只好手工遍历该数据来构造数。
考虑到这个树相对变化少,性能的问题不用太担心,再加上我们可以充分利用组件Cache的机制。
private void CreateTree()
{
//Create Tree
MainController ctlMain = new MainController();
XmlDataSource source = new XmlDataSource();
string sXMLdata = "<Main>" + ctlMain.GetStoresByXML(0) + "</Main>";

XmlDocument xdom = new XmlDocument();
xdom.Load(new StringReader(sXMLdata));

XmlNode parentNode = xdom.FirstChild;

foreach (XmlNode node in parentNode.ChildNodes)
{
LoopThroughChild(node,parentNode,null);//Add Nodes to the tree
}
}
原来很简单
在TreeView中能够方便加入CheckBox控件,但是一般控件的添加却没有相应的文档说明和实例。在HTML中run at server中也难找到控件插入的地方!
在浏览LoopThroughChild中发现可以动动Node.Text的脑筋了!一试果然很爽:
if (IsEditable)
{
newNode.Text = "<A HREF='" + EditUrl("ItemID", newNode.Value, sCtl)
+ "'><img src='http://localhost/MyDNN/images/edit.gif' ALT='Edit' BORDER=0 /></A>"
+ newNode.Text;
}
熟悉DNN的朋友发现这个和在ASCX中的代码一样。
<asp:HyperLink ID="HyperLink1" NavigateUrl='<%# EditUrl("ItemID",((int)DataBinder.Eval(Container.DataItem,"ID")).ToString()) %>' Visible="<%# IsEditable %>" runat="server"> <asp:Image ID="Image1" Runat="server" ImageUrl="~/images/edit.gif" AlternateText="Edit" Visible="<%# IsEditable%>" resourcekey="Edit"/> </asp:HyperLink>
还需要改进的地方包括:img的src要改成“~/images/edit.gif”;还有这个写法好像会干扰TreeView的Select事件。这些好像都好解决!
至于树上不同层的节点(Node)对应的编辑模块不相同只用在上述代码中给sCtll赋予不同的关键字就可以了,然后在DNN的模块定义中将这些关键字指到不同的EditXXX.ascx就可以了。记得谁问过一View个模块可以对应多个Edit模块吗?答案是可以的。
几个开发中的备忘
(1)DNN中自带的controls/urlcontrol.ascx控件是我经常使用的,比如上传一些图片并指派给某个对象等等。这里头值得注意的是:FileFilter属性不是我们熟悉的*.jgp|*.gif,而是jpg,gif。
(2)图片要显示出来也费了周折。我通过urlControl上去的文件在对应的字段中被记录为“FILEID=22”这样子的。要是需要把它显示出来我的做法是:定义一个Image Web控件,代码部分就如下:
{
string picUrl = objMyDBData.PicURL;
picUrl = GetActualFile(picUrl);
img.ImageUrl = picUrl;
}

private string GetActualFile(string picUrl)
{
if ((picUrl != null) && (picUrl != ""))
{
if (picUrl.IndexOf("://") <= 0)
{
FileController ctlFile = new FileController();
int fileID = Int32.Parse(picUrl.Substring(7, picUrl.Length - 7));
FileInfo fileInfo = ctlFile.GetFileById(fileID, this.PortalId);
picUrl = PortalSettings.HomeDirectory + fileInfo.Folder + fileInfo.FileName;
}
}
return picUrl;
}
老问题
上篇的问题是:如何在Treeview中加上编辑的小图表,而且这个层次数据对应的每个对象都不一样?
达到如下效果:
新问题
由于TreeView的自动绑定,我是通过一个XML的查询得到数据源的,但是发现如果数据源不是所有分支都到根(比如有的分支只有一层)绑定将会因为找不到对应的字段而出错,并且他要求是一个标准的XML文档,就是只能有唯一的根元素。这些都是我不方便保证的。我只好手工遍历该数据来构造数。
考虑到这个树相对变化少,性能的问题不用太担心,再加上我们可以充分利用组件Cache的机制。


















原来很简单
在TreeView中能够方便加入CheckBox控件,但是一般控件的添加却没有相应的文档说明和实例。在HTML中run at server中也难找到控件插入的地方!
在浏览LoopThroughChild中发现可以动动Node.Text的脑筋了!一试果然很爽:






熟悉DNN的朋友发现这个和在ASCX中的代码一样。


至于树上不同层的节点(Node)对应的编辑模块不相同只用在上述代码中给sCtll赋予不同的关键字就可以了,然后在DNN的模块定义中将这些关键字指到不同的EditXXX.ascx就可以了。记得谁问过一View个模块可以对应多个Edit模块吗?答案是可以的。
几个开发中的备忘
(1)DNN中自带的controls/urlcontrol.ascx控件是我经常使用的,比如上传一些图片并指派给某个对象等等。这里头值得注意的是:FileFilter属性不是我们熟悉的*.jgp|*.gif,而是jpg,gif。
(2)图片要显示出来也费了周折。我通过urlControl上去的文件在对应的字段中被记录为“FILEID=22”这样子的。要是需要把它显示出来我的做法是:定义一个Image Web控件,代码部分就如下:




















【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器