天天看點

ASP.NET 2.0中集聯選擇TreeView節點

大家會在ASP.NET 2.0使用TreeView控件時發現帶有CheckBox控件的TreeNode對象(TreeView節點),選擇CheckBox無法回發頁面。在MSDN中對于TreeView.TreeNodeCheckChanged事件有一段備注:“當 TreeView 控件的複選框在兩次向伺服器發送之間更改狀态時,會引發 TreeNodeCheckChanged 事件。這使您可以提供一個這樣的事件處理方法,即每次發生此事件時執行一個自定義例程(如更新資料庫或顯示的内容)。盡管 TreeNodeCheckChanged 事件在回發時激發,但更改複選框不會導緻回發。”說明架構本身并不能提供一個CheckBox回發的機制,為了實作集聯的選擇,筆者實作了一種使用JavaScript去回發的方法,變相的解決了這個問題,盡管這樣的方法看上去很不美,但是一定程度上能解決我們的實際問題。   大緻思路,TreeNode對象輸出的是一個附和的HTML對象(包括TD,A,InputCheckBox……),本身沒有辦法增加用戶端腳本,是以為TreeView控件用戶端的onclick事件中加入腳本,腳本目的:對于引發事件的對象都做判斷,如果是InputCheckBox對象導緻的事件,則直接調用__doPostBack來回發頁面。至于背景代碼就思路就簡單了,遞歸選擇相關節點,設定其Checked屬性就好了。   下面的執行個體實作了,集聯選擇目前選中節點的所有子節點功能。   代碼部分:   檔案TreeView.aspx   JavaScript: < script > function postBackByObject() {     var o = window.event.srcElement;     if (o.tagName == "INPUT" && o.type == "checkbox")     {        __doPostBack("","");     } } </ script >       Cs: protected void Page_Load(object sender, EventArgs e)     {         TreeView1.Attributes.Add( "onclick", " postBackByObject()" );     }       protected void TreeView1_TreeNodeCheckChanged ( object sender, TreeNodeEventArgs e )     {         SetChildChecked ( e.Node );     }       private void SetChildChecked ( TreeNode p_Node )     {         foreach ( TreeNode _n in p_Node.ChildNodes )         {             _n.Checked = p_Node.Checked;             if ( _n.ChildNodes.Count > 0 )             {                 SetChildChecked( _n );             }         }     }    <asp:TreeView ID="TreeView1" EnableClientScript="true" οnclick="javascript:postBackByObject()"  runat="server" DataSourceID="SiteMapDataSource1" LineImagesFolder="~/TreeLineImages" ShowLines="True" OnTreeNodeDataBound="TreeView1_TreeNodeDataBound" OnTreeNodeCheckChanged="TreeView1_TreeNodeCheckChanged" ShowCheckBoxes="All">   希望還有更好的方法來解決,尤其是不用回發頁面的方式。