最近的开发中在用DataGrid 类 (SystemWindowsForms)发现单击列标题会按该列对表数据进行排序非常方便可是有时候用户又想按初始的数据排序查看那怎么办?
首先介绍两个需要了解的小知识
DataGridAllowSorting 属性
获取或设置一个值该值指示是否可以通过单击列标头对网格进行重新排序
DataGridHitTestType 枚举
指定 SystemWindowsFormsDataGrid 控件中用户单击的部分
其中None 表示当控件不包含表或者包含的行很少时或者当表滚动到其底部时可见的背景区域
而当用户单击行标题之上列标题之右的小矩形区域时得到的HitTestType值也是None
所以我们可以在判断到用户单击None区域时设置DataGrid对象的AllowSorting属性使表格数据恢复初始排序
程序非常简单在DataGrid对象的MouseDown事件中加入以下即可
DataGrid dg = (DataGrid) sender;
DataGridHitTestInfo hit = dgHitTest(eX eY);
if ( hitTypeEquals(DataGridHitTestTypeNone) )
{
dgAllowSorting = false;
dgAllowSorting = true;
}
这与NET Framework的事件处理有什么关系呢?
如果我想创建一个由DataGrid派生的类同时实现刚才的功能就需要重载DataGrid类的某个方法由此我们进入主题
在C#中可重载的事件方法名称皆以On开头且被声明为virtual一个被声明成virtual的方法就代表它可被重载
重载事件方法
事件方法会引发事件
引发事件会调用事件处理程序
关于引发事件详细信息请参见引发事件
我相中了OnMouseDown事件方法因为是它引发 MouseDown 事件有了思路程序是简单的如下
using System;
using SystemWindowsForms;
namespace MyExtend
{
public class ExDataGrid : DataGrid
{
protected override void OnMouseDown(MouseEventArgs e)
{
DataGridHitTestInfo hit = thisHitTest(eX eY);
if ( hitTypeEquals(DataGridHitTestTypeNone) )
{
thisAllowSorting = false;
thisAllowSorting = true;
}
baseOnMouseDown(e);
}
}
}
注意最后一句 baseOnMouseDown(e);
重写派生类中的 OnMouseDown 时请确保调用基类的 OnMouseDown 方法
下次再用DataGrid时就可以通过ExDataGrid类来实现了如下
using MyExtend;
ExDataGrid dg = newExDataGrid();