Customer's question:
One CustomControl with UdpatePanel and HoverMenuExtender inside cannot fire the dopostback.
His code is below:
One CustomControl with UdpatePanel and HoverMenuExtender inside cannot fire the dopostback.
His code is below:
[DefaultProperty("Text")]
[ToolboxData("<{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("<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("<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("<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("<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("<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("<br/>"));
return currentMenu.ID;
}
void UpdatePanel_OnLoad(object sender, EventArgs e)
{
int x = 0;
x = 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);
}
}
[ToolboxData("<{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("<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("<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("<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("<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("<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("<br/>"));
return currentMenu.ID;
}
void UpdatePanel_OnLoad(object sender, EventArgs e)
{
int x = 0;
x = 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
作者:Zhi-QiangNi(Zhi-QiangNi's Tech Blog)
出处:http:// Zhi-QiangNi.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。