jeudi 1 avril 2010

Asp.net 3.5 - Calculer des sommes de colonnes dans une gridview

Problème récurrent auquel presque tout développeur à du faire face un jour.
Il existe une solution simple demandant peu de javascript et C#, mais surtout qui permet d’être facilement réutilisable. Ici un exemple pour faire la somme de cinq colonnes.
La gridview
Celle-ci contient des Templates de ligne. Le Template d’édition contient une TextBox. De plus il ne faut pas oublier d’associé l’événement rowdatabound avec la function DataGridBudget_RowDataBound présenté plus bas.
Section Javascript
Dans la page Aspx :
<script language="javascript" type="text/javascript" >
 
function CalculateFloatTotal(ListId,DestinationId)
{
 
    var ElementTable = new Array();
    //Récupération des objets
    for ( var n in ListId )
    {
      ElementTable[n] = document.getElementById(ListId[n]);
    }
  
   var ValuesTables = new Array();
   //récupération des valeurs
    for ( var n in ElementTable )
    {
        if(ElementTable[n].value!=null)
          ValuesTables[n] = parseFloat(ElementTable[n].value);
         //test des valeurs
        if(isNaN(ValuesTables[n])||ValuesTables[n]==0)           
            ValuesTables[n]=0; 
    }
    var total = 0;
    //Somme
    for ( var n in ValuesTables )
    {
      total += ValuesTables[n];
    }
    //Affichage
    var elemntDestination = document.getElementById(DestinationId);
    elemntDestination.value = total.toFixed(2);   
}
 
 
</script>
Section C#
 
Et dans le code behind :
    /// <summary>
    /// Liaison des données des lignes
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void DataGridBudget_RowDataBound(object sender, GridViewRowEventArgs e)
    {
 
        //Insertion de code javascript pour le calcul automatique des totaux de lignes
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
           
            TextBox Txt_TotalAnnuite = (TextBox)e.Row.FindControl("Txt_TotalAnnuite");
            TextBox txt_travaux1 = (TextBox)e.Row.FindControl("txt_travaux1");
            TextBox txt_travaux2 = (TextBox)e.Row.FindControl("txt_travaux2");
            TextBox Txt_Taxe_Municipal = (TextBox)e.Row.FindControl("Txt_Taxe_Municipal");
            TextBox Txt_TotalAnnuelHotel = (TextBox)e.Row.FindControl("Txt_TotalAnnuelHotel");
            String l_ListClientId =
                "['" + Txt_TotalAnnuite.ClientID
               + "', '" + Txt_Taxe_Municipal.ClientID
               + "', '" + txt_travaux1.ClientID
               + "', '" + txt_travaux2.ClientID
               + "'],'" + Txt_TotalAnnuelHotel.ClientID + "'";
            Txt_TotalAnnuite.Attributes.Add("onblur", string.Format("CalculateFloatTotal({0})", l_ListClientId));
            txt_travaux1.Attributes.Add("onblur", string.Format("CalculateFloatTotal({0})", l_ListClientId));
            txt_travaux2.Attributes.Add("onblur", string.Format("CalculateFloatTotal({0})", l_ListClientId));
            Txt_Taxe_Municipal.Attributes.Add("onblur", string.Format("CalculateFloatTotal({0})", l_ListClientId));
           
        }
 
    }

Aucun commentaire:

Enregistrer un commentaire