如何计算和比较datagridview c#中的数字
How to count and compare number in datagirdview c#
加载表单时,我有标签“Hardwork”和 1 个 datagirdview 显示。我使用下面的代码在“TotalTime”列中进行数量比较。如果该值在“TotalTime”> = 30 列中,我想要标签“Harwork”+ 1
但不是 run.the 结果是:指定的转换无效。
请帮我解决一下
public void BtnSearch_Click(object sender, EventArgs e)
{
db = new DbConnector();
lbTotal.Text = "00";
db.fillDataGridView("select *from tbl_WorkLoad where TimeComplete Between'" + dateTimePicker1.Value.ToString("dd-MM-yy| HH:mm:tt") + "' and '" + dateTimePicker2.Value.ToString("dd-MM-yy| HH:mm:tt") + "'", dataGridView1);
const string HardWorkLabelText = "Hard Work Count: {0}";
const int HardWorkThreshold = 30;
try
{
IEnumerable<DataGridViewRow> rows = dataGridView1.Rows.Cast<DataGridViewRow>().Where(r => ((Int32)r.Cells["TotalTime"].Value) >= HardWorkThreshold);
lbHardwork.Text = string.Format(HardWorkLabelText, rows.Count());
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
lbTotaltime.Text = (Convert.ToString(double.Parse(lbTotaltime.Text) + double.Parse(dataGridView1.Rows[i].Cells[7].Value.ToString())));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
除了异常,代码中几乎没有其他问题。但让我们关注您报告的问题。
从代码中了解到,你要显示努力的次数,还要显示努力的总时间。
由于您正在遍历 gridview 的行,因此您可以在 for 循环中计算这两者。
var hardworkCount = 0;
var totalTimeSum = 0.0;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
double totalTime = double.Parse(dataGridView1.Rows[i].Cells[7].Value.ToString());
if(totalTime >= HardWorkThreshold)
{
hardworkCount++;
}
totalTimeSum += totalTime;
}
lbHardwork.Text = hardworkCount.ToString();
lbTotaltime.Text = totalTimeSum.ToString();
如果您不再将数据从 datagridview 中提取出来,而是让您的 datagridview 基于保存数据的数据表,您的生活将会简单得多。可能已经是这样了,但是我们看不到你的 filldatagridview
方法的定义
这是我的做法:
//assuming sql sevrer, use correct dataadapter for your db
using(var da = new SqlDataAdapter "select * from tbl_WorkLoad where TimeComplete Between @a and @b", "YOUR CONNECTION STRING HERE")){
da.SelectedCommand.Parameters.AddWithValue("@a", dateTimePicker1.Value);
da.SelectedCommand.Parameters.AddWithValue("@b", dateTimePicker2.Value);
var dt = new DataTable();
da.Fill(dt);
dataGridViewX.DataSource = dt;
lbHardwork.Text = dt.Compute("Count([TotalTime])", "[TotalTime] >= 30").ToString();
lbTotalTime.Text = dt.Compute("Sum([TotalTime])", "[TotalTime] >= 30").ToString();
}
您编写 SQL 的方式是一种模式,如果与字符串一起使用,则存在 SQL 注入风险 - 始终在 SQL 中使用参数。总是。在处理数据值时,没有理由不这样做。 See why, and also here
在 SQL 服务器中对字符串使用 AddWithValue 之前,您应该阅读 this blog。有比 AWV 更好的方法来处理参数,但至少使用 AddWithValue 比你现在正在做的更好
不要通过网格访问网格视图中的数据;将网格绑定到数据表,如果需要数据,请访问数据表。如果你想在任何时候从网格中获取数据表,你可以使用 var dt = datagridviewX.DataSource as DataTable
加载表单时,我有标签“Hardwork”和 1 个 datagirdview 显示。我使用下面的代码在“TotalTime”列中进行数量比较。如果该值在“TotalTime”> = 30 列中,我想要标签“Harwork”+ 1
但不是 run.the 结果是:指定的转换无效。
请帮我解决一下
public void BtnSearch_Click(object sender, EventArgs e)
{
db = new DbConnector();
lbTotal.Text = "00";
db.fillDataGridView("select *from tbl_WorkLoad where TimeComplete Between'" + dateTimePicker1.Value.ToString("dd-MM-yy| HH:mm:tt") + "' and '" + dateTimePicker2.Value.ToString("dd-MM-yy| HH:mm:tt") + "'", dataGridView1);
const string HardWorkLabelText = "Hard Work Count: {0}";
const int HardWorkThreshold = 30;
try
{
IEnumerable<DataGridViewRow> rows = dataGridView1.Rows.Cast<DataGridViewRow>().Where(r => ((Int32)r.Cells["TotalTime"].Value) >= HardWorkThreshold);
lbHardwork.Text = string.Format(HardWorkLabelText, rows.Count());
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
lbTotaltime.Text = (Convert.ToString(double.Parse(lbTotaltime.Text) + double.Parse(dataGridView1.Rows[i].Cells[7].Value.ToString())));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
除了异常,代码中几乎没有其他问题。但让我们关注您报告的问题。
从代码中了解到,你要显示努力的次数,还要显示努力的总时间。
由于您正在遍历 gridview 的行,因此您可以在 for 循环中计算这两者。
var hardworkCount = 0;
var totalTimeSum = 0.0;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
double totalTime = double.Parse(dataGridView1.Rows[i].Cells[7].Value.ToString());
if(totalTime >= HardWorkThreshold)
{
hardworkCount++;
}
totalTimeSum += totalTime;
}
lbHardwork.Text = hardworkCount.ToString();
lbTotaltime.Text = totalTimeSum.ToString();
如果您不再将数据从 datagridview 中提取出来,而是让您的 datagridview 基于保存数据的数据表,您的生活将会简单得多。可能已经是这样了,但是我们看不到你的 filldatagridview
方法的定义
这是我的做法:
//assuming sql sevrer, use correct dataadapter for your db
using(var da = new SqlDataAdapter "select * from tbl_WorkLoad where TimeComplete Between @a and @b", "YOUR CONNECTION STRING HERE")){
da.SelectedCommand.Parameters.AddWithValue("@a", dateTimePicker1.Value);
da.SelectedCommand.Parameters.AddWithValue("@b", dateTimePicker2.Value);
var dt = new DataTable();
da.Fill(dt);
dataGridViewX.DataSource = dt;
lbHardwork.Text = dt.Compute("Count([TotalTime])", "[TotalTime] >= 30").ToString();
lbTotalTime.Text = dt.Compute("Sum([TotalTime])", "[TotalTime] >= 30").ToString();
}
您编写 SQL 的方式是一种模式,如果与字符串一起使用,则存在 SQL 注入风险 - 始终在 SQL 中使用参数。总是。在处理数据值时,没有理由不这样做。 See why, and also here
在 SQL 服务器中对字符串使用 AddWithValue 之前,您应该阅读 this blog。有比 AWV 更好的方法来处理参数,但至少使用 AddWithValue 比你现在正在做的更好
不要通过网格访问网格视图中的数据;将网格绑定到数据表,如果需要数据,请访问数据表。如果你想在任何时候从网格中获取数据表,你可以使用 var dt = datagridviewX.DataSource as DataTable