• IE Webcontrols Treeview的一个bug及修正


    首先感谢思归指点了我如何重用Treeview这个Microsoft IE Webcontrol。相关内容请参见http://community.csdn.net/Expert/TopicView.asp?id=3365114

      IE webcontrol可以单独用于html文件中,也可以用于web form的.net 程序;
      对于后者,使用中可以通过编程加入节点,也可以绑定;
      对于后者,绑定的时候,可以帮定一个xml格式的字符串,也可以绑定一个xml文件,只要向Treeview控件的TreeNodeSrc属性赋值;
      对于后者,有两种可能,一种是绑定到一个已经存在于硬盘的xml文件,或者说TreeNodeSrc的值设定为"...../foo.xml"上、另一种则是先创建一个aspx页面动态产生xml格式的输出,绑定到这个页面。
      对于后者,会产生错误。

      原因是,Treeview控件其实有两个地方可以绑定,或者说,解析数据源产生树的结构,一是在Server Side,一是在Browser Side。在Treeview控件Render的过程中,如果发现TreeNodeSrc是一个地址,它就会试图读这这个地址的内容,然后解析,并显式的写到web页面的输出中,这里会产生错误。

      我的解决方法是,定义一个扩充的属性TreeNodeSrcA,它不在server端被解析,而是原封不动的写到Browser side,然后Treeview的htc再读取TreeNodeSrcA指向的url的内容,并解析。

      具体步骤如下:

    一、在Treeview的源程序treeview.cs文件的

    public class TreeView : BasePostBackControl

    的部分加入这样一段


    /// <summary>
    /// Url of the xml file to import as the TreeNode content of the tree, Browser Side Binding
    /// </summary>
    [
    Category("Data"),
    DefaultValue(""),
    PersistenceMode(PersistenceMode.Attribute),
    ResDescription("TreeNodeSrcA"),
    ]
    public string TreeNodeSrcA
    {
        get
        {
            object str = ViewState["TreeNodeSrcA"];
            return ((str == null) ? String.Empty : (string)str);
        }
        set
        {
            ViewState["TreeNodeSrcA"] = value;
        }
    }

    它的作用是定义一个叫TreeNodeSrcA的属性。

    二、在Treeview的源程序treeview.cs文件的

    protected override void RenderUpLevelPath(HtmlTextWriter output)

    方法中加入这样一段

    if (TreeNodeSrcA != String.Empty)
        output.AddAttribute("treeNodeSrcA", TreeNodeSrcA);

    它的作用是如果TreeNodeSrcA属性非空则写到web页面的输出中。

    三、编译生成dll文件并引用

    四、在Treeview的脚本文件treeview.htc的相应位置分别加入:

    <public:property name="treeNodeSrcA" id="_tvpropTreeNodeSrcA" GET="getTreeNodeSrcA" PUT="setTreeNodeSrcA" />

    var prop_treeNodeSrcA = null;

    function getTreeNodeSrcA()
    {
        return prop_treeNodeSrcA;
    }

    function setTreeNodeSrcA(value)
    {
        if (prop_treeNodeSrcA != value)
        {
            prop_treeNodeSrcA = value;
        }
    }

    这是说明定义一个htc里的属性,设置变量来存放,并设置读写它的方法。

    五、在Treeview的脚本文件treeview.htc的function oncontentready()中,在
        if (treeNodeSrc != null)
    之前,加入:
        if (treeNodeSrcA != null)
        treeNodeSrc = treeNodeSrcA;
    这就保证了创建的时候,如果扩展属性treeNodeSrcA非空,就会用它来填补treeNodeSrc,这时Browser就会去读数据源并解析、绑定。

    【athossmth原创,转载请注明,谢谢】

  • 相关阅读:
    校门外的树-poj
    [编程题]股票交易日
    2017计算机学科夏令营上机考试-C:岛屿面积
    2017计算机学科夏令营上机考试-B编码字符串
    2017计算机学科夏令营上机考试-A判决素数个数
    2017中国移动校园招聘考试试题一
    2017第八届蓝桥杯B组省赛C/C++程序设计大赛题解
    西科旧事的博客
    第八届蓝桥杯省赛题解
    微信小程序中的 event.target和event.currentTarget区别?
  • 原文地址:https://www.cnblogs.com/goody9807/p/133913.html
Copyright © 2020-2023  润新知