【问题标题】:How to show sum in label while searching datagridview using textbox使用文本框搜索datagridview时如何在标签中显示总和
【发布时间】:2017-11-11 19:52:01
【问题描述】:

我有 DataGridView,其中包含大量数据和一个搜索文本框。 我的问题是,当我过滤 datagridview 行时,我希望根据搜索数据更改小计标签,但我无法做到这一点,因为我正在使用查询选择小计 SUM。

这是我的小计标签代码

SqlConnection con = new SqlConnection(str);
con.Open();
string query = "SELECT SUM(Sub_Total) from (SELECT distinct Sub_Total FROM Sales_Order) as Sales_Order";
    using (SqlCommand command = new SqlCommand(query, con))
{
    object result = command.ExecuteScalar();
    Sub_Tot.Text = Convert.ToString(result); ;
}
con.Close();

文本框文本修改代码:

SqlConnection con = new SqlConnection(str);
con.Open();
SqlDataAdapter sda = new SqlDataAdapter("Select Invoice_no,Date_of_Sale,Customer_Name,Contact,Item_Code,Item_Name,Quantity,Selling_Price,Discount,Paid_Amount,Remaining,Sub_Total,Total From Sales_Order Order By Invoice_no", con);
DataTable dt = new DataTable();
sda.Fill(dt);
dgv.DataSource = dt;

DataView dv = new DataView(dt);
dv.RowFilter = string.Format("Item_Name LIKE '{0}%' ", Search_By_ItemName.Text);
dgv.DataSource = dv;

一切正常,但不会根据过滤器更改 SubTotal Text 我想根据搜索过滤器更改我的 SubTotal 标签文本怎么可能?

注意:使用计时器可以正常工作,但我不想使用计时器

int sum = 0;
for (int i = 0; i < Sale_Order_Grid.Rows.Count; i++)
{
    sum += Convert.ToInt32(Sale_Order_Grid.Rows[i].Cells[8].Value);
}
this.lbl_SubTotal.Text = sum.ToString();

【问题讨论】:

  • 改为搜索数据表。
  • @jdweng 任何代码示例?
  • 类似这样的东西: List searchRows = dt.AsEnumerable().Where(x => x.Field("Customer_Name") == Search_By_ItemName.Text).ToList() ; int sum = searchRows.AsEnumerable().Sum(x => x.Field("Paid_Amount"));
  • 有一些方法可以做到这一点,但最简单的方法是使用RowsAdded 事件。
  • DataBindingComplete

标签: c# winforms datagridview


【解决方案1】:

啊哈,如果我理解正确,您想根据您的搜索查询填充subtotal 标签,而不是在您的网格上循环并对该列一一求和?是吗?

如果为真,您可以在 T-Sql 中使用 sum 聚合并从 DataTable 列中获取它,例如:

    SqlConnection con = new SqlConnection(str);
con.Open();
SqlDataAdapter sda = new SqlDataAdapter("Select Invoice_no,Date_of_Sale,Customer_Name,Contact,Item_Code,Item_Name,Quantity,Selling_Price,Discount,Paid_Amount,Remaining,Sub_Total,Total,SUM(Sub_Total) as SubTotal From Sales_Order Group by Invoice_no,Date_of_Sale,Customer_Name,Contact,Item_Code,Item_Name,Quantity,Selling_Price,Discount,Paid_Amount,Remaining,Sub_Total,Total Order By Invoice_no", con);
DataTable dt = new DataTable();
sda.Fill(dt);
dgv.DataSource = dt;

DataView dv = new DataView(dt);
dv.RowFilter = string.Format("Item_Name LIKE '{0}%' ", Search_By_ItemName.Text);
dgv.DataSource = dv;

通过字段名称获取您的 col 值:

var totlaCol= dt.Columns.Cast<DataColumn>().SingleOrDefault(col => col.ColumnName == "SubTotal");
if (totalCol!= null)
{
    var tableRows = dt.AsEnumerable().First();
    var sumVal= tableRows.Field<string>(totlaCol);
    // or 
    //sumVal = tableRows.Field<string>(dt.Columns.IndexOf(myColumn));
}

1- 请注意,如果您使用了Sum,您应该Group by 您选择的列。

2- 您可以使用单独的查询来选择 sum col 并使用单独的DataTable

3- 我之前没有测试过,但我确信这种方式会给你预期的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2018-09-29
    相关资源
    最近更新 更多