Zhi-QiangNi's tech blog--AJAX's paradise
I'm working at the Microsoft IBS DevDiv Community Support Team, in charge of the customer service of ASP/AJAX forum. Welcome to my blog and AJAX forum, anyone interested in ASP.Net Ajax can discuss it with me. :-)
Customer's question:
One CustomControl with UdpatePanel and HoverMenuExtender inside cannot fire the dopostback.
His code is below:
[DefaultProperty("Text")]
[ToolboxData(
"&lt;{0}:MagicText runat=server></{0}:MagicText>")]
public class MagicText : WebControl
{
protected UpdatePanel panel;
protected HoverMenuExtender menu;
private HttpSessionState Session;
protected TextBox textbox;
protected Panel currentMenu;


[Bindable(
true)]
[Category(
"Appearance")]
[DefaultValue(
"")]
[Localizable(
true)]
public string Text
{
get
{
String s 
= (String)ViewState["Text"];
return ((s == null? "[" + this.ID + "]" : s);
}


set
{
ViewState[
"Text"= value;
}

}


protected override void CreateChildControls()
{
panel 
= new UpdatePanel();
this.Controls.Add(panel);
panel.ID 
= this.ID + "ajaxPanel";

panel.UpdateMode 
= UpdatePanelUpdateMode.Conditional;
panel.ChildrenAsTriggers 
= true;
panel.Load 
+= new EventHandler(UpdatePanel_OnLoad);
textbox 
= new TextBox();
textbox.ReadOnly 
= true;
textbox.ID 
= this.ID + "textbox";
textbox.Text 
= Text;
Button b 
= new Button();
b.CommandName 
= "hi";
b.Text 
= "hi";
b.Click 
+= new EventHandler(ButtonClick);
b.ID 
= "button1";
panel.ContentTemplateContainer.Controls.Add(b);
menu 
= new HoverMenuExtender();
menu.ID 
= this.ID + "AjaxHoverMenu";
menu.BehaviorID 
= this.ID + "AjaxHoverMenuBehavior";
menu.PopupControlID 
= GetPanelForMenu();
menu.TargetControlID 
= textbox.ID;
menu.HoverCssClass 
= "popupHover";
menu.HoverDelay 
= 25;
menu.PopupPosition 
= HoverMenuPopupPosition.Right;
panel.ContentTemplateContainer.Controls.Add(textbox);
panel.ContentTemplateContainer.Controls.Add(menu);
panel.ContentTemplateContainer.Controls.Add(currentMenu);

PostBackTrigger trigger 
= new PostBackTrigger();
trigger.ControlID 
= b.ClientID.ToString();
panel.Triggers.Add(trigger);

base.CreateChildControls();
//panel.Controls.Add(currentMenu);

}


void ButtonClick(object sender, EventArgs e)
{
}


protected string GetPanelForMenu()
{
currentMenu 
= new Panel();
currentMenu.ID 
= this.ID + "menuForPopup";
currentMenu.CssClass 
= "popupMenu";
LinkButton lb;

lb 
= new LinkButton();
lb.ID 
= "magicMenuItem1";
lb.CssClass 
= "popupItem";
lb.Click 
+= new EventHandler(ModifyText);
lb.Text 
= "Edit";
currentMenu.Controls.Add(lb);


currentMenu.Controls.Add(
new LiteralControl("&lt;br/>"));

lb 
= new LinkButton();
lb.ID 
= "magicMenuItem2";
lb.CssClass 
= "popupItem";
lb.Text 
= "Add";
//lb.Click += new EventHandler(AddToText);
lb.CommandName = "Add";
currentMenu.Controls.Add(lb);

currentMenu.Controls.Add(
new LiteralControl("&lt;br/>"));

lb 
= new LinkButton();
lb.ID 
= "magicMenuItem3";
lb.CssClass 
= "popupItem";
lb.Click 
+= new EventHandler(TranslateText);
lb.Text 
= "Translate";
currentMenu.Controls.Add(lb);

currentMenu.Controls.Add(
new LiteralControl("&lt;br/>"));

lb 
= new LinkButton();
lb.ID 
= "magicMenuItem4";
lb.CssClass 
= "popupItem";
lb.Click 
+= new EventHandler(CommentText);
lb.Text 
= "Comment";
currentMenu.Controls.Add(lb);

currentMenu.Controls.Add(
new LiteralControl("&lt;br/>"));

lb 
= new LinkButton();
lb.ID 
= "magicMenuItem5";
lb.CssClass 
= "popupItem";
lb.Click 
+= new EventHandler(FlagText);
lb.Text 
= "Flag";
currentMenu.Controls.Add(lb);

currentMenu.Controls.Add(
new LiteralControl("&lt;br/>"));

lb 
= new LinkButton();
lb.ID 
= "magicMenuItem6";
lb.CssClass 
= "popupItem";
lb.Click 
+= new EventHandler(ViewRevisionHistory);
lb.Text 
= "View Revisions";
currentMenu.Controls.Add(lb);

currentMenu.Controls.Add(
new LiteralControl("&lt;br/>"));

return currentMenu.ID;
}


void UpdatePanel_OnLoad(object sender, EventArgs e)
{
int x = 0;
= x;
}


void ModifyText(object sender, EventArgs e)
{
textbox.ReadOnly 
= false;
textbox.BackColor 
= Color.Pink;
}


void AddToText(object sender, EventArgs e)
{
throw new NotImplementedException();
}


void TranslateText(object sender, EventArgs e)
{
throw new NotImplementedException();
}


void CommentText(object sender, EventArgs e)
{
throw new NotImplementedException();
}


void FlagText(object sender, EventArgs e)
{
throw new NotImplementedException();
}


void ViewRevisionHistory(object sender, EventArgs e)
{
throw new NotImplementedException();
}



protected override void RenderContents(HtmlTextWriter output)
{
panel.RenderControl(output);
currentMenu.RenderControl(output);
}


void RenderMenu(HtmlTextWriter writer)
{
base.Render(writer);
}

}

 

The cause is the CustomControl has not implemented the INamingContainer interface. Custom control MUST implement this Marker interface if it needs to handle any of its child control's events. There is nothing to do with the AjaxControlToolkit and the UpdatePanel.

Here are some useful links:
http://www.dotnetjunkies.com/WebLog/srivallichavalidotnet/archive/2005/11/14/133759.aspx
http://msdn.microsoft.com/en-us/library/system.web.ui.inamingcontainer.aspx

Thread url:http://forums.asp.net/t/1367187.aspx

posted on 2009-01-13 13:16  Zhi-Qiang Ni  阅读(410)  评论(0编辑  收藏  举报