I am trying to write a simple webcontrol utility to display single-line messages inside a web page - status updates, error messages, etc. Messages will come from other controls on the page by calling a method in webcontrol. If the control does not have any messages by the time of its preliminary rendering, I do not want it to appear on the page at all - I want it to set Control.Visible = false. However, it seems that this only works for non-postback processing. Here is the code I'm using:
public class MessageList : WebControl { #region inner classes private struct MessageItem { string Content, CssClass; public MessageItem(string content, string cssClass) { Content = content; CssClass = cssClass; } public override string ToString() { return "<li" + (String.IsNullOrEmpty(CssClass) ? String.Empty : " class='" + CssClass + "'") + ">" + Content + "</li>"; } } private class MessageQueue : Queue<MessageItem> { } #endregion #region fields, constructors, and events MessageQueue queue; public MessageList() : base(HtmlTextWriterTag.Ul) { queue = new MessageQueue(); } protected override void OnLoad(EventArgs e) { this.Controls.Clear(); base.OnLoad(e); } protected override void OnPreRender(EventArgs e) { this.Visible = (queue.Count > 0); if (this.Visible) { while (queue.Count > 0) { MessageItem message = queue.Dequeue(); this.Controls.Add(new LiteralControl(message.ToString())); } } base.OnPreRender(e); } #endregion #region properties and methods public void AddMessage(string content, string cssClass) { queue.Enqueue(new MessageItem(content, cssClass)); } public void AddMessage(string content) { AddMessage(content, String.Empty); } #endregion }
I tried putting the check inside CreateChildControls with the same result too.
The digital gabeg
source share