勾选复选框时如何在DataGridView中执行计算C#

Posted

技术标签:

【中文标题】勾选复选框时如何在DataGridView中执行计算C#【英文标题】:How to perform calculation in DataGridView when a checkbox is ticked C# 【发布时间】:2015-02-27 15:39:01 【问题描述】:

我在 C# Datagridview 中有这个案例。

我想计算3件平均值,在上面显示的文本框上,只要检查复选框。

我在下面使用这个逻辑:

 private void button1_Click(object sender, EventArgs e)
    


        DataGridView data = this.qualitySetupDataGridView;
        try
        
            int count = 0;
            double Sum = 0;

            for (int k = 0; k < data.Rows.Count - 1; k++)
            

                if (data.Rows[k].Cells[5].Value != null)
                
                    if (Convert.ToBoolean(data.Rows[k].Cells[5].Value) == true)
                    

                        double EndsPerInch = double.Parse(data.Rows[k].Cells[4].Value.ToString());
                        Sum = Sum + EndsPerInch;
                        count++;
                        double Average = Sum / count;
                        textBox1.Text = Convert.ToString(Math.Round(Average, 2));

                    

                

                else
                

                    textBox1.Clear();

                
            
代码运行正常。 但第一次选择单个复选框时,我收到 Invalid Cast Exception 错误。 当第二个复选框被选中时,我再次收到 Invalid Cast Exception Error。 当第三个复选框被选中时,我没有收到 Invalid Cast Exception 错误。

然后程序按预期运行。

这里的问题是为什么一开始就弹出invalid cast exception错误?。

有没有更好的方法来实现这一点?

【问题讨论】:

显然这将有助于 a) 查看 DGV 的相关代码和 b) 了解哪一行给出了无效的强制转换异常 【参考方案1】:

我认为您应该尝试使用更面向对象的逻辑,这样您就可以轻松计算平均值,而无需实际读取网格。

为此,您应该:

1.创建一个包含您的记录的类,如下所示:

public class MyRecord

     public double EndsPerInch  get; set; 
     public bool Checked  get; set; 
     //...and other properties I can't see from your screenshot

2.实例化 MyRecords 列表,即您将在网格中显示的记录列表:

List<MyRecord> MyRecords = new List<MyRecord>();

3.创建一个方法,用您的数据填充您的记录列表并将其绑定到您的数据网格视图中

private void LoadGrid()

    //Creating the list of records
    MyRecords.Add(new MyRecord  Checked = false, EndsPerInch = 92);
    MyRecords.Add(new MyRecord  Checked = false, EndsPerInch = 56 );
    MyRecords.Add(new MyRecord  Checked = false, EndsPerInch = 100 );

    //Binding the list of records to the datagridview
    //By doing so, a checkbox column will automatically be generated and bound
    //to the "Checked" property of your class
    dataGridView1.DataSource = MyRecords;

现在您已经拥有了可以正确绑定数据的一切。每次用户检查“已检查”列中的值时,对象记录的属性也将被更新。 从这里开始,通过从您的记录集合中选择检查值来计算平均值变得非常容易:

private double CalculateAverage(List<MyRecord> MyRecords)

    double Sum = 0;

    //Getting the list of checked records and calculating sum
    List<MyRecord> Checked = MyRecords.Where(x => x.Checked).ToList();
    foreach (MyRecord mr in Checked)
        Sum += mr.EndsPerInch;

    //Calculating and returning average
    return Sum / Checked.Count;

【讨论】:

以上是关于勾选复选框时如何在DataGridView中执行计算C#的主要内容,如果未能解决你的问题,请参考以下文章

winform中datagridview 中的复选框 默认不选中的问题

DataGridView 和复选框自动重新选择

如何隐藏datagridview中的特定复选框单元格

如何检测 DataGridView CheckBox 事件变化?

winform中获取datagridview如何获取选中的行,返回值object

datagridview如何分页