I am seeing an issue with having a Drop Down Tree View and having the drop down text area set at run time, the issue is when I select a tree view node the first time, the drop down text area becomes blank. But selecting a second node and then after, the drop down text area shows the selected node.
The interesting part is the first select I am able to get the node’s data that was selected, which I use with “comboBox.set_text(node.get_text());” to set the drop down text area. Although the comboBox object shows that its text was set, the page still shows the drop down text area as blank.
I tried multiple approaches to try to solve this but each one ending up in the same result.
If I do not set the drop down text at run time, then the issue of selecting a node the first time goes away. I need to have the drop down text set at run time.
I implemented the Drop Down Tree View control into two user controls; one control to handle the Drop Down and the other to handle the Tree View. I have included the code, the .ascx, .cs and .js info of the controls with some explanation of each
Drop Down .ascx Page
Simple enough just the drop down that has the tree view user control embedded and the OnClientNodeClicked is handled by the javascript.
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ucOrgTreeViewDropDown.ascx.cs" Inherits="WebControls_ucOrgTreeViewDropDown" %> |
<%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %> |
<%@ Register src="../WebControls/ucOrgTreeView.ascx" tagname="ucOrgTreeView" tagprefix="uc1" %> |
<telerik:RadComboBox |
ID="OrgComboBox" |
runat="server" |
Height="140px" |
Width="215px" |
ShowToggleImage="True" |
Skin="MyApp" |
EnableEmbeddedSkins="false" |
style="vertical-align:middle;" |
> |
<ItemTemplate> |
<div id="div1" onclick="MyApp.Controls.ucOrgTreeViewDropDown.StopPropagation"> |
<uc1:ucOrgTreeView ID="OrgTreeView" runat="server" OnClientNodeClicked="MyApp.Controls.ucOrgTreeViewDropDown.HandleNodeClicked"/> |
</div> |
</ItemTemplate> |
<Items> |
<telerik:RadComboBoxItem Text="" /> |
</Items> |
</telerik:RadComboBox> |
Drop Down .cs File
The Drop Down properties is setup to be a pass through to the Tree View control. OnPreRender method sets up what javascript file will be used. And the OnLoad method will set the Drop Down text area to the selected Node Text on load of the dropdown control by doing the following:
WebControls_ucOrgTreeView orgtree = (WebControls_ucOrgTreeView)item.FindControl("OrgTreeView");
OrgComboBox.Text = orgtree.SelectedOrgName;
, which works great, the text of the selected node shows up just fine on load. However I wonder if I need to do something else here to force the node to be selected, which I attempted to do with:
int treeviewNodeIndex = orgtree.GetIndexFromOrgID(orgtree.SelectedOrgID);
orgtree.SelectNode = treeviewNodeIndex;
But this did not help.
using System; |
using System.Collections; |
using System.Collections.Generic; |
using System.Configuration; |
using System.Data; |
using System.Linq; |
using System.Web; |
using System.Web.Security; |
using System.Web.UI; |
using System.Web.UI.HtmlControls; |
using System.Web.UI.WebControls; |
using System.Web.UI.WebControls.WebParts; |
using System.Xml.Linq; |
using Telerik.Web.UI; |
public partial class WebControls_ucOrgTreeViewDropDown : System.Web.UI.UserControl |
{ |
// Properties |
public int SelectedOrgID |
{ |
get |
{ |
WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView")); |
return Convert.ToInt32(tree_view.SelectedOrgID); |
} |
set |
{ |
WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView")); |
tree_view.SelectedOrgID = value; |
} |
} |
public int FirstOrgID |
{ |
get |
{ |
WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView")); |
return tree_view.FirstOrgID; |
} |
} |
public string SelectedOrgName |
{ |
get |
{ |
WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView")); |
return tree_view.SelectedOrgName; |
} |
} |
public bool UseAllOrg |
{ |
get |
{ |
WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView")); |
return tree_view.UseAllOrg; |
} |
set |
{ |
WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView")); |
tree_view.UseAllOrg = value; |
} |
} |
public bool Enabled |
{ |
get |
{ |
WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView")); |
return tree_view.Enabled; |
} |
set |
{ |
WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView")); |
tree_view.Enabled = value; |
} |
} |
public int RootOrgID |
{ |
get |
{ |
WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView")); |
return tree_view.RootOrgID; |
} |
set |
{ |
WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView")); |
tree_view.RootOrgID = value; |
} |
} |
// Methods |
protected override void OnPreRender(EventArgs e) |
{ |
base.OnPreRender(e); |
ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "MyApp.Controls.ucOrgTreeViewDropDown", ResolveClientUrl("~/js/script_handler.ashx?s=~/js/Controls/ucOrgTreeViewDropDown.js")); |
} |
protected void Page_Load(object sender, EventArgs e) |
{ |
if (!IsPostBack) |
{ |
string assign_OrgComboBox_ID = string.Format("var {0} = new MyApp.Controls.ucOrgTreeViewDropDown('{1}', '{2}');\n", ID, OrgComboBox.ClientID, OrgComboBox.Items[0].FindControl("OrgTreeView").FindControl("RadTreeView1").ClientID); |
ScriptManager.RegisterStartupScript(this, this.GetType(), string.Format("assign_{0}", ID), assign_OrgComboBox_ID, true); |
foreach (RadComboBoxItem item in OrgComboBox.Items) |
{ |
RadTreeView tree_view = (RadTreeView)(item.FindControl("OrgTreeView").FindControl("RadTreeView1")); |
tree_view.Attributes.Add("ParentComboBoxID", OrgComboBox.ClientID); |
WebControls_ucOrgTreeView orgtree = (WebControls_ucOrgTreeView)item.FindControl("OrgTreeView"); |
OrgComboBox.Text = orgtree.SelectedOrgName; |
int treeviewNodeIndex = orgtree.GetIndexFromOrgID(orgtree.SelectedOrgID); |
orgtree.SelectNode = treeviewNodeIndex; |
} |
} |
} |
} |
Tree View .ascx file
Simple enough just the RadTreeView
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ucOrgTreeView.ascx.cs" Inherits="WebControls_ucOrgTreeView" %> |
<%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %> |
<telerik:RadTreeView |
runat="server" |
ID="RadTreeView1" |
Skin="MyApp" |
EnableEmbeddedSkins="false"> |
</telerik:RadTreeView> |
Tree View .cs file
Some of this code is specific to my application, especially when it comes to getting the org info. On my box the treeview is created just fine and so I suspect the way that it is created is not the issue. ,
However the code does show some of the properties that are used in javascript. The property of SelectedOrgID will return the ID of the row that was selected. The UseAll, just creates a new node with the Text value of “All” and an ID of 0, etc.
using System; |
using System.Collections; |
using System.Collections.Generic; |
using System.Configuration; |
using System.Data; |
using System.Linq; |
using System.Web; |
using System.Web.Security; |
using System.Web.UI; |
using System.Web.UI.HtmlControls; |
using System.Web.UI.WebControls; |
using System.Web.UI.WebControls.WebParts; |
using System.Xml.Linq; |
using Telerik.Web.UI; |
using Medicity.MyApp.BusinessLogic; |
using Medicity.MyApp.CommonObjects; |
using Medicity.MyApp.TestScripts; |
public partial class WebControls_ucOrgTreeView : System.Web.UI.UserControl |
{ |
private Medicity.MyApp.BusinessLogic.BusinessLogic bl = new BusinessLogic(); |
private SessionManager sm = new SessionManager(); |
private bool _UseAllOrg = false; |
private bool _Enabled = true; |
private int _RootOrgID = -1; |
private int _SelectedOrgID; |
private RadTreeNode _SelectedNode = new RadTreeNode(); |
#region Properties |
public int SelectedOrgID |
{ |
get |
{ |
if (RadTreeView1.SelectedNode != null) |
return Convert.ToInt32(RadTreeView1.SelectedNode.Value); |
return -1; |
} |
set |
{ |
_SelectedOrgID = value; |
ApplyTelerikOrgTreeViewProperties(); |
} |
} |
public int SelectNode |
{ |
set |
{ |
int index = value; |
RadTreeView1.Nodes[index].Selected = true; |
} |
} |
public RadTreeNode SelectedNode |
{ |
get |
{ |
return RadTreeView1.SelectedNode; |
} |
} |
public int FirstOrgID |
{ |
get |
{ |
return Convert.ToInt32(RadTreeView1.Nodes[0].Value); |
} |
} |
public string SelectedOrgName |
{ |
get |
{ |
if (RadTreeView1.SelectedNode != null) |
return RadTreeView1.SelectedNode.Text; |
return string.Empty; |
} |
} |
public string OnClientNodeClicked |
{ |
set |
{ |
RadTreeView1.OnClientNodeClicked = value; |
} |
} |
public bool UseAllOrg |
{ |
get |
{ |
return _UseAllOrg; |
} |
set |
{ |
_UseAllOrg = value; |
ApplyTelerikOrgTreeViewProperties(); |
} |
} |
public bool Enabled |
{ |
get |
{ |
return _Enabled; |
} |
set |
{ |
_Enabled = value; |
ApplyTelerikOrgTreeViewProperties(); |
} |
} |
public int RootOrgID |
{ |
get |
{ |
return _RootOrgID; |
} |
set |
{ |
_RootOrgID = value; |
ApplyTelerikOrgTreeViewProperties(); |
} |
} |
#endregion |
/// <summary> |
/// The Tree View will be populated with all Orgs of the BOrg before the Properties are applied |
/// </summary> |
/// <param name="sender"></param> |
/// <param name="e"></param> |
protected void Page_Init(object sender, EventArgs e) |
{ |
PopulatedAllOrgsIntoTreeView(); |
} |
private void PopulatedAllOrgsIntoTreeView() |
{ |
List<Org> orgs = new List<Org>(); |
orgs = bl.GetBorgOrgs(sm.UserData.Org.BorgID); |
orgs = bl.GenerateOrgHierarchies(orgs, false); |
RadTree_GenerateOrgHierarchies(orgs, false); |
} |
/// <summary> |
/// Apply the Properties |
/// </summary> |
/// <param name="treeNodeCollection"></param> |
private void ApplyTelerikOrgTreeViewProperties() |
{ |
//Reduce the tree list to what is viewable |
if (_RootOrgID > -1) |
{ |
List<Org> orgs = new List<Org>(); |
orgs = GenerateOrgHierarchies(); //FOR TESTING ONLY DO NOT ERASE |
if (_RootOrgID != 0) |
{ |
//Put code in here to reduce the number of orgs the user is able to view |
} |
if (orgs.Count > 0) |
{ |
RadTree_GenerateOrgHierarchies(orgs, true); //This sets up the TreeView with Org data |
} |
else |
{ |
throw new ApplicationException("What The"); |
} |
} |
//Create the tree list if the list is empty |
if (RadTreeView1.Nodes.Count == 0) |
PopulatedAllOrgsIntoTreeView(); |
//Add "All" to the top of the Tree View if needed |
if (_UseAllOrg) |
{ |
RadTreeNode all_node = new RadTreeNode("All", "0"); |
RadTreeView1.Nodes.Insert(0, all_node); |
} |
//Set the selected node based on the SelectedOrgID -> This is fully implemented in ucOrgTreeViewDropDown.cs |
if (_SelectedOrgID > -1) |
{ |
bool nodeSelected = false; |
foreach (RadTreeNode node in RadTreeView1.Nodes) |
{ |
if (_SelectedOrgID == (Convert.ToInt32(node.Value))) |
{ |
node.Selected = true; |
nodeSelected = true; |
break; |
} |
} |
if (!nodeSelected) |
{ |
//Let the debugger know |
System.Diagnostics.Debug.WriteLine("---"); |
System.Diagnostics.Debug.WriteLine("SelectedOrgID (" + _SelectedOrgID + ") was not found in the TreeView list. This could happen if the OrgID no longer exists in the Database or OrgID was removed from the TreeView due to the User's access rights."); |
System.Diagnostics.Debug.WriteLine("---"); |
} |
} |
//Enable or disable the control |
RadTreeView1.Enabled = _Enabled; |
} |
public int GetTopLevelID() |
{ |
if(RadTreeView1.Nodes != null) |
return Convert.ToInt32(RadTreeView1.Nodes[0].Value); |
return -1; |
} |
public int GetIndexFromOrgID(int orgID) |
{ |
RadTreeNode node = RadTreeView1.FindNodeByValue(orgID.ToString()); |
return node.Index; |
} |
private void RadTree_GenerateOrgHierarchies(List<Org> OrgList, bool ReducedList) |
{ |
RadTreeView1.Nodes.Clear(); |
RadTreeNode nodes = new RadTreeNode(); |
if (!ReducedList || _RootOrgID == 0) //If _RootOrgID = 0 then show all Orgs |
{ |
foreach (Org org in OrgList) |
{ |
if (org.ParentOrgID == null) //Found a top level org |
{ |
nodes = RadTree_GetAllChildern(OrgList, org, null); |
RadTreeView1.Nodes.Add(nodes); |
} |
} |
} |
else |
{ |
nodes = RadTree_GetAllChildern(OrgList, OrgList[0], null); |
RadTreeView1.Nodes.Add(nodes); |
} |
} |
private RadTreeNode RadTree_GetAllChildern(List<Org> Orgs, Org pOrg, RadTreeNode pNode) |
{ |
pNode = new RadTreeNode(pOrg.Name, pOrg.OrgID.ToString()); |
List<Org> childernList = bl.GetListOfChildern(pOrg.OrgID, Orgs); |
foreach (Org org in childernList) |
{ |
RadTreeNode cNode = RadTree_GetAllChildern(Orgs, org, pNode); |
if(cNode.Nodes.Count == 0) |
cNode = new RadTreeNode(org.Name, org.OrgID.ToString()); |
pNode.Nodes.Add(cNode); |
} |
return pNode; |
} |
} |
The javascript file
The handlenodeclick method is where the selected node's text is placed into the drop down's text area. But for some reason when this happens on the first click, the drop down's text area is blank. But the backend still knows that the node is selected because when I select the search button for my application, it grabs that selected node's info to do the search. So some thing on setting up the drop down is not correct and I have played around with it for many hours trying to figure out why it is not working.
// Make sure the namespace is defined |
if (typeof(MyApp) == "undefined") |
MyApp = {}; |
if (typeof(MyApp.Controls) == "undefined") |
MyApp.Controls = {}; |
// Constructor |
MyApp.Controls.ucOrgTreeViewDropDown = function MyApp$Controls$ucOrgTreeViewDropDown(client_id, tree_client_id) |
{ |
this.ClientId = client_id; |
this.TreeClientId = tree_client_id; |
MyApp.Controls.ucOrgTreeViewDropDown.ObjectMap[client_id] = this; |
} |
MyApp.Controls.ucOrgTreeViewDropDown.ObjectMap = []; |
// static event handlers |
MyApp.Controls.ucOrgTreeViewDropDown.HandleNodeClicked = function MyApp$Controls$ucOrgTreeViewDropDown$HandleNodeClicked(sender, args) |
{ |
var combo_client_id = sender.get_attributes().getAttribute("ParentComboBoxID"); |
var comboBox = $find(combo_client_id); |
var node = args.get_node(); |
comboBox.set_text(node.get_text()); |
comboBox.hideDropDown(); |
} |
MyApp.Controls.ucOrgTreeViewDropDown.StopPropagation = function MyApp$Controls$ucOrgTreeViewDropDown$StopPropagation(e) |
{ |
if(!e) |
{ |
e = window.event; |
} |
e.cancelBubble = true; |
} |
// member functions |
function MyApp$Controls$ucOrgTreeViewDropDown$GetSelectedOrgID() |
{ |
var org_tree_element = $find(this.TreeClientId); |
if (org_tree_element == null) |
return -1; |
else |
return org_tree_element.get_selectedNode().get_value(); |
} |
function MyApp$Controls$ucOrgTreeViewDropDown$GetSelectedOrgName() |
{ |
var org_tree_element = $find(this.TreeClientId); |
if (org_tree_element == null) |
return -1; |
else |
return org_tree_element.get_selectedNode().get_text(); |
} |
function MyApp$Controls$ucOrgTreeViewDropDown$SetSelectedOrgID(orgID) |
{ |
//debugger; |
var comboBox = $find(this.ClientId); |
comboBox.set_value(orgID); |
} |
// Prototype |
MyApp.Controls.ucOrgTreeViewDropDown.prototype = |
{ |
GetSelectedOrgID : MyApp$Controls$ucOrgTreeViewDropDown$GetSelectedOrgID, |
GetSelectedOrgName : MyApp$Controls$ucOrgTreeViewDropDown$GetSelectedOrgName, |
SetSelectedOrgID : MyApp$Controls$ucOrgTreeViewDropDown$SetSelectedOrgID |
} |
I hope I have supplied enough information to help in debugging this issue. Any help would be much appriciated. I hope I have supplied enough information to help in debugging this issue. Any help would be much appriciated. I hope I have supplied enough information to help in debugging this issue. Any help would be much appriciated. I hope I have supplied enough information to help in debugging this issue. Any help would be much appriciated.