创建一个具有sum属性的自定义Datagridview [英] Create A Custom Datagridview with sum property

查看:97
本文介绍了创建一个具有sum属性的自定义Datagridview的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨 我想在C#中创建一个具有自定义属性的自定义datagridview,该属性显示特定列的总和,我该怎么做?

解决方案

您可以创建一个从DataGridView和自定义实现派生的新类.我已经敲了下面的例子.这将合计命名列,并引发一个包含新值的事件,该新总和包含该值.该值也可以从公共财产获得.

您可能需要对此进行改进,例如总和的只读属性,更好的错误处理等.这只是一个粗略的原型!


(我认为最好用DGV进行这种累加,并处理其事件以自己从表格等中进行计算,然后将DGV保留为标准).



这是新的自定义datagridview的CLASS

 使用系统;
使用 System.Collections.Generic;
使用 System.Linq;
使用 System.Text;
使用使用System.Windows.Forms;

命名空间 WindowsFormsApplication1
{
     class  CustomDataGridView:DataGridView
    {
        公共 布尔值 EnableColumnSumming { get ; 设置; }
        公共 字符串 ColumnNameToSum { get ; 设置; }
        公共  ColumnSum { get ; 设置; }

        公共 委托  void  ColumnSumChangedHandler(对象 o,ColumnSumChangedEventArgs e);
        公共 事件 ColumnSumChangedHandler ColumnSumChanged;

        // 事件处理程序事件Args 
        公共  ColumnSumChangedEventArgs:EventArgs
        {
             public  只读  double  TheSum;

            公共 ColumnSumChangedEventArgs( sum)
            {
                TheSum =总和;
            }
        }

        // 使用基类已更改的单元格触发列计算
        受保护的 覆盖  void  OnCellValueChanged(DataGridViewCellEventArgs e)
        {
             .OnCellValueChanged(e);
            doCellSumming();
        }

        私有 无效 doCellSumming()
        {
            // 已启用检查汇总,并且实际存在列名
            如果(EnableColumnSumming&&  base  .Columns.Contains(ColumnNameToSum))
            {
                 Double  total =  0 ;
                 foreach (DataGridViewRow行 in 中的行 base .行)
                {
                     double   =  0 ;
                    尝试
                    {
                        // 尝试将单元格值转换为双精度值
                         =  Double  .Parse(row.Cells [ColumnNameToSum] .FormattedValue.ToString());
                    }
                    捕获(异常)
                    {
                        // 无法转换单元格,类型无效,因此请将单元格值设置为0; 
                         =  0 ;

                    }
                    总数=总数+ ;
                }
                // 更新列总数
                ColumnSum =总计;
                // 引发ColumnSum更改事件
                ColumnSumChanged( ColumnSumChangedEventArgs(ColumnSum));

            }
            其他
            {
                // 未禁用任何有效单元格或求和
                ColumnSum =  0 ;
                ColumnSumChanged( ColumnSumChangedEventArgs(ColumnSum));
            }
        }

    }
} 




在空的Windows窗体应用程序上,您可以执行以下操作;

 使用系统;
使用 System.Collections.Generic;
使用 System.ComponentModel;
使用 System.Data;
使用使用System.Drawing;
使用 System.Linq;
使用 System.Text;
使用使用System.Windows.Forms;

命名空间 WindowsFormsApplication1
{
    公共 部分  class  Form1:表单
    {
        CustomDataGridView dgv =  CustomDataGridView();
        标签label1 =  Label();

        公共 Form1()
        {
            InitializeComponent();

            dgv.Top =  10 ;
            dgv.Left =  10 ;
            dgv.Height =  250 ;
            dgv.Width =  250 ;
            dgv.ColumnHeadersVisible =  true ;
            dgv.ColumnCount =  2 ;
            dgv.Columns [ 0 ].Name = " ;
            dgv.Columns [ 1 ].Name = " ;

            dgv.ColumnNameToSum = " ;
            dgv.EnableColumnSumming =  true ;

            Controls.Add(dgv);

            // 显示列总和的标签
            label1.Top =  10 ;
            label1.Left =  270 ;
            label1.Width =  50 ;
            label1.Text = " ;
            Controls.Add(label1);


            dgv.ColumnSumChanged + =  CustomDataGridView.ColumnSumChangedHandler(dgv_ColumnSumChanged);
        }

        无效 dgv_ColumnSumChanged(对象 o,CustomDataGridView.ColumnSumChangedEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("  + e.TheSum.ToString ());
            label1.Text = e.TheSum.ToString();
            
        }
    }
} 


1.创建从DataGridView
继承的UserControl

 公共 部分  class  DataGridViewWithSum:DataGridView
{
} 


2.将所需的功能添加到新创建的UserControl

 公共 部分  class  DataGridViewWithSum:DataGridView
{
     公共 十进制 SumOf(字符串 column_name)
     {
          // 添加代码以对指定列中的值求和
     }
} 


hi i want to create a custom datagridview in c# that have a custom property that shows the sum of the specific column , how can i do that?

解决方案

You could create a new class that derives from DataGridView and and the custom implementation. I have knocked up the example below. This will total up the named column and raise an event with the new sum which contain the value. The value is also available from a public property.

You would probably want to improve on this though, e.g. read only property for the sum, better error handling etc. etc. This is only a rough proto!


(I think it would be better to do this totalisation outwith the DGV, and handle its events to do the calc yourself from your form etc. and leave the DGV as standard)



Here is the CLASS for the new custom datagridview

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    class CustomDataGridView : DataGridView
    {
        public Boolean  EnableColumnSumming { get; set; }
        public String ColumnNameToSum { get; set; }
        public Double ColumnSum { get; set; }

        public delegate void ColumnSumChangedHandler(object o, ColumnSumChangedEventArgs e);
        public event ColumnSumChangedHandler ColumnSumChanged;

        //Event Handler Event Args
        public class ColumnSumChangedEventArgs : EventArgs
        {
            public readonly double TheSum;

            public ColumnSumChangedEventArgs(double sum)
            {
                TheSum = sum;
            }
        }

        //Use the base class Cell Changed to Trigger a Column calculation
        protected override void OnCellValueChanged(DataGridViewCellEventArgs e)
        {
            base.OnCellValueChanged(e);
            doCellSumming();
        }

        private void doCellSumming()
        {
            //Check summing enabled and Column Name actually Exists
            if (EnableColumnSumming && base.Columns.Contains(ColumnNameToSum))
            {
                Double total = 0;
                foreach (DataGridViewRow row in base.Rows)
                {
                    double value = 0;
                    try
                    {
                        //Try and convert the cell value to a double
                        value = Double.Parse(row.Cells[ColumnNameToSum].FormattedValue.ToString());
                    }
                    catch (Exception)
                    {
                        //Unable to convert cell, invalid type so set cell value to 0;
                        value = 0;

                    }
                    total = total + value;
                }
                //update the column total
                ColumnSum = total;
                //Raise the ColumnSum Changed Event
                ColumnSumChanged(this,new ColumnSumChangedEventArgs(ColumnSum));

            }
            else
            {
                //No valid cells or summing disabled
                ColumnSum = 0;
                ColumnSumChanged(this, new ColumnSumChangedEventArgs(ColumnSum));
            }
        }

    }
}




On a empty windows form app you could then do the following;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        CustomDataGridView dgv = new CustomDataGridView();
        Label label1 = new Label();

        public Form1()
        {
            InitializeComponent();

            dgv.Top = 10;
            dgv.Left = 10;
            dgv.Height = 250;
            dgv.Width = 250;
            dgv.ColumnHeadersVisible = true;
            dgv.ColumnCount = 2;
            dgv.Columns[0].Name = "Name";
            dgv.Columns[1].Name = "Amount";

            dgv.ColumnNameToSum = "Amount";
            dgv.EnableColumnSumming = true;

            Controls.Add(dgv);

            //Label to Show column sum
            label1.Top = 10;
            label1.Left = 270;
            label1.Width = 50;
            label1.Text = "0";
            Controls.Add(label1);


            dgv.ColumnSumChanged += new CustomDataGridView.ColumnSumChangedHandler(dgv_ColumnSumChanged);
        }

        void dgv_ColumnSumChanged(object o, CustomDataGridView.ColumnSumChangedEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("The New Column Sum is:" + e.TheSum.ToString());
            label1.Text = e.TheSum.ToString();
            
        }
    }
}


1. Create a UserControl that inherits from DataGridView

public partial class DataGridViewWithSum : DataGridView
{
}


2. Add the desired function to your newly created UserControl

public partial class DataGridViewWithSum : DataGridView
{
     public decimal SumOf ( string column_name )
     {
          // add code to sum values in specified column
     }
}


这篇关于创建一个具有sum属性的自定义Datagridview的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆