Dev用于界面按选中列进行分组统计数据源(实用技巧)
如果有用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用于界面按选中列进行分组统计数据源(实用技巧)的更多相关文章
- R语言-分组统计
分组统计 1.假定有一组成绩数据,要求根据性别进行分组统计: > score ID score1 score2 Gender1 101 11.35321 0.9 male2 ...
- R中利用apply、tapply、lapply、sapply、mapply、table等函数进行分组统计
apply函数(对一个数组按行或者按列进行计算): 使用格式为: apply(X, MARGIN, FUN, ...) 其中X为一个数组:MARGIN为一个向量(表示要将函数FUN应用到X的行还是列) ...
- Shell学习笔记:awk实现group by分组统计功能
日常部分数据以 txt 的文件格式提供,为避免入库之后再进行统计的麻烦,故学习 shell 进行处理,减少工作量. 1.样例数据 # test.txt YD5Gxxx|6618151|68254490 ...
- DEV的GridControl控件的选中列属性设置高光
设置Run Designer=>Views=> OptionsSelection下面的: EnableAppearanceFocusedCell = False,//鼠标移开,失去焦点,仍 ...
- 对Dev的GridControl/GridView控件进行分组并展开操作
今天在模块编写中碰到了对表格的分组,特意在这里把它记录下来. 一.背景:Dev14.1.3,GridControl,.NET4.0+C# 二.过程 1.GridControl设计 一共添加4列:在下面 ...
- 前端表格选中列合计,select-chosen,set集合,display隐藏
业务涉及到table选中列合计,同时隐藏未选中列.为了减少后端请求数据,前端获得所有数据后筛选计算. 1.select下拉框初始化 $(function() { $('.chosen-select') ...
- [Easyui - Grid]为easyui的datagrid、treegrid增加表头菜单,用于显示或隐藏列
为easyui的datagrid.treegrid增加表头菜单,用于显示或隐藏列 /** * @author 孙宇 * * @requires jQuery,EasyUI * * 为datagrid. ...
- SQL 分组统计 行转列 CASE WHEN 的使用
原文地址:http://blog.itpub.net/26451903/viewspace-733526 原文在分组统计部分 sql是有问题的 本文已将sql改正 已用红色标记 Cas ...
- 常用sql:按照表中的某一列对数据进行分组,统计数据条数
select FROM_UNIXTIME(start_time,'%Y-%m-%d')as date,COUNT(*) FROM random_num GROUP BY FROM_UNIXTIME(s ...
随机推荐
- MySQL字段数据类型表
* MySQL支持所有标准SQL数值数据类型. 数值类型BIT数据类型保存位字段值,并且支持MyISAM.MEMORY.InnoDB和BDB表.作为SQL标准的扩展,MySQL也支持整数类型TINYI ...
- POJ 1637 Sightseeing tour(混合图的欧拉回路)
题目链接 建个图,套个模板. #include <cstdio> #include <cstring> #include <iostream> #include & ...
- MVC入口程序 | 简单调用及实例化
入口程序: 现在大多采用单一入口机制,单一入口就是指在一个web应用程序中,所有的请求都指向一个脚本文件.通俗点说就是一幢大楼只有一个大门入口可以进去... 目录: 建立一个控制器/模型/视图调用函数 ...
- Servlet读取资源文件(文件的下载)
1. 文件名非中文: package ztq.servlet.study; import java.io.FileInputStream; import java.io.IOException; im ...
- bzoj1720: [Usaco2006 Jan]Corral the Cows 奶牛围栏
金组题什么的都要绕个弯才能AC..不想银组套模板= = 题目大意:给n个点,求最小边长使得此正方形内的点数不少于c个 首先一看题就知道要二分边长len 本来打算用二维前缀和来判断,显然时间会爆,而且坐 ...
- 局域网内利用gitlab,jenkins自动生成gitbook并发布(nginx)
安装了GitBook,内网使用,没法用上gitbook的网页. 用gitbook serve只能展示一本书,而且也不利于长期维护. 于是使用gitlab,jenkins,和nginx配合gitbook ...
- 那些年一起用过的iOS开发利器之Code Pilot
本系列所有工具的简介见:http://www.cnblogs.com/lloydsheng/p/3637606.html 什么是Code Pilot? Code Pilot是一个Xcode的扩充套件, ...
- C++11新特性——初始化列表 initializer_list
破事水: 由于最近数据结构有个实验报告说是要对字符串进行排序,想偷个懒不想一个一个地赋值,虽然可以用strcpy和传入二级指针的形式直接写,但是这样感觉不美观漂亮. 然后就去膜了一下C++11的新特性 ...
- 【偶像大师 白金星光】的【Variable Tone】技术大公开!偶像从哪里看都那么可爱,VA小组谈制作方针
http://game.watch.impress.co.jp/docs/news/1016369.html 自从街机版的运营依赖,今年迎来了[偶像大师]系列的11周年.在CEDEC ...
- session过期时间
在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户没有使用系统一定时间后,自动退出登录,销毁session. 具体设置很简单: 在主页面或者公共页面中加入:session.set ...