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.
