显示DataTable的列的总值

时间:2016-07-16 16:52:45

标签: c# .net winforms data-binding datatable

我想显示商品总价格的总和。我面临两个问题:

  • 它向我显示错误的物品总价格
  • 我想将.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();

2 个答案:

答案 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位数,您可以使用以下任一选项:

更新数据更改总和

还可以在添加新项目或删除某些项目或更改某些值时在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}";