C# 显示数据表列的值的总和

C# 显示数据表列的值的总和,c#,.net,winforms,data-binding,datatable,C#,.net,Winforms,Data Binding,Datatable,我想显示项目总价的总和。我面临两个问题: 它显示了错误的项目总价 我想在总价中加上.00 您可以在中查看问题以获得明确的解释 这是我的密码: tDisplay.Text = "Return/" + "Receipt No:" + Return_Form.setalueforText011; label1.Text = Return_Form.setalueforText011; OleDbConnection VCON = new OleDbConnection(@"Provider=Mi

我想显示项目总价的总和。我面临两个问题:

  • 它显示了错误的项目总价
  • 我想在总价中加上
    .00
您可以在中查看问题以获得明确的解释

这是我的密码:

tDisplay.Text = "Return/" + "Receipt No:" + Return_Form.setalueforText011;
label1.Text = Return_Form.setalueforText011;

OleDbConnection VCON = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Restaurant.accdb");
DataSet dsa = new DataSet();
DataTable dt = new DataTable();
dsa.Tables.Add(dt);

OleDbDataAdapter da = new OleDbDataAdapter();
da = new OleDbDataAdapter("SELECT [Column1],[Column2],[Column3] from [Total] Where [Receipt No] =  " + label1.Text + "", VCON);
da.Fill(dt);
//dataGridView1.DataSource = dt;

for (int i = 0; i < dt.Rows.Count; i++)
{
    products.Add(new tblProduct() { productName = dt.Rows[i]["Column2"].ToString(),productPrice = Convert.ToDecimal(Math.Round(Convert.ToDecimal(dt.Rows[i]["Column1"].ToString())))});
    label3.Text = dt.Rows[i]["Column3"].ToString();
    textBox59.Text = "Rs: "+String.Format("{0:}", Total);
    tblProduct selected = (tblProduct)(listBox60.SelectedItem);
    Total += (decimal)selected.productPrice;
}
VCON.Close();
tDisplay.Text=“Return/”+“收据编号:”+Return\u Form.setalueforText011;
label1.Text=Return\u Form.setalueforText011;
OleDbConnection VCON=新的OleDbConnection(@“Provider=Microsoft.ACE.OLEDB.12.0;数据源=D:\Restaurant.accdb”);
数据集dsa=新数据集();
DataTable dt=新的DataTable();
dsa.Tables.Add(dt);
OleDbDataAdapter da=新的OleDbDataAdapter();
da=新的OleDbDataAdapter(“从[Total]中选择[Column1]、[Column2]、[Column3],其中[ReceiveNo]=“+label1.Text+”,VCON);
da.填充(dt);
//dataGridView1.DataSource=dt;
对于(int i=0;i
在循环中,您总是将SelectedItem行添加到总数中。这始终是第一项,因此最终会将第一项的值加倍

for (int i = 0; i < dt.Rows.Count; i++)
{
    // Create and initialize a new tblProduct from the datatable row
    tblProduct current = new tblProduct();
    current.ProductName = dt.Rows[i]["Column2"].ToString();
    current.productPrice = Convert.ToDecimal(Math.Round(Convert.ToDecimal(dt.Rows[i]["Column1"].ToString())));

    // Add to your list of products
    products.Add(current);

    // This line is wrong because you overwrite the value at each loop
    label3.Text = dt.Rows[i]["Column3"].ToString();

    // Sum the price of the current tblProduct
    Total += (decimal)current.productPrice;
}
// Outside the loop update your total label
textBox59.Text = "Rs: "+String.Format("{0:0.00}", Total);
for(int i=0;i
如果你允许我给你一个建议。不要这样命名控件。它们不可读,也不容易辨认。从现在开始的某一天看这段代码,您将有很多问题要记住哪个控件是textBox59还是listBox60。

Sum

不使用for循环,您可以简单地使用数据表的方法并传递一个表达式进行计算。例如:

var total = yourDataTable.Compute("SUM(Column1)", "");
格式

此外,要将总计设置为小数点后显示2位数字,您可以使用以下选项之一:

  • string.Format(“{0:0.00}”,总计))

  • string.Format(“{0:F2}”,总计))

根据数据变化更新总和

此外,为了能够在添加新项目或删除某些项目或更改某些值时在
TextBox
事件中自动显示总和,请处理
DataTable.DefaultView的
ListChanged
事件,并将结果设置为文本框的
Text

例子
非常感谢你,先生,我真的非常感谢你,你真的是个天才。如果你不介意的话,我可以再问你一个问题吗?还有一件事,我在第一个问题中问你,我如何用物品价格加上.00。这部分问题我不清楚。我看不出如何将项目添加到列表框。但是,如果您从产品列表中获取项目,则需要像现在一样对其进行格式化。@michaeljohn将
Total
变量设为双精度变量,并调用
Total.ToString(“0.00”)
。再次感谢您的回复。我不是在我的主窗体中询问这个列表框,我使用的是另一个列表框,我希望当我点击按钮时,所有项目的前景色都变为红色,然后如果我在列表框中添加其他项目,那么这个项目的前景色变为黑色而不是红色
// Define data table
var dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Price", typeof(int));

// Fill data
dt.Rows.Add("Product 1", 100);
dt.Rows.Add("Product 2", 200);

// Set data source of data grid view
this.dataGridView1.DataSource = dt;

// Automatically update text box, by SUM of price
textBox1.Text = $"{dt.Compute("SUM(Price)", ""):F2}";
dt.DefaultView.ListChanged += (obj, args) =>
    textBox1.Text = $"{dt.Compute("SUM(Price)", ""):F2}";