At what point in the control life cycle does Control.Visible stop rendering?
asp.net, c#
Solution
Instead of modifying the 'Visible' property, try this :
protected override void Render(HtmlTextWriter writer)
{
if (queue.Count > 0)
base.Render(writer);
}
Problem
I am trying to write a simple utility webcontrol to display one-line messages inside a web page - status updates, error messages, etc. The messages will come from other controls on the page, by calling a method on the webcontrol. If the control doesn't have any messages by the time it gets to pre-render, I don't want it to render on the page at all - I want it to set Control.Visible = false. This only seems to work for non-postback rendering though. Here's 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 too, with the same result.