用扩展方法实现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 自带的进度条控件. 但是我要用一个方法来设置所以的单元格进度,而不是每个单元格都要设置一遍,同时我想要根据进度值不同,进度条显示不同的颜色. ...
随机推荐
- php file取重复
function FetchRepeatMemberInArray($array) { // 获取去掉重复数据的数组 $unique_arr = array_unique ( $array ); // ...
- git变基--rebase
变基过程: 两个分支 先考虑不用变基的合并: $ git checkout master $ git merge experiment 合并后: 如果变基:(以下为变基过程) $ git checko ...
- hdu_5777_domino(贪心)
题目链接:hdu_5777_domino 题意: 小白在玩一个游戏.桌子上有n张多米诺骨牌排成一列.它有k次机会,每次可以选一个还没有倒的骨牌,向左或者向右推倒.每个骨 牌倒下的时候,若碰到了未倒下的 ...
- hdu_3565_Bi-peak Number(数位DP)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3565 题意:给你一个区间,让你找这个区间内有两个山峰的数的最大和,什么是两个山峰,比如121121 ...
- uva 156 (map)
暑假培训习题 1.用vector<string>储存string类型的输入单词: 2.将vector中的元素逐一标准化后映射进map中,并给map值加一: 3.新建一个空的vector 4 ...
- HTML5的自定义属性data-*详细介绍和JS操作实例
当然高级浏览器下可通过脚本进行定义和数据存取.在项目实践中非常有用. 例如: 复制代码 代码如下: <div id = "user" data-uid = "123 ...
- ios中的关键词@property @synthesize
@interface Person : NSObject{ int myNumber;} @property(nonatomic) int myNumber;//这个关键字是可以带套get 与s ...
- Django 用户认证及OneToOneField
Django 用户认证如果自己不想写 就可以用django自带的认证 首选导入模块 models.py #!/usr/bin/env python #_*_ coding:utf8 _*_ from ...
- Django 分页功能
Django 分页功能比较强大,这边是结合官网的内容写的可以参考 https://docs.djangoproject.com/en/1.9/topics/pagination/ 分页命令行练习案列 ...
- MyBatis-xml配置SQL文件中,传入List数组、基本类型String、int……、与自定义类型的方法
//基本类型 @Override public String queryItemNumber(String packId) throws Exception { // TODO Auto-genera ...