I have TreeView in one UpdatePanel 'upTreeView' which uses TreeNodePopulate to populate the Tree. When I select any node in the TreeView it should display information about that node in the DetailsView... which is in another UpdatePanel 'upDetails'
This works very well without using update panels. but when I implement the AJAX Update Panels.Its not functioning very well and all sorts of unusual behavior starts to happen. Firstly, It works well if I only expand or collapse the nodes without selecting any node. the problem starts when I click few nodes.... 1- Duplicating Nodes.. 2- Expanding other nodes... which i have not selected or expanded.. You are free to have a look at it as a live demo... you will find the problem by yourself... *http://www.ecsonline.com.pk*<http://www.ecsonline.com.pk/> & without Ajax Site (*http://www.ecsonline.com.pk*<http://www.ecsonline.com.pk/withoutAjax/Default.aspx> */withoutAjax/Default.aspx* <http://www.ecsonline.com.pk/>)* * I want to get this thing done.. I this is an ongoing project.. and the client is asking for ajax functionality ( Frames like functionality ). I am using Access Database on backend. BusinessLayer.cs public static TreeView PopulateRootLevel ( TreeView tv ) { //OleDbConnection objConn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + // Request.MapPath("App_Data/sdsAccounts.mdb") + ";Persist Security Info=False");using (OleDbConnection objConn = ConnectionsManager.GetConnection ()) { OleDbCommand objCommand = new OleDbCommand (@"select acc_code,acc_title,(select count(*) FROM ChartOfAccounts WHERE acc_parent=coa.acc_code) AS childnodecount FROM ChartOfAccounts coa where acc_parent IS NULL ORDER BY acc_Code", objConn); //OleDbCommand objCommand = new OleDbCommand (@"select acc_code,acc_title,(select count(*) FROM ChartOfAccounts WHERE acc_parent=coa.acc_code) AS childnodecount,acc_Parent FROM ChartOfAccounts coa where acc_parent IS NULL ORDER BY acc_Code", objConn);OleDbDataAdapterda = new OleDbDataAdapter (objCommand);DataTable dt = new DataTable (); da.Fill (dt); PopulateNodes (dt, tv.Nodes); return tv; } } public static TreeNode PopulateSubLevel ( string parent, TreeNode ND ) { using (OleDbConnection objConn = ConnectionsManager.GetConnection ()) { OleDbCommand objCommand = new OleDbCommand (@"select acc_code,acc_title,(select count(*) FROM " + "ChartOfAccounts WHERE acc_parent=coa.acc_code) AS childnodecount FROM " +"ChartOfAccounts coa where acc_pare...@parentid ORDER BY acc_Code", objConn); objCommand.Parameters.Add ( "@parentID", OleDbType.VarChar).Value = parent;OleDbDataAdapter da = new OleDbDataAdapter (objCommand);DataTable dt = new DataTable (); da.Fill (dt); PopulateNodes (dt, ND.ChildNodes); return ND; } } private static void PopulateNodes ( DataTable dt, TreeNodeCollection nodes ) { foreach (DataRow dr in dt.Rows) { TreeNode tn = new TreeNode (); tn.Text = dr[ "acc_title"].ToString ();tn.Value = dr["acc_code"].ToString (); nodes.Add (tn); //If node has child nodes, then enable on-demand populatingtn.PopulateOnDemand = ((int)(dr["childnodecount"]) > 0); } } *Default.aspx (Markup)* *UpdatePanel 1* <asp:UpdatePanel ID="upTreeView" runat="server" ChildrenAsTriggers="False" UpdateMode="Conditional"> <ContentTemplate> <asp:TreeView ID="TreeView1" runat="server" ImageSet="Msdn" NodeWrap="True" LineImagesFolder="~/TreeImages" BackColor="#DEE8F5" ExpandDepth="0" NodeIndent="10" ShowLines="True" Width="331px" OnTreeNodePopulate ="TreeView1_TreeNodePopulate"> . . . </asp:TreeView> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="TreeView1" EventName="TreeNodePopulate" /> </Triggers> </asp:UpdatePanel> *UpdatePanel 2* <asp:UpdatePanel ID="upDetails" runat="server"> <ContentTemplate> <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" CellPadding="4" DataSourceID="SqlDataSource1" ForeColor="#333333" GridLines ="None" OnDataBound="DetailsView1_DataBound" OnItemUpdated ="DetailsView1_ItemUpdated" OnItemDeleted="DetailsView1_ItemDeleted" OnItemInserted="DetailsView1_ItemInserted" DataKeyNames="acc_Code" OnModeChanged="DetailsView1_ModeChanged" Width="387px" BorderColor="Black" BorderStyle="Solid" BorderWidth="1px" EmptyDataText="Select Account from the left menu" OnItemCommand="DetailsView1_ItemCommand"> . . . . <Fields> . . . . . </Fields> . . . . . </asp:DetailsView> <asp:Label ID="Label7" runat="server" Font-Bold="True" ForeColor="Red" Width="134px" Visible="False"></asp:Label> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="TreeView1" EventName ="SelectedNodeChanged" /> </Triggers> </asp:UpdatePanel> *Default.aspx.cs* protected void TreeView1_TreeNodePopulate ( object sender, TreeNodeEventArgs e ) { BusinessLayer.PopulateSubLevel (e.Node.Value, e.Node); } I have heard that its not a better solution.. to put treeview in updatepanels... what is the more appropriate solution?? Regards, Abul Hasan Lakhani. -- Abul Hasan Lakhani
