最近的開發中在用DataGrid 類 (System
Windows
Forms)
發現單擊列標題會按該列對表數據進行排序
非常方便
可是有時候用戶又想按初始的數據排序查看
那怎麼辦?
首先介紹兩個需要了解的小知識
DataGrid
AllowSorting 屬性
獲取或設置一個值
該值指示是否可以通過單擊列標頭對網格進行重新排序
DataGrid
HitTestType 枚舉
指定 System
Windows
Forms
DataGrid 控件中用戶單擊的部分
其中
None 表示當控件不包含表
或者包含的行很少時
或者當表滾動到其底部時可見的背景區域
而當用戶單擊行標題之上
列標題之右的小矩形區域時
得到的HitTestType值也是None
所以我們可以在判斷到用戶單擊None區域時
設置DataGrid對象的AllowSorting屬性
使表格數據恢復初始排序
程序非常簡單
在DataGrid對象的MouseDown事件中加入以下即可
DataGrid dg = (DataGrid) sender;
DataGrid
HitTestInfo hit = dg
HitTest(e
X
e
Y);
if ( hit
Type
Equals(DataGrid
HitTestType
None) )
{
dg
AllowSorting = false;
dg
AllowSorting = true;
}
這與
NET Framework的事件處理有什麼關系呢?
如果我想創建一個由DataGrid派生的類
同時實現剛才的功能
就需要重載DataGrid類的某個方法
由此我們進入主題
在C#中
可重載的事件方法名稱皆以
On
開頭
且被聲明為
virtual
一個被聲明成virtual的方法
就代表它可被重載
重載事件方法
事件方法會引發事件
引發事件會調用事件處理程序
關於引發事件詳細信息
請參見引發事件
我相中了OnMouseDown事件方法
因為是它引發 MouseDown 事件
有了思路
程序是簡單的
如下
using System;
using System
Windows
Forms;
namespace MyExtend
{
public class ExDataGrid : DataGrid
{
protected override void OnMouseDown(MouseEventArgs e)
{
DataGrid
HitTestInfo hit = this
HitTest(e
X
e
Y);
if ( hit
Type
Equals(DataGrid
HitTestType
None) )
{
this
AllowSorting = false;
this
AllowSorting = true;
}
base
OnMouseDown(e);
}
}
}
注意最後一句 base
OnMouseDown(e);
重寫派生類中的 OnMouseDown 時
請確保調用基類的 OnMouseDown 方法
下次再用DataGrid時
就可以通過ExDataGrid類來實現了
如下
using MyExtend;
ExDataGrid dg = new ExDataGrid();
From:http://tw.wingwit.com/Article/program/net/201311/11435.html