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

來源:互聯網
上載者:User
treeview|web
首先感謝思歸指點了我如何重用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原創,轉載請註明,謝謝】



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。