The treeview is generated dynamically by adding nodes using ITemplate...for example, some nodes add a RadTextBox or a RadDatePicker
When the user clicks Edit I dynamically reload the entire tree with each node using a different ITemplate showing the edit controls.
When the user clicks Save I want to get each node and find the control holding the edited value. The problem is Node.Controls is empty. I can't do a FindControl either on any container in the chain.
I've tried:
var thisControl = node.FindControl(node.UniqueID + "dateField");
var thisControl = node.Parent.FindControl(node.UniqueID + "dateField");
var thisControl = this.FindControl(node.UniqueID + "dateField");
Here is the Save event....
protected void dataElementFactTree_Save_Click(object sender, ImageClickEventArgs e)
{
var tree = ((ImageButton) sender).FindControl("dataElementFactTree") as RadTreeView;
if (tree == null) return;
ProcessTreeNodes(tree);
}
private void ProcessTreeNodes(IRadTreeNodeContainer tree)
{
var valueActions = new List<BGValueAction>();
foreach (RadTreeNode node in tree.Nodes)
{
var nodeTemplate = node.Attributes["NodeTemplate"];
if (nodeTemplate == typeof(CalendarTemplate).ToString())
{
var thisControl = node.FindControl(node.UniqueID + "dateField");
}
{
};
valueActions.Add(valueAction);
}
if (valueActions.Count > 0) BGMainController.ProcessFactTreeActions(valueActions);
}
Here is a sample of a read and edit template:
internal class CalendarTemplate : BaseTemplate, ITemplate
{
#region ITemplate Members
public CalendarTemplate(NodeBuilderContext context, bool isEditing) : base(context, isEditing, false) { }
public void InstantiateIn(Control container)
{
var node = (RadTreeNode) container;
CreateLabel(container);
if (IsEditing)
{
var factValueField = new RadDatePicker {ID = container.UniqueID + "dateField"};
node.Controls.Add(factValueField);
}
else
{
CreateValueLabel(container,
string.Empty);
}
}
#endregion
}
Thanks.