Search code examples
cssasp.netif-statementaspxgridview

Use validation on GridView with BoundField


I'm new in aspx and I have a grid like this:

<asp:GridView ID="grdViewTareas" AutoGenerateColumns="false" runat="server" CssClass="Grid">
  <Columns>
    <asp:BoundField DataField="stardate" HeaderText="Fecha Inicio" DataFormatString="{0:d}" ItemStyle-HorizontalAlign="Center" />
    <asp:BoundField DataField="duedate" HeaderText="Fecha Fin" DataFormatString="{0:d}" ItemStyle-HorizontalAlign="Center" />
    <asp:BoundField DataField="progress" HeaderText="% de Avance" ItemStyle-HorizontalAlign="Center" />
  </Columns>
</asp:GridView>

I want to do a validation for each row of grid to paint background of column for example:

if (progress < 100){
background-color: red;
}

How can I achieve this. Regards


Solution

  • You use the OnRowDataBound event for that.

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        //check if the row is a datarow
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            //cast the row back to a datarowview
            DataRowView row = e.Row.DataItem as DataRowView;
    
            DateTime _currentDate = new DateTime();
            DateTime _dueDate = new DateTime();
    
            //first, check if the date fields are null or empty and then try to convert
            if (!string.IsNullOrEmpty(row["currentDate"].ToString()))
            {
                _currentDate = Convert.ToDateTime(row["currentDate"]);
            }
    
            if (!string.IsNullOrEmpty(row["dueDate"].ToString()))
            {
                _dueDate = Convert.ToDateTime(row["dueDate"]);
            }
    
            //check the value of progress and set the background color
            if (Convert.ToInt32(row["progress"]) < 100 && _currentDate > _dueDate)
            {
                e.Row.Cells[0].BackColor = Color.Red;
            }
        }
    }
    

    You need to add OnRowDataBound="GridView1_RowDataBound" to the GridView.

    If you bound a List of classes List<Myclass> you do this:

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        //check if the row is a datarow
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            //if you bound a list of classes to the GridView, cast back to the orignal class
            MyClass item = e.Row.DataItem as MyClass;
    
            //check the propertyu value of the class and set the background color
            if (item.progress < 100 && item.currentDate > item.dueDate)
            {
                e.Row.Cells[0].BackColor = Color.Red;
            }
        }
    }