首先,让我们先回顾下.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级联效果的更多相关文章

  1. 扩展方法实现DevExpress控件校验

    DevExpress控件中,如果要控件的值进行校验,需要用到DXValidationProvider控件和DXErrorProvider控件,按照正常思路,无论使用哪个控件要实现校验效果时都需要对每个 ...

  2. 【细语】C#之扩展方法原理及其使用

    1.写在前面 今天群里一个小伙伴问了这样一个问题,扩展方法与实例方法的执行顺序是什么样子的,谁先谁后(这个问题会在文章结尾回答).所以写了这边文章,力图从原理角度解释扩展方法及其使用. 以下为主要内容 ...

  3. DevExpress GridControl使用方法

    一.如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 二.如何新增一条记录 (1).gridView.AddN ...

  4. DevExpress GridControl 使用方法技巧 总结 收录整理

    一.如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 二.如何新增一条记录 ().gridView.AddNe ...

  5. C# DevExpress GridControl使用方法

    一.如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 二.如何新增一条记录 ().gridView.AddNe ...

  6. [转载]DevExpress GridControl 使用方法技巧 总结 收录整理

    最近开始用DevExpress组件,发现很好的经验总结博客,在这里转载分享 原作者:https://www.cnblogs.com/wordgao/p/4517011.html 一.如何解决单击记录整 ...

  7. DevExpress GridControl使用(转)

    DevExpress GridControl使用 (一)原汁原味的表格展示 Dev控件中的表格控件GridControl控件非常强大.不过,一些细枝末节的地方有时候用起来不好找挺讨厌的.使用过程中,多 ...

  8. Devexpress GridControl z

    http://minmin86121.blog.163.com/blog/static/4968115720144194923578/ 1 AllowNullInput=False; --Devexp ...

  9. DevExpress GridControl 单元格添加进度条(ProgressBar)

    首先可以使用DevExpress GridControl 自带的进度条控件. 但是我要用一个方法来设置所以的单元格进度,而不是每个单元格都要设置一遍,同时我想要根据进度值不同,进度条显示不同的颜色. ...

随机推荐

  1. WebViewJavascriptBridge详细使用

    前言 WebViewJavascriptBridge是支持到iOS6之前的版本的,用于支持native的iOS与javascript交互.如果需要支持到iOS6之前的app,使用它是很不错的.本篇讲讲 ...

  2. hdu_2111_Saving HDU(贪心)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2111 题意:给你n个物品的单位体积价值和体积,求装满容量v的背包的最大价值. 题解:乍一看还以为是背包 ...

  3. spark第一篇--简介,应用场景和基本原理

    摘要: spark的优势:(1)图计算,迭代计算(2)交互式查询计算 spark特点:(1)分布式并行计算框架(2)内存计算,不仅数据加载到内存,中间结果也存储内存 为了满足挖掘分析与交互式实时查询的 ...

  4. servlet第2讲(下集)----创建servlet实例(继承HttpServlet)

  5. how to write a struct to a file directly?

    Using write and read system call. Following is an example: blk.h: #include <stdlib.h> #include ...

  6. CentOS 7 BIND 搭建

    域名查找顺序 设置 /etc/host.conf 1. bind 安装 $ yum install bind bind-utilsnslookup (name server lookup) 在bind ...

  7. File类与FileInfo类区别

    ile类是静态的,FileInfo不是静态的也没有静态的方法,仅可用于实例化的对象.FileInfo方法基本类似于File.关于二者,作何选择. ● 如果仅进行单一方法调用,则可以使用静态File类上 ...

  8. Nginx配置IP白名单和黑名单

    白名单设置,访问根目录 location / { allow 123.34.22.155; allow ; deny all; } 黑名单设置,访问根目录 location / { deny 123. ...

  9. 解读QML之三

    QML语法 1.QML基本语法 1.1导入声明 导入声明允许客户端告诉QML引擎可以在QML文档中使用哪些模块,JavaScript资源以及组件目录.文档中可以使用的类型依赖于在文档中导入的模块.资源 ...

  10. Java中的一些术语的解释

    一  API(Application Programming Interface,应用程序编程接口) 简单来说,就是其他人开发出来一块程序,你想用,他会告诉你调用哪个函数,给这个函数传什么参数,然后又 ...