用扩展方法实现DevExpress-GridControl级联效果
首先,让我们先回顾下.Net中扩展方法的特征:
1、 必须在一个非嵌套、非泛型的静态类中;
2、 至少有一个参数(this 作前缀的参数);
3、 第一个参数必须附加this做前缀;
4、 第一个参数不能加任何修饰符(如out或ref);
5、 第一个参数的类型不能是指针类型。
在DevExpress控件中GridControl是非常常用的控件之一,有时后为更好的展示效果而使用级联功能。在通常情况下为实现这种功能需要在一个实体类中建立令一个实体类的集合(该集合以备级联下的GridView使用),这样实行增加类实体类的复杂程度,且在项目比较大的情况下这种模式更降低了程序的可读性与可维护性,在此写了GridControl的扩展类,使整个项目都可以按照统一的模式建立GridControl的级联效果,且简化了实体类。
方法如下:
首先,建立GridControl,并对GridView的列绑定好相应的字段名称,在这就不细说啦。

其次,建立扩展类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Views.Grid; namespace DXApplication3
{
public static class GridViewMasterExtenstion
{
static Dictionary<int, IEnumerable<string>> _relationNames;
static Dictionary<int, Action<GridView, MasterRowGetRelationNameEventArgs>> _displayCaptions;
static Dictionary<int, Action<GridView, MasterRowGetChildListEventArgs>> _childLists; static GridViewMasterDetailExtenstion()
{
_relationNames = new Dictionary<int, IEnumerable<string>>();
_displayCaptions = new Dictionary<int, Action<GridView, MasterRowGetRelationNameEventArgs>>();
_childLists = new Dictionary<int, Action<GridView, MasterRowGetChildListEventArgs>>();
} public static void MasterDetails(this GridView gridView,
string relationName,
Action<GridView, MasterRowGetChildListEventArgs> childLists)
{
MasterDetails(gridView, new[] { relationName }, null, childLists);
} public static void MasterDetails(this GridView gridView,
IEnumerable<string> relationNames,
Action<GridView, MasterRowGetChildListEventArgs> childLists)
{
MasterDetails(gridView, relationNames, null, childLists);
} public static void MasterDetails(this GridView gridView,
IEnumerable<string> relationNames,
Action<GridView, MasterRowGetRelationNameEventArgs> displayCaptions,
Action<GridView, MasterRowGetChildListEventArgs> childLists)
{
if (relationNames == null)
{
throw new ArgumentNullException("relationNames can not be null.");
} _relationNames[gridView.GetHashCode()] = relationNames; if (displayCaptions != null)
_displayCaptions[gridView.GetHashCode()] = displayCaptions; _childLists[gridView.GetHashCode()] = childLists; gridView.MasterRowEmpty += GridView_MasterRowEmpty;
gridView.MasterRowGetChildList += GridView_MasterRowGetChildList;
gridView.MasterRowGetRelationName += GridView_MasterRowGetRelationName;
gridView.MasterRowGetRelationCount += GridView_MasterRowGetRelationCount;
gridView.MasterRowGetRelationDisplayCaption += GridView_MasterRowGetRelationDisplayCaption;
} private static void GridView_MasterRowEmpty(object sender, MasterRowEmptyEventArgs e)
{
if (e.RowHandle == GridControl.InvalidRowHandle)
return; e.IsEmpty = false;
} private static void GridView_MasterRowGetChildList(object sender, MasterRowGetChildListEventArgs e)
{
if (e.RowHandle == GridControl.InvalidRowHandle)
return; var key = GetGridViewHashCode(sender as GridView);
if (_childLists.ContainsKey(key))
{
var childList = _childLists[key];
childList(sender as GridView, e);
}
} private static void GridView_MasterRowGetRelationCount(object sender, MasterRowGetRelationCountEventArgs e)
{ var key = GetGridViewHashCode(sender as GridView);
if (_relationNames.ContainsKey(key))
e.RelationCount = _relationNames[key].Count();
else
e.RelationCount = ;
} private static void GridView_MasterRowGetRelationName(object sender, MasterRowGetRelationNameEventArgs e)
{
if (e.RowHandle == GridControl.InvalidRowHandle)
return; var key = GetGridViewHashCode(sender as GridView);
if (_relationNames.ContainsKey(key))
{
e.RelationName = _relationNames[key].Skip(e.RelationIndex).FirstOrDefault();
}
} private static void GridView_MasterRowGetRelationDisplayCaption(object sender, MasterRowGetRelationNameEventArgs e)
{
if (e.RowHandle == GridControl.InvalidRowHandle)
return; var key = GetGridViewHashCode(sender as GridView);
if (_displayCaptions.ContainsKey(key))
{
var displayCaptions = _displayCaptions[key];
displayCaptions(sender as GridView, e);
} } private static int GetGridViewHashCode(GridView gridView)
{
if (gridView.SourceView == null)
return gridView.GetHashCode();
else
return gridView.SourceView.GetHashCode();
}
}
}
最后,举例,在程序中调用:
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 DXApplication3
{
public partial class Form1 : DevExpress.XtraEditors.XtraForm
{
public Form1()
{
InitializeComponent();
this.CreateList();
gridControl1.DataSource = lstPerson;
//调用模式如下,“Level1”对应Level的名称
gridView1.MasterDetails("Level1", (gridView2, a) =>
{
Person item = gridView1.GetRow(gridView1.FocusedRowHandle) as Person;
List<Company> lstCompany = new List<Company>();
for (int i = ; i < ; i++)
{
Company com = new Company();
com.Name = "A" + i;
com.Sale = (i * ).ToString();
lstCompany.Add(com);
}
a.ChildList = lstCompany;
});
gridControl1.RefreshDataSource();
} List<Person> lstPerson = new List<Person>();
public void CreateList() {
Person p1 = new Person();
p1.Name = "A";
p1.Address = "中国";
p1.Age = "";
Person p2 = new Person();
p2.Name = "B";
p2.Address = "美国";
p2.Age = "";
lstPerson.Add(p1);
lstPerson.Add(p2);
}
}
public class Person
{
public string Name
{
set;
get;
}
public string Age
{
set;
get;
}
public string Address
{
set;
get;
}
}
public class Company
{
public string Name
{
set;
get;
}
public string Sale
{
set;
get;
}
}
}
用扩展方法实现DevExpress-GridControl级联效果的更多相关文章
- 扩展方法实现DevExpress控件校验
		
DevExpress控件中,如果要控件的值进行校验,需要用到DXValidationProvider控件和DXErrorProvider控件,按照正常思路,无论使用哪个控件要实现校验效果时都需要对每个 ...
 - 【细语】C#之扩展方法原理及其使用
		
1.写在前面 今天群里一个小伙伴问了这样一个问题,扩展方法与实例方法的执行顺序是什么样子的,谁先谁后(这个问题会在文章结尾回答).所以写了这边文章,力图从原理角度解释扩展方法及其使用. 以下为主要内容 ...
 - DevExpress GridControl使用方法
		
一.如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 二.如何新增一条记录 (1).gridView.AddN ...
 - DevExpress GridControl 使用方法技巧 总结 收录整理
		
一.如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 二.如何新增一条记录 ().gridView.AddNe ...
 - C# DevExpress GridControl使用方法
		
一.如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 二.如何新增一条记录 ().gridView.AddNe ...
 - [转载]DevExpress GridControl 使用方法技巧 总结 收录整理
		
最近开始用DevExpress组件,发现很好的经验总结博客,在这里转载分享 原作者:https://www.cnblogs.com/wordgao/p/4517011.html 一.如何解决单击记录整 ...
 - DevExpress GridControl使用(转)
		
DevExpress GridControl使用 (一)原汁原味的表格展示 Dev控件中的表格控件GridControl控件非常强大.不过,一些细枝末节的地方有时候用起来不好找挺讨厌的.使用过程中,多 ...
 - Devexpress GridControl  z
		
http://minmin86121.blog.163.com/blog/static/4968115720144194923578/ 1 AllowNullInput=False; --Devexp ...
 - DevExpress GridControl 单元格添加进度条(ProgressBar)
		
首先可以使用DevExpress GridControl 自带的进度条控件. 但是我要用一个方法来设置所以的单元格进度,而不是每个单元格都要设置一遍,同时我想要根据进度值不同,进度条显示不同的颜色. ...
 
随机推荐
- hdu_5274_Dylans loves tree(树剖)
			
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5274 题意:给一棵树和叶子的值,然后有单点修改操作和询问区间操作,询问的是每一个值出现的奇偶次数,如果 ...
 - LeetCode OJ 107. Binary Tree Level Order Traversal II
			
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...
 - 15分钟快速开发一个kissy组件(流程篇)
			
Step1: 安装kissy gallery组件工具 npm install yo grunt-cli -g npm install generator-kissy-gallery -g 请确保本地带 ...
 - window.open页面关闭后刷新父页面
			
如题 function openWin(url,text,winInfo){ var winObj = window.open(url,text,winInfo); var loop = setInt ...
 - Windows 系统变量大全
			
来源:http://blog.csdn.net/kingwolf_javascript/article/details/2477234 %ALLUSERSPROFILE% : 列出所有用户Profil ...
 - maven source
			
accepted To download sources for your dependencies: mvn eclipse:eclipse -DdownloadSources=true To at ...
 - SQL Server 2008删除或压缩数据库日志的方法
			
SQL Server 2008删除或压缩数据库日志的方法 2010-09-20 20:15 由 于数据库日志增长被设置为“无限制”,所以时间一长日志文件必然会很大,一个400G的数据库居然有600G的 ...
 - Application的多种值判断测试程序
			
Application.Contents.Remove("FriendLink") Response.Write("Application.Contents.Remove ...
 - Automatic Trading
			
Automatic Trading A brokerage firm is interested in detecting automatic trading. They believe that a ...
 - Tree Restoring
			
Tree Restoring Time limit : 2sec / Memory limit : 256MB Score : 700 points Problem Statement Aoki lo ...