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 ...
随机推荐
- [NOIP2011]聪明的质监员 题解
题目大意: 额--貌似蛮清晰的,就不赘述了. 思路: 首先不难发现M越大Y越小,因此可以二分答案(方向不要弄错),二分出最小的不小于S的Y即可.而计算Y时可用前缀和O(n+m)求得.两种边界情况也要考 ...
- 【BZOJ3282】Tree LCT
1A爽,感觉又对指针重怀信心了呢= =,模板题,注意单点修改时splay就好,其实按吾本意是没写的也A了,不过应该加上能更好维护平衡性. ..还是得加上好= = #include <iostre ...
- 转OSGchina中,array老大的名词解释
转OSGchina中,array老大的名词解释 转自:http://ydwcowboy.blog.163.com/blog/static/25849015200983518395/ osg:: Cle ...
- google jquery用不了啦,你准备好了吗
今天,相信很多网站开发人员都有这感觉,明明正常的页面却无法工作了,莫名其妙的错误,笔者也遇到这种错误,细查之下才发现google jquery用不了啦,通过firefox调试发现找不到jquery了, ...
- day1 初识Linux
linux 基础 1.Linux简介1) 掌握Linux的定义:Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统. ...
- HDU1671 字典树
Phone List Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- C++实现vector
用了双向链表,快排,<<,=,[]重载,还有erase的实现比较好玩 //my Vecter ;T need "operator<" #include <i ...
- VMware与virtualbox安装centos7连接网络不可达问题解决笔记(连接网络)
我最初是安装vmware遇到访问不到网络,按网上的配置方法都不能解决.然后我感觉可能跟系统有关,我装的是centos,然后我试着在virtualbox上安装看遇到什么问题. 用virtualbox安装 ...
- 那些年一起用过的iOS开发利器之Parse
阅读此文章需要对Objective-C和iOS有一定的了解,完全没有基础的朋友请先阅读<让不懂编程的人爱上iPhone开发>系列教程. 什么是后台服务(back-end service)? ...
- Android课程---关于数据存储的学习(2)
手机外部存储的学习 activity_data2.xml <?xml version="1.0" encoding="utf-8"?> <Li ...