簡體   English   中英

使用Javascript的多列動態gridview的列和

[英]Column sum of multiple columns of dynamic gridview using Javascript

我有一個Dynamic asp Gridview,所有列都作為模板feild TextBox。 Gridview的列也是動態的,列數可能隨時變化。

請在下面找到代碼

public void FillPoDetails()
{
    DataTable dt = new DataTable();           
    dt = pmdata.createdatatable(int.Parse(Session["OurStyleid"].ToString()), int.Parse(Session["PoPackid"].ToString()));
    GenerateTable(dt.Columns.Count, dt.Rows.Count,dt);
    foreach (DataColumn col in dt.Columns)
    {
        //Declare the bound field and allocate memory for the bound field.
        TemplateField bfield = new TemplateField();

        //Initalize the DataField value.
        bfield.HeaderTemplate = new ArtWebApp.Controls.GridViewTemplate(ListItemType.Header, col.ColumnName);

        //Initialize the HeaderText field value.
        bfield.ItemTemplate = new ArtWebApp.Controls.GridViewTemplate(ListItemType.Item, col.ColumnName);

        //Add the newly created bound field to the GridView.
        GrdDynamic.Columns.Add(bfield);
    }
    GrdDynamic.DataSource = dt;    
    GrdDynamic.DataBind();  
}
public GridViewTemplate(ListItemType type, string colname)
{
    //Stores the template type.
    _templateType = type;

    //Stores the column name.
    _columnName = colname;
}

void ITemplate.InstantiateIn(System.Web.UI.Control container)
{
    switch (_templateType)
    {
        case ListItemType.Header:
            //Creates a new label control and add it to the container.
            Label lbl = new Label();            
            //Allocates the new label object.
            lbl.Text = _columnName;
            lbl.CssClass = "Headerclass";
            //Assigns the name of the column in the lable.
            container.Controls.Add(lbl);        
            //Adds the newly created label control to the container.
            break;
        case ListItemType.Item:
            //Creates a new text box control and add it to the container.
            TextBox tb1 = new TextBox();                            
            //Allocates the new text box object.
            tb1.DataBinding += new EventHandler(tb1_DataBinding);    
            //Attaches the data binding event.
            tb1.Columns =6;
            //Creates a column with size 4.
            // tb1.Width = System.Web.UI.WebControls.Unit.Percentage(100);
            tb1.Width = 100;
            tb1.Wrap = true;
            tb1.ID = "txt_" + _columnName;
            if(_columnName== "ColorTotal")
            {
                tb1.CssClass = "ColorTotal";
            }
            else if (_columnName == "Color")
            {
                tb1.CssClass = "Color";
            }
            else
            {
                tb1.CssClass = "txtCalQty";
                tb1.Attributes.Add("onkeypress", "return isNumberKey(event,this)");
                tb1.Attributes.Add("onkeyup", "sumofQty(this)");
            }                       
            container.Controls.Add(tb1);                            
            //Adds the newly created textbox to the container.  
            break;
    }
}

為了獲得行總數,我在keydown事件中添加了一個Javascript函數,並且它的工作清晰

 //calculate the sum of qty on keypress
   function sumofQty(objText) {


       var cell = objText.parentNode;

       var row = cell.parentNode;

       var sum = 0;
       var textboxs = row.getElementsByClassName("txtCalQty");

       for (var i = 0; i < textboxs.length; i++)
       {
           sum += parseFloat(textboxs[i].value);
       }
       var textboxtotalqtys = row.getElementsByClassName("ColorTotal");
       textboxtotalqtys[0].value = sum.toString();         

   }

結果如下 在此輸入圖像描述

任何人都可以幫我找出每列的總和(所有相同的cssclass)。並在Sizetotal行中顯示它,因為我無法循環列

有一種非常簡單的方法。

為每個列添加頁腳和標簽,然后從數據庫端進行最佳計算是使用LINQ和Group by,找到每個列的頁腳標簽控件並將值綁定到頁腳的標簽控件,這樣您的UI將具有較少的負載。

請看這里代碼:

網格中的.ASPX頁面:

  <asp:TemplateField HeaderText="Total">
   <ItemTemplate>
  <asp:Literal ID="ltrlTotal" Text='<%#Eval("Total") %>' runat="server"> </asp:Literal> // For Sub Total
</ItemTemplate>
 <FooterTemplate>
 <strong><asp:Literal ID="ltrlGrandTotal" runat="server"> // This is Grand Total
  </asp:Literal></strong>
 </FooterTemplate>                       
 </asp:TemplateField>

C#代碼:

 var searchResult = soService.SearchResult(companyId);
            var grandTotal = searchResult.Select(so => so.Total).Sum();
            searchResult.All(aa => aa.GrandTotal == grandTotal);

            gridSo.DataSource = searchResult;
            gridSo.DataBind();

            if (searchResult.Count > 0)
            {
                Literal ltrlGrandTotal = gridSo.FooterRow.FindControl("ltrlGrandTotal") as Literal;
                if (ltrlGrandTotal != null)
                    ltrlGrandTotal.Text = string.Format("Grand Total : $ {0}", grandTotal);
            }

不確定您的要求,但這可能會幫助您,將數據綁定到網格后,再次循環列列表

GrdDynamic.DataSource = dt;    
GrdDynamic.DataBind();
int rowIndex=2;
GrdDynamic.FooterRow.Cells[1].Text = "Total";
GrdDynamic.FooterRow.Cells[1].HorizontalAlign = HorizontalAlign.Right;
foreach (DataColumn col in dt.Columns)
{
   decimal total = dt.AsEnumerable().Sum(row => row.Field<decimal>(col.Caption));
   GrdDynamic.FooterRow.Cells[rowIndex++].Text = total.ToString("N2");
} 

我會通過html5數據屬性為每個文本框提供行id和列id。 並在javascript(jQuery)中通過列id過濾文本框。

例:

..
var sum = 0;
$( "input[data-column-id='" + selectedColumnId + "']" ).each(function( index )
{ 
   sum += parseFloat($( this ).val() );
});
..

順便說一句,使用jQuery。 太奇妙了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM