首页 > 开发 > 综合 > 正文

分享:Microsoft IE Webcontrols Treeview的一个bug及修正

2024-07-21 02:24:12
字体:
来源:转载
供稿:网友

首先感谢思归指点了我如何重用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原创,转载请注明,谢谢】

菜鸟学堂:
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表