打造可持续发展的事业

事业像系统的框架,要稳定、可扩展,同样需要精心设计的!

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;
        }




posted on 2006-04-03 22:16  PM2004  阅读(1906)  评论(8编辑  收藏  举报

导航