محاسبه و نمایش مجموع یک زیر مجموعه و مجموع نهایی در GridView

شنبه 15 شهریور 1393

چگونگی نمایش مجموع یک زیر مجموعه و مجموع نهایی از جمع به دست امده از زیر مجموعه ها در GridView در ASP.NET

محاسبه و نمایش مجموع  یک زیر مجموعه  و مجموع نهایی در GridView

ردیف ها به گروه هایی مجزا تقسیم شده اند و مجموع هر گروه محاسبه می شود و در نهایت با استفاده از یک ردیف دینامیک در GridView نمایش داده می شود.

در این مقاله سعی داریم نحوه نمایش مجموع  یک زیر مجموعه  و مجموع نهایی  از جمع به دست امده از زیر مجموعه ها در GridView در ASP.NET را نشان دهیم.

دیتابیس:

در این مقاله من از دیتابیس Microsoft’s Northwind استفاده کرده ام که شما می توانید از ادرس زیر برای دانلود و نصب دستورالعملهای ان استفاده کنید:

Install Microsoft Northwind and Pubs Sample databases in SQL Server Management Studio

ردیف ها به گروه هایی مجزا تقسیم شده اند و مجموع هر گروه محاسبه می شود و در نهایت با استفاده از یک ردیف دینامیک در GridView نمایش داده می شود.

نمونه کد HTML:

نمونه کد  زیر نشان دهنده یک GridView است که جزئیات جدول Orders که در دیتابیس Northwind ساخته شده بود را نمایش می دهد.

<asp:GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "false" OnDataBound = "OnDataBound" OnRowCreated = "OnRowCreated">
<Columns>
    <asp:BoundField DataField = "OrderID" HeaderText = "Order ID" ItemStyle-Width = "60" />
    <asp:BoundField DataField = "ProductName" HeaderText = "Product Name" ItemStyle-Width = "210" />
    <asp:BoundField DataField = "Price" HeaderText = "Price" ItemStyle-Width = "60" DataFormatString = "{0:N2}" ItemStyle-HorizontalAlign = "Right" />
</Columns>
</asp:GridView>

 

فضاهای نام:

فضاهای نام زیر را وارد کنید:

using System.Data;
using System.Drawing;
using System.Configuration;
using System.Data.SqlClient;

بایند کردن GridView:

  GridView به همراه ردیف هایش در رویداد page load  صدا زده می شود.کواری داده شده تعدادی  از ردیف ها ی Orders  را که شامل محصولات و قیمتشان است را می گیرد و  در نتیجه مجموع زیر مجموعه  محاسبه  و نهایتا مجموع کل محاسبه می شود.

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        this.BindGrid();
    }
}
 
private void BindGrid()
{
    string query = "SELECT OrderID,";
    query += "(SELECT ProductName FROM Products WHERE ProductID = details.ProductId) ProductName,";
    query += "(Quantity * UnitPrice) Price";
    query += " FROM [Order Details] details";
    query += " WHERE OrderID IN (10248, 10249, 10250)";
    query += " ORDER BY OrderID";
    string conString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
    using (SqlConnection con = new SqlConnection(conString))
    {
        using (SqlCommand cmd = new SqlCommand(query))
        {
            using (SqlDataAdapter sda = new SqlDataAdapter())
            {
                cmd.Connection = con;
                sda.SelectCommand = cmd;
                using (DataTable dt = new DataTable())
                {
                    sda.Fill(dt);
                    GridView1.DataSource = dt;
                    GridView1.DataBind();
                }
            }
        }
    }
}

 

محاسبه و نمایش مجموع  یک زیر مجموعه  و مجموع نهایی در GridView:

من تعدادی از متغیرها را برای محاسبه مجموع  یک زیر مجموعه  و مجموع نهایی  تعریف کرده ام که بیرون در یک کلاس تعریف شوند که بتوان به انها در تمام رویدادها  و متدها دسترسی داشت.

در ابتدا  ما نیاز مندیم تا در OnRowCreated ،Data Table ی را  که برای صدا زدن GridView با استفاده از شی DataItem استفاده شده بود  را بگیریم .

وقتی Data Table را داشتیم به راحتی می توان قیمت هر محصول را به دست اورده  و برای محاسبه مجموع  یک زیر مجموعه  و مجموع نهایی  استفاده کنیم.

 OrderId با استفاده از currentId دنبال می شود و به محض اینکه یک تغییر شناسایی می شود یک رکورد جدید ساخته

می شود و به GridView با استفاده از متد AddTotalRow اضافه می شود.

int currentId = 0;
decimal subTotal = 0;
decimal total = 0;
int subTotalRowIndex = 0;
protected void OnRowCreated(object sender, GridViewRowEventArgs e)
{
    subTotal = 0;
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        DataTable dt = (e.Row.DataItem as DataRowView).DataView.Table;
        int orderId = Convert.ToInt32(dt.Rows[e.Row.RowIndex]["OrderID"]);
        total += Convert.ToDecimal(dt.Rows[e.Row.RowIndex]["Price"]);
        if (orderId != currentId)
        {
            if (e.Row.RowIndex > 0)
            {
                for (int i = subTotalRowIndex; i < e.Row.RowIndex; i++)
                {
                    subTotal += Convert.ToDecimal(GridView1.Rows[i].Cells[2].Text);
                }
                this.AddTotalRow("Sub Total", subTotal.ToString("N2"));
                subTotalRowIndex = e.Row.RowIndex;
            }
            currentId = orderId;
        }
    }
}
 
private void AddTotalRow(string labelText, string value)
{
    GridViewRow row = new GridViewRow(0, 0, DataControlRowType.DataRow, DataControlRowState.Normal);
    row.BackColor = ColorTranslator.FromHtml("#F9F9F9");
    row.Cells.AddRange(new TableCell[3] { new TableCell (), //Empty Cell
                                        new TableCell { Text = labelText, HorizontalAlign = HorizontalAlign.Right}, 
                                        new TableCell { Text = value, HorizontalAlign = HorizontalAlign.Right } });
 
    GridView1.Controls[0].Controls.Add(row);

OnRowCreated مجموع  زیر مجموعه  همه گرو ه ها را به غیر از اخری محاسبه می کند وقتی اخرین ردیف اضافه می شود از رویداد OnRowCreated  خارج نمی شود و بنابراین مجموع  زیر مجموعه  برای اخرین گروه اضافه نمی شود.

برای مدیریت این مشکل من از رویداد OnDataBound استفاده کرده ام در این جا مجموع  زیر مجموعه  به خوبیه ردیف مجموع کل  به GridView اضافه می شود .

protected void OnDataBound(object sender, EventArgs e)
{
    for (int i = subTotalRowIndex; i < GridView1.Rows.Count; i++)
    {
        subTotal += Convert.ToDecimal(GridView1.Rows[i].Cells[2].Text);
    }
    this.AddTotalRow("Sub Total", subTotal.ToString("N2"));
    this.AddTotalRow("Total", total.ToString("N2"));
}

 

جعفری

نویسنده 22 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید