如果有用U8的可以明白这个功能就是模仿他的统计功能。我不过是把他造成通用的与适应于DEV的。

(效率为6000条数据分组统计时间为3秒左右分组列过多5秒。1000条以下0.几秒,500条下0.00几秒)

前置准备 需求DevExpress.XtraGrid.Views.Grid.GridView 一个grid数据源。原生为DataGridView 。Dev重写为gridview

由于Dev的绑定entity与datatable绑定上去Gridview类型会不一致。前者导致gridview.GetDataRow()为null。后者又不能进行反射获取值

我本来想按步骤贴代码的。但是考虑到现在的程序员大多都是拿来主义。一点改动后就不能愉快的玩耍了。所以还是简洁的上代码

form1 主要是为了进行gridview列头按可sum的类型与可分组的类型进行区分展示。目的为了获取到用户自定义筛选的列。

 public partial class Form1 : Dnf.BaseObject.XtraForm.BaseForm
{
public DevExpress.XtraGrid.Views.Grid.GridView dgw1 { get; set; } public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
List<ColumnPropers> cpFZ = new List<ColumnPropers>();
List<ColumnPropers> cpSum = new List<ColumnPropers>();
if (dgw1.RowCount > )
{
DataRow GridDataRow = dgw1.GetDataRow();
if (GridDataRow == null)
{
var a = dgw1.GetRow();
}
foreach (GridColumn dc in dgw1.Columns)
{
if (!string.IsNullOrEmpty(dc.Caption))
{
if (dc.ColumnType.FullName.Contains("System.Decimal")) { cpSum.Add(new ColumnPropers() { IsSelect = true, ColumnName = dc.Caption, ColumnFieldName = dc.FieldName }); }
else if (dc.ColumnType.FullName.Contains("System.Int")) { cpSum.Add(new ColumnPropers() { IsSelect = true, ColumnName = dc.Caption, ColumnFieldName = dc.FieldName }); }
else if (dc.ColumnType.FullName.Contains("System.Double")) { cpSum.Add(new ColumnPropers() { IsSelect = true, ColumnName = dc.Caption, ColumnFieldName = dc.FieldName }); }
else { cpFZ.Add(new ColumnPropers() { IsSelect = false, ColumnName = dc.Caption, ColumnFieldName = dc.FieldName }); }
}
}
//foreach (PropertyInfo pi in GridDataRow.GetType().GetProperties())
//{ // if (pi == null) continue;
// if (pi.CanWrite == false) continue;
// decimal dc = 0.00m;
// if (pi.GetValue(GridDataRow, null) != null)
// if (decimal.TryParse(pi.GetValue(GridDataRow, null).ToString(), out dc)) { cpSum.Add(new ColumnPropers() { IsSelect = true, ColumnName = pi.Name }); }
// else { cpFZ.Add(new ColumnPropers() { IsSelect = false, ColumnName = pi.Name }); }
//}
}
gridControl1.DataSource = cpFZ;
gridControl2.DataSource = cpSum; } private void button1_Click(object sender, EventArgs e)
{
DataRow GridDataRow = gridView1.GetDataRow();
Dictionary<string, string> dic = new Dictionary<string, string>();
Dictionary<string, string> dicPX = new Dictionary<string, string>();
Dictionary<string, string> dicSum = new Dictionary<string, string>();
bool ischeck = false;
if (GridDataRow == null)
{
for (int i = ; i < gridView1.RowCount; i++)
{
var a = gridView1.GetRow(i);
string ColumnName = "";
string ColumnFieldName = "";
foreach (PropertyInfo pi in a.GetType().GetProperties())
{
if (pi == null) continue;
if (pi.CanWrite == false) continue;
if (pi.GetValue(a, null) == null) continue;
if (string.IsNullOrEmpty(pi.GetValue(a, null).ToString())) { break; }
if (pi.Name == "IsSelect") { if (bool.TryParse(pi.GetValue(a, null).ToString(), out ischeck)) { if (!ischeck) { break; } } else { break; } }
else if (pi.Name == "ColumnName")
{
ColumnName = pi.GetValue(a, null).ToString();
}
else if (pi.Name == "ColumnFieldName")
{
ColumnFieldName = pi.GetValue(a, null).ToString(); }
}
if (!string.IsNullOrEmpty(ColumnFieldName))
{
dic[ColumnFieldName] = ColumnName;
dicPX[ColumnFieldName] = ColumnName;
}
}
for (int i = ; i < gridView2.RowCount; i++)
{
var a = gridView2.GetRow(i);
string ColumnName = "";
string ColumnFieldName = "";
foreach (PropertyInfo pi in a.GetType().GetProperties())
{
if (pi == null) continue;
if (pi.CanWrite == false) continue;
if (pi.GetValue(a, null) == null) continue;
if (string.IsNullOrEmpty(pi.GetValue(a, null).ToString())) { break; }
if (pi.Name == "IsSelect") { if (bool.TryParse(pi.GetValue(a, null).ToString(), out ischeck)) { if (!ischeck) { break; } } else { break; } }
else if (pi.Name == "ColumnName")
{
ColumnName = pi.GetValue(a, null).ToString();
}
else if (pi.Name == "ColumnFieldName")
{
ColumnFieldName = pi.GetValue(a, null).ToString();
}
}
if (!string.IsNullOrEmpty(ColumnFieldName))
{
dic[ColumnFieldName] = ColumnName;
dicSum[ColumnFieldName] = ColumnName;
}
}
}
else
{
for (int i = ; i < gridView1.RowCount; i++)
{
DataRow GridDataRow1 = gridView1.GetDataRow(i);
if (bool.TryParse(GridDataRow1["IsSelect"].ToString(), out ischeck))
{
if (ischeck)
{
if (!string.IsNullOrEmpty(GridDataRow1["ColumnFieldName"].ToString()))
{
dic[GridDataRow1["ColumnFieldName"].ToString()] = GridDataRow1["ColumnName"].ToString();
dicPX[GridDataRow1["ColumnFieldName"].ToString()] = GridDataRow1["ColumnName"].ToString();
}
}
}
}
for (int i = ; i < gridView2.RowCount; i++)
{
DataRow GridDataRow1 = gridView2.GetDataRow(i);
if (bool.TryParse(GridDataRow1["IsSelect"].ToString(), out ischeck))
{
if (ischeck)
{
if (!string.IsNullOrEmpty(GridDataRow1["ColumnFieldName"].ToString()))
{
dicSum[GridDataRow1["ColumnFieldName"].ToString()] = GridDataRow1["ColumnName"].ToString();
dic[GridDataRow1["ColumnFieldName"].ToString()] = GridDataRow1["ColumnName"].ToString();
}
}
}
}
}
using (Form2 f2 = new Form2())
{ f2.dgw1 = dgw1;
f2.dic = dic;
f2.dicPX = dicPX;
f2.dicSum = dicSum;
//f2.SumName = sumname.Split('…');
//f2.FieldName1 = pfname.Split('…');
this.Close();
f2.ShowDialog();
} } private void button2_Click(object sender, EventArgs e)
{
TTTTT();
this.Close();
} } public class ColumnPropers
{
public bool IsSelect { get; set; }
public string ColumnName { get; set; }
public string ColumnFieldName { get; set; }
}

form2就是通过用户自定义筛选的列与用户当前操作的数据源进行分组统计。

  public Form2()
{
InitializeComponent();
}
public DevExpress.XtraGrid.Views.Grid.GridView dgw1 { get; set; }
public string[] FieldName1 { get; set; }
public string[] SumName { get; set; }
/// <summary>
/// 一个key为字段名称,value为中文名称的字典
/// </summary>
public Dictionary<string, string> dic { get; set; }
public Dictionary<string, string> dicPX { get; set; }
public Dictionary<string, string> dicSum { get; set; }
private void Form2_Load(object sender, EventArgs e)
{
System.Diagnostics.Stopwatch stopwatch = new Stopwatch();
stopwatch.Restart();
ToSumColumn(dgw1, FieldName1);
stopwatch.Stop();
Console.WriteLine("TryParse所用时间:" + stopwatch.Elapsed);
MessageBox.Show(stopwatch.Elapsed.TotalSeconds.ToString());
}
/// <summary>
///
/// </summary>
/// <param name="dgw">gridview</param>
/// <param name="FieldName">需展示的表头字段</param>
/// <param name="FieldName">需展示的表头字段</param>
public void ToSumColumn(DevExpress.XtraGrid.Views.Grid.GridView dgw, string[] FieldName)
{ DataGridView dgv = new DataGridView();
DataTable dt = new DataTable();
//构造datatable列头根据字典
foreach (KeyValuePair<string, string> kvp in dic)
{
DataColumn column = new DataColumn();
//column.DataType = ;
column.ColumnName = kvp.Value;
//column.Unique = true;
dt.Columns.Add(column);
} if (dgw.GetDataRow() == null)
{
dt = ReturnDTByGridView(dgw, dt, FieldName);
}
else
{
dt = ReturnDTBySqlGrid(dgw, dt, FieldName);
}
//gridControl2.DataSource = dt;
gridControl1.DataSource = dt;
} public DataTable ReturnDTBySqlGrid(DevExpress.XtraGrid.Views.Grid.GridView dgw, DataTable dt, string[] FieldName)
{
for (int i = ; i < dgw.RowCount; i++)
{
DataRow dr = dt.NewRow();
foreach (KeyValuePair<string, string> kvp in dic)
{
dr[kvp.Value] = dgw.GetDataRow(i)[kvp.Key];
}
bool BtIsHasThisData1 = false;
for (int j = ; j < dt.Rows.Count; j++)
{
var a = dt.Rows[j][];
bool BtIsHasThisData = false;
foreach (KeyValuePair<string, string> kvp in dicPX)
{
if (dt.Rows[j][kvp.Value].ToString() == dr[kvp.Value].ToString())
{
BtIsHasThisData = true;
}
else { BtIsHasThisData = false; break; }
}
if (BtIsHasThisData)
{
foreach (KeyValuePair<string, string> kvp in dicSum)
{
if (!string.IsNullOrEmpty(dr[kvp.Value].ToString()))
{
dt.Rows[j][kvp.Value] = Convert.ToDecimal(dt.Rows[j][kvp.Value]) + Convert.ToDecimal(dr[kvp.Value]);
BtIsHasThisData1 = true;
}
}
}
}
if (!BtIsHasThisData1) { dt.Rows.Add(dr); }
}
return dt;
} /// <summary>
/// 不是datatable类型的gridview转datatable。并且统计
/// </summary>
/// <param name="dgw"></param>
/// <param name="FieldName"></param>
/// <returns></returns>
public DataTable ReturnDTByGridView(DevExpress.XtraGrid.Views.Grid.GridView dgw, DataTable dt, string[] FieldName)
{
//foreach (GridColumn gc in dgw.Columns)
//{
// for (int i = 0; i < FieldName.Count(); i++)
// {
// if (gc.FieldName == FieldName[i])
// {
// DataColumn column = new DataColumn();
// //column.DataType = ;
// column.ColumnName = gc.FieldName;
// //column.Unique = true;
// dt.Columns.Add(column);
// }
// }
//}
for (int i = ; i < dgw.RowCount; i++)
{
var GridDataRow = dgw.GetRow(i);
DataRow dr = dt.NewRow();
bool isToFlase = false;
//循环数据源的列头:进行新DataRow赋值
dr = ReturnDataRowBy(GridDataRow, dt, FieldName);
bool BtIsHasThisData1 = false;
for (int j = ; j < dt.Rows.Count; j++)
{
//var a = dt.Rows[j][0];
bool BtIsHasThisData = false;
foreach (KeyValuePair<string, string> kvp in dicPX)
{
if (dt.Rows[j][kvp.Value].ToString() == dr[kvp.Value].ToString())
{
BtIsHasThisData = true;
}
else { BtIsHasThisData = false; break; }
}
if (BtIsHasThisData)
{
foreach (KeyValuePair<string, string> kvp in dicSum)
{
if (!string.IsNullOrEmpty(dr[kvp.Value].ToString()))
{
dt.Rows[j][kvp.Value] = Convert.ToDecimal(dt.Rows[j][kvp.Value]) + Convert.ToDecimal(dr[kvp.Value]);
BtIsHasThisData1 = true;
}
}
}
}
if (!BtIsHasThisData1) { dt.Rows.Add(dr); }
}
return dt;
}
/// <summary>
/// 实体对象的gridview调用Grid.Rows To DataRow
/// </summary>
/// <param name="GridDataRow">实体对象</param>
/// <param name="dt"></param>
/// <param name="FieldName"></param>
/// <returns></returns>
public DataRow ReturnDataRowBy(object GridDataRow, DataTable dt, string[] FieldName)
{
DataRow dr = dt.NewRow();
foreach (PropertyInfo pi in GridDataRow.GetType().GetProperties())
{
if (pi == null) continue;
if (pi.CanWrite == false) continue;
decimal dc = 0.00m;
foreach (KeyValuePair<string, string> kvp in dic)
{
if (kvp.Key == pi.Name)
{
//var pp1 = pi.GetValue(GridDataRow, null);
if (pi.GetValue(GridDataRow, null) != null)
{
dr[kvp.Value] = pi.GetValue(GridDataRow, null).ToString();
}
}
}
}
return dr;
}

如需要通用版的 请加我Q 236598515

Dev用于界面按选中列进行分组统计数据源(实用技巧)的更多相关文章

  1. R语言-分组统计

    分组统计 1.假定有一组成绩数据,要求根据性别进行分组统计: > score    ID   score1 score2 Gender1  101 11.35321    0.9   male2 ...

  2. R中利用apply、tapply、lapply、sapply、mapply、table等函数进行分组统计

    apply函数(对一个数组按行或者按列进行计算): 使用格式为: apply(X, MARGIN, FUN, ...) 其中X为一个数组:MARGIN为一个向量(表示要将函数FUN应用到X的行还是列) ...

  3. Shell学习笔记:awk实现group by分组统计功能

    日常部分数据以 txt 的文件格式提供,为避免入库之后再进行统计的麻烦,故学习 shell 进行处理,减少工作量. 1.样例数据 # test.txt YD5Gxxx|6618151|68254490 ...

  4. DEV的GridControl控件的选中列属性设置高光

    设置Run Designer=>Views=> OptionsSelection下面的: EnableAppearanceFocusedCell = False,//鼠标移开,失去焦点,仍 ...

  5. 对Dev的GridControl/GridView控件进行分组并展开操作

    今天在模块编写中碰到了对表格的分组,特意在这里把它记录下来. 一.背景:Dev14.1.3,GridControl,.NET4.0+C# 二.过程 1.GridControl设计 一共添加4列:在下面 ...

  6. 前端表格选中列合计,select-chosen,set集合,display隐藏

    业务涉及到table选中列合计,同时隐藏未选中列.为了减少后端请求数据,前端获得所有数据后筛选计算. 1.select下拉框初始化 $(function() { $('.chosen-select') ...

  7. [Easyui - Grid]为easyui的datagrid、treegrid增加表头菜单,用于显示或隐藏列

    为easyui的datagrid.treegrid增加表头菜单,用于显示或隐藏列 /** * @author 孙宇 * * @requires jQuery,EasyUI * * 为datagrid. ...

  8. SQL 分组统计 行转列 CASE WHEN 的使用

    原文地址:http://blog.itpub.net/26451903/viewspace-733526 原文在分组统计部分  sql是有问题的     本文已将sql改正   已用红色标记  Cas ...

  9. 常用sql:按照表中的某一列对数据进行分组,统计数据条数

    select FROM_UNIXTIME(start_time,'%Y-%m-%d')as date,COUNT(*) FROM random_num GROUP BY FROM_UNIXTIME(s ...

随机推荐

  1. Leetcode jump Game

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  2. http协议笔记

    协议:双方/多方共同遵守的一个规范.类比生活中协议 理解: webservice=http协议+xml Rest         =http协议+json 开始,客户端和其他服务器都是没有关系的,比如 ...

  3. sql例子

    select * from plat_material_resource where stl_url LIKE '/data1/upload%' --截取字符串 UPDATE plat_materia ...

  4. hibernate关联关系笔记

    Hibernate关联关系笔记 单向N:1 *  有连接表:在N方使用<join>/<many-to-one>.1方无需配置与之关联的持久化类. *  没有连接表:在N方使用& ...

  5. NFA转DFA - json数字识别

    json的主页上,提供了number类型的符号识别过程,如下: 图片引用:http://www.json.org/json-zh.html 实际上这张图片表示的是一个状态机,只是状态没有标出来.因为这 ...

  6. 【转】WiFi基础知识

    http://blog.csdn.net/myarrow/article/details/7930131 1. IE802.11简介 标准号 IEEE 802.11b IEEE 802.11a IEE ...

  7. js windows.open()模拟POST提交

    function openPostWindow (url,name, data1, data2)        {            var tempForm = document.createE ...

  8. netfiler源代码分析之框架介绍

    netfiler框架是在内核协议栈实现的基础上完成的,在报文从网口接收,路由等方法实现基础上使用NF_HOOK调用相应的钩子来进入netfiler框架的处理,如 ip_rcv之后会调用NF_HOOK( ...

  9. 给Source Insight做个外挂系列之三--构建外挂软件的定制代码框架

    上一篇文章介绍了“TabSiPlus”是如何进行代码注入的,本篇将介绍如何构建一个外挂软件最重要的部分,也就是为其扩展功能的定制代码.本文前面提到过,由于windows进程管理的限制,扩展代码必须以动 ...

  10. GoLang几种读文件方式的比较

    GoLang提供了很多读文件的方式,一般来说常用的有三种.使用Read加上buffer,使用bufio库和ioutil 库. 那他们的效率如何呢?用一个简单的程序来评测一下: package main ...