Actually, <HR> does allow Runat="Server". With Runat="Server", <HR> is an
instance of HtmlGenericControl which does have a Visible property. You
could also use .Style["display"] = "none" or "inline" if you still wanted it
to be rendered.
If you look at the documentation of HtmlGenericControl, you'll see that
there's an overload for the constructor that allows you to specify the tag
name so you can dynamically create tags such as <HR> on the fly. There's
also a TagName property for getting or setting the tag name as needed.
One thing to keep in mind is that ASP.NET pages aren't HTML, they're XHTML
and therefore, to be valid, all tags must have a close tag. The runtime
lets you get away with using HTML for non-server-side tags (because
everything not marked as a server tag is treated as a LiteralControl and
streamed to the browser "as is") but for server-side tags (anything marked
as runat="server") you will need the end tag. For tags like <HR>, when you
set Runat="Server", you'll need to write it like this:
<HR runat="server" id="Line1" /> or
<HR runat="server" id="Line1"></HR>
Personally, I prefer the first option because it's more concise.
HTH