There are occasions when you want to highlight a row in the GridView (I usually want this based on a Boolean field) so here’s what you do.
First of all we need some way of telling the column to do this an I usually use an attribute see Listing 1 it have two properties one for the value when we want the CSS class to be applied, and the other the CSS class to apply.
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public class RowHighlightingAttribute : Attribute { /// <summary> /// Initializes a new instance of the <see cref="RowHighlightingAttribute"/> class. /// </summary> /// <param name="valueWhenTrue">The value when true.</param> /// <param name="cssClass">The CSS class.</param> public RowHighlightingAttribute(String valueWhenTrue, String cssClass) { ValueWhenTrue = valueWhenTrue; CssClass = cssClass; } /// <summary> /// Gets or sets the value when true. /// </summary> /// <value>The value when true.</value> public String ValueWhenTrue { get; set; } /// <summary> /// Gets or sets the CSS class. /// </summary> /// <value>The CSS class.</value> public String CssClass { get; set; } }
Listing 1 – RowHighlightingAttribute
Next we need a way of applying the CSS class based on the condition, see Listing 2.
/// <summary> /// Highlights the row. /// </summary> /// <param name="fieldTemplate">The field template.</param> public static void HighlightRow(this FieldTemplateUserControl fieldTemplate) { // get the attribute var rowHighlighting = fieldTemplate.MetadataAttributes.GetAttribute<RowHighlightingAttribute>(); // make sure the attribute is not null if (rowHighlighting != null) { // get the GridViewRow, note this will not // be present in a DetailsView. var parentRow = fieldTemplate.GetContainerControl<GridViewRow>(); if (parentRow != null && rowHighlighting.ValueWhenTrue == fieldTemplate.FieldValueString) { // apply the CSS class appending if a class is already applied. if (String.IsNullOrWhiteSpace(parentRow.CssClass)) parentRow.CssClass += " " + rowHighlighting.CssClass; else parentRow.CssClass = rowHighlighting.CssClass; } } }
Listing 2 – HighlightRow extension method
Now to add the extension method to a field template, we will apply it to the Boolean read-only field template.
protected override void OnDataBinding(EventArgs e) { base.OnDataBinding(e); object val = FieldValue; if (val != null) CheckBox1.Checked = (bool)val; // apply highlighting this.HighlightRow(); }
Listing 3 – Apply highlighting.
For the sample I’ve also added it to the Text.ascx.cs field template.
Adding some attributes
Figure 1 - Metadata applied
You could also us this technique on other values, but this will do for this sample.
Figure 2 – Row Highlighting applied.
So you can see with a little bit of work you can add conditional row level highlighting to Dynamic Data.