The data binding event in this code isn't working any longer. I was testing a custom node template and using the code from this page (add and edit templates Runtime), but then removed all the code specific to the custom node template. At that point, the data stopped binding. I have added the code back, moved all of it to another page, but the data binding event doesn't seem to fire. Even with all the test code from the linked page above in my page, if I set a breakpoint in the DataBinding function it never gets hit. If I manually place a RadTreeView on the .aspx page it will display, but anything set on the server side will not.
I have checked to make sure List used to populate the tree has data, and this line (radTree.DataSource = treeNodes) works correctly. But the databind is still failing.
Any suggestions?
Thanks,
Peter
namespace FQRSurvey.Controls |
{ |
public partial class TreeViewControl : System.Web.UI.UserControl |
{ |
protected void Page_Load(object sender, EventArgs e) |
{ |
if (!this.Page.IsPostBack) |
{ |
//load tree view |
Survey survey = SurveyController.GetSurveyByID(new Guid("6C685FBA-1380-47B7-A911-DC89AF9479CF")); |
CreateRadTree(survey, questionTree); |
} |
} |
protected override void OnInit(EventArgs e) |
{ |
questionTree.NodeTemplate = new SectionTemplate(); |
//questionTree.NodeTemplate = new QuestionTemplate(); |
//questionTree.NodeTemplate = new AnswerTemplate(); |
base.OnInit(e); |
} |
protected void RadTreeView1_HandleDrop(object sender, RadTreeNodeDragDropEventArgs e) |
{ |
RadTreeNode sourceNode = e.SourceDragNode; |
RadTreeNode destNode = e.DestDragNode; |
RadTreeViewDropPosition dropPosition = e.DropPosition; |
if (destNode != null) |
{ |
if (sourceNode.TreeView.SelectedNodes.Count <= 1) |
{ |
if (!sourceNode.IsAncestorOf(destNode)) |
{ |
sourceNode.Owner.Nodes.Remove(sourceNode); |
destNode.Nodes.Add(sourceNode); |
} |
} |
destNode.Expanded = true; |
sourceNode.TreeView.ClearSelectedNodes(); |
} |
} |
private void CreateRadTree(Survey survey, RadTreeView radTree) |
{ |
radTree.NodeTemplate = new SectionTemplate(); |
if (!survey.Sections.Count.Equals(0)) |
{ |
List<TreeNode1> treeNodes = new List<TreeNode1>(); |
Sections sections = survey.Sections; |
//Loop through Sections |
for (int i = 0; i < sections.Count; i++) |
{ |
Section section = sections[i]; |
//Create Section Node |
TreeNode1 sNode = new TreeNode1(section.SectionID.ToString(), String.Empty, section.SectionTitle, section.SectionStatus); |
treeNodes.Add(sNode); |
//Get Questions |
if (section.FirstQuestion != null) |
{ |
Question q = section.FirstQuestion; |
string prevNode = String.Empty; |
if (q.PrevAnswer == null) prevNode = sNode.ID; |
else prevNode = q.PrevAnswer.AnswerID.ToString(); |
//Create Question Node |
TreeNode1 qNode = new TreeNode1("q" + q.FriendlyID, prevNode, q.QuestionText, SurveyStatus.Active); |
//Create Answer Group |
treeNodes.Add(qNode); |
} |
} |
radTree.DataTextField = "Text"; |
radTree.DataFieldID = "ID"; |
radTree.DataFieldParentID = "ParentID"; |
radTree.DataSource = treeNodes; |
radTree.DataBind(); |
} |
} |
} |
internal class TreeNode1 |
{ |
private string _id; |
private string _text; |
private SurveyStatus _status; |
private string _parentID; |
public string ID |
{ |
get { return _id; } |
set { _id = value; } |
} |
public string ParentID |
{ |
get { return _parentID; } |
set { _parentID = value; } |
} |
public string Text |
{ |
get { return _text; } |
set { _text = value; } |
} |
public SurveyStatus Status |
{ |
get { return _status; } |
set { _status = value; } |
} |
public TreeNode1(string id, string parentID, string text, SurveyStatus status) |
{ |
_id = id; |
_text = text; |
_status = status; |
_parentID = parentID; |
} |
} |
class SectionTemplate : ITemplate |
{ |
public void InstantiateIn(Control container) |
{ |
Label label1 = new Label(); |
label1.Font.Size = 15; |
label1.DataBinding += new EventHandler(label1_DataBinding); |
container.Controls.Add(label1); |
} |
private void label1_DataBinding(object sender, EventArgs e) |
{ |
Label target = (Label)sender; |
RadTreeNode node = (RadTreeNode)target.BindingContainer; |
string nodeText = (string)DataBinder.Eval(node, "Text"); |
target.Text = nodeText; |
} |
} |
Update:
From additional digging and messing around, the problem relates to converting a Guid to a string to be used as the ID field. I'm not sure why it won't accept the Guid as a string, but using an int instead of string fixes the problem. Any reason convertinting a Guid to a string would cause the data to fail to bind without any errors?