首先感謝思歸指點了我如何重用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原創,轉載請註明,謝謝】