I have a few scattered <p>
elements on the aspx page which I am grouping together using a class like so - <p class="instructions" runat="server">
In my code behind, using C# I want to hide these elements, using something like
instructions.Visible = false;
However I realize I can only do this in codebehind if I use ID but this will result in invalid HTML/CSS Selector since you can't have multiple ID's with the same ID name...
Alternatively is there another way to group the controls if not by class?
EDIT: I can't use JavaScript, so the selection must be done in C# codebehind/ASP.NET
The CSS class Selector The class selector selects HTML elements with a specific class attribute. To select elements with a specific class, write a period (.) character, followed by the class name.
The difference between Class and ID selector IDs are only used when one element on the page should have a particular style applied to it. However, a class can be used to identify more than one HTML element.
Yes, you can. But note that Id's must be unique within your html file, while classes can be used in multiples elements.
Difference between id and class attribute: The only difference between them is that “id” is unique in a page and can only apply to at most one element, while “class” selector can apply to multiple elements.
The thing is quite easy. In your ASPX:
<p class="instructions" runat="server" OnPreRender="Paragraph_PreRender">
In your codebehind:
protected void Paragraph_PreRender(object sender, EventArgs e)
{
Control paragraph = (Control)sender;
paragraph.Visible = !paragraph.CssClass.Contains("instructions");
}
The codebehind will be hooked up automatically to the PreRender event handler in your class. This casts the sender to the control and sets its Visibility dependent on the css class. You just have to adjust the tags and you don't need a lot code traversing your control collection.
Aside from grouping all of the controls in a single container control, there is no easy way to find a group of controls given some property in ASP.NET server-side code.
On the client side, you could use something like jQuery to find these elements and hide them:
$(".instructions").hide();
I would probably do this in response when the page is fully loaded:
$(document).ready(function() {
$(".instructions").hide();
});
One downside to hiding elements in Javascript is that if there's enough data it may take a second and cause content to flicker. Another difference is that hiding content client-side does not remove it from the DOM - the content is there just hidden. Hiding controls server-side prevents their content from even being emitted to the HTML.
Doing the same thing in C# is a bit harder - it requires recursively traversing the control tree and looking for elements in the Control
collection that match. This is a common enough operation that a utility function is useful. C# iterator syntax (yield return) is helpful in making this clean:
// utility method to recursively find controls matching a predicate
IEnumerable<Control> FindRecursive( Control c, Func<Control,bool> predicate )
{
if( predicate( c ) )
yield return c;
foreach( var child in c.Controls )
{
if( predicate( c ) )
yield return c;
}
foreach( var child in c.Controls )
foreach( var match in FindRecursive( c, predicate ) )
yield return match;
}
// use the utility method to find matching controls...
FindRecursive( Page, c => (c is WebControl) &&
((WebControl)c).CssClass == "instructions" );
Hiding the controls now is relatively easy:
foreach( WebControl c in FindRecursive( Page, c => (c is WebControl) &&
((WebControl)c).CssClass == "instructions" ) )
{
c.Visible = false;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With