This is a migrated thread and some comments may be shown as answers.

... did not implement ICallbackEventHandler message

6 Answers 338 Views
TreeView
This is a migrated thread and some comments may be shown as answers.
Nathan J Pledger
Top achievements
Rank 2
Nathan J Pledger asked on 27 Dec 2008, 11:34 AM
Hi,

Just upgraded to the Premium Suite for some Xmas development work.

I have created a server-side control that renders a TreeView whose nodes are set to be populated on Callback.
On expanding the first node, I have the following error message popping up:

The target 'ctl00$ctl01$mainContentArea$treeNavigation$kbTreeView' for the callback could not be found or did not implement ICallbackEventHandler.

My server-side control is below:

 
    [DefaultProperty("Text")] 
    [ToolboxData("<{0}:KnowledgeBaseTree runat=server></{0}:KnowledgeBaseTree>")] 
    public class KnowledgeBaseTree : WebControl, ICallbackEventHandler 
    { 
 
 
// ... snip ... 
 
        protected override void CreateChildControls() 
        { 
// ... snip  ... 
 
Controls.Add(BuildContentTreeView(baseUrl,session)); 
 
         
        } 
 
        private RadTreeView BuildContentTreeView(string baseUrl, ISession session) 
        { 
 
// ... snip ... 
            RadTreeView radTreeView = new RadTreeView(); 
            radTreeView.NodeExpand += new RadTreeViewEventHandler(radTreeView_NodeExpand); 
            radTreeView.ID = "kbTreeView"
 
            IPost[] posts = _cachedBinder.GetRootPosts(null, TimeSpan.Zero); 
 
                foreach (IPost post in posts) 
                { 
 
// ... snip ... 
                        RadTreeNode radTreeNode = new RadTreeNode(post.Title, post.ID.ToString(), postUrl + ".aspx"); 
                                }                        
            return radTreeView; 
        } 
 
        void radTreeView_NodeExpand(object sender, RadTreeNodeEventArgs e) 
        { 
            Guid postId = new Guid(e.Node.Value); 
 
// ... snip ... 
                    // get child nodes 
                    IPost[] childPosts = selectedPost.GetChildPosts(null, TimeSpan.Zero); 
                    foreach (IPost childPost in childPosts) 
                    { 
                        string childPostUrl = Path.Combine(basePostUrl, childPost.UrlKey); 
                        RadTreeNode childTreeNode = new RadTreeNode(childPost.Title, childPost.ID.ToString(), childPostUrl + ".aspx"); 
                        childTreeNode.ExpandMode = TreeNodeExpandMode.ServerSideCallBack; 
                        childTreeNode.Nodes.Add(childTreeNode);                          
                    } 
        } 
 
 
 
 

The serverside control KnwoeldgeBaseTree (represented by the class above) is within the Page as usual:

<KB:KnowledgeBaseTree id="knowledgeBaseTree" runat="server" />

So, as far as I know, I'm in the right place as far as the page lifecycle is concerned.

I've also tried rendering the tree in the Init stage of the server control. No change.

Can you please help me fix this?

6 Answers, 1 is accepted

Sort by
0
Nathan J Pledger
Top achievements
Rank 2
answered on 27 Dec 2008, 11:49 AM
Ok, I was being a bit of a moron.

For others' benefit, make sure you implement INamingContainer on your server control - something I always forget to do!

0
Suraj
Top achievements
Rank 1
answered on 18 Feb 2009, 05:38 PM
Iam trying to do similar stuff but when I expand the node it is not hitting the Exapand Mode Event handler. Can you let me know if you figured how to do this.
0
Nathan J Pledger
Top achievements
Rank 2
answered on 18 Feb 2009, 06:14 PM
As long as the server control is present in the page on the initial rendering and subsequent rendering (after postback), and your server control implements INamingContainer, it should work.

I did get it working after checking my server control implemented INamingContainer. Note that I was writing a server control that wraps Teleriks TreeView.

If this doesn't help, let me know and I'll see if I can knock a demo class up.
0
Suraj
Top achievements
Rank 1
answered on 18 Feb 2009, 07:08 PM
ok. This is what I am doing in the code. Let me know what you think.

  public class ItemTree : System.Web.UI.WebControls.WebControl,
    ICallbackEventHandler,
    INamingContainer
  {
    
    protected override void CreateChildControls()
    {
      CreateTree();
    }

    private void CreateTree()
    {
      using (RadTreeView _RadTreeView = new RadTreeView())
      {
        _RadTreeView.NodeExpand += new RadTreeViewEventHandler(_RadTreeView_NodeExpand);
        _RadTreeView.ID = "_RadTreeView";
        RadTreeNode _RadTreeNode = new RadTreeNode();
        _RadTreeNode.Text = "Root";
        _RadTreeNode.Value = "0";
        _RadTreeNode.Expanded = true;
        _RadTreeView.Nodes.Add(_RadTreeNode);
        LoadInitialItems(_RadTreeNode);
        
        this.Controls.Add(_RadTreeView);
      }
    }
    private void _RadTreeView_NodeExpand(object sender,
                                         RadTreeNodeEventArgs e)
    {
      for (int i = 0; i < 10; i++)
      {
        RadTreeNode oItemNode;
        oItemNode = oMakeItemNode(i);

        e.Node.Nodes.Add(oItemNode);
      }
      e.Node.Expanded = true;
    }

    private void LoadInitialItems(
  RadTreeNode oParentNode)
    {
      for (int i = 0; i < 10;i++ )
      {
        RadTreeNode oItemNode;
        oItemNode = oMakeItemNode(i);

        oParentNode.Nodes.Add(oItemNode);
      }
    }

 
    private RadTreeNode oMakeItemNode(int i)
    {
      RadTreeNode oItemNode;
      string ItemText = string.Empty;
      
      oItemNode = new RadTreeNode(i.ToString(),
                                  i.ToString()
        );
      
        oItemNode.ExpandMode = TreeNodeExpandMode.ServerSideCallBack;


     
      return oItemNode;
    }


    #region ICallbackEventHandler Members

    ///<summary>
    ///Processes a callback event that targets a control.
    ///</summary>
    ///
    ///<param name="eventArgument">A string that represents an event argument to pass to the event handler.</param>
    void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
    {

     }
     ///<summary>
    ///Returns the results of a callback event that targets a control.
    ///</summary>
    ///
    ///<returns>
    ///The result of the callback.
    ///</returns>
    ///
    string ICallbackEventHandler.GetCallbackResult()
    {
      return "";
    }

    #endregion
  }
0
Nathan J Pledger
Top achievements
Rank 2
answered on 18 Feb 2009, 07:25 PM
Have you tried taking your instantiation of the RadTreeView out of the using () {} statement? When control falls out of the scope of this statement, the control may have been disposed?
0
Suraj
Top achievements
Rank 1
answered on 18 Feb 2009, 07:27 PM
Thanks for the suggestion. That's what exactly happening
Tags
TreeView
Asked by
Nathan J Pledger
Top achievements
Rank 2
Answers by
Nathan J Pledger
Top achievements
Rank 2
Suraj
Top achievements
Rank 1
Share this question
or