我想显示商品总价格的总和。我面临两个问题:
.00
添加到总价您可以在image中查看问题,以获得明确的解释。
这是我的代码:
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();
答案 0 :(得分:1)
在循环中,总是将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);
如果你允许我提出建议。不要那样命名控件。它们不可读,不易识别。从现在开始的某一天看这段代码,你会遇到很多问题要记住哪个控件是textBox59或listBox60。
答案 1 :(得分:1)
<强> 萨姆 强>
您可以简单地使用数据表的Compute
方法,并将表达式传递给计算,而不是使用for循环。例如:
var total = yourDataTable.Compute("SUM(Column1)", "");
<强> 格式 强>
另外,要将总数格式设置为在小数位后显示2位数,您可以使用以下任一选项:
The "0" Custom Numeric Format String:string.Format("{0:0.00}", total))
The Fixed-Point "F" format Specifier:string.Format("{0:F2}", total))
更新数据更改总和
还可以在添加新项目或删除某些项目或更改某些值时在TextBox
事件中自动显示总和,处理ListChanged
DataTable.DefaultView
事件并设置结果作为文本框的Text
。
// 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}";