正如你所說你沒有使用DataSource
那麼你可以嘗試使用SortCompare
event。
當用戶單擊列更改排序順序或編程調用Sort
function時,將會調用此事件。
這裏是一個基本的例子。我想提出的是要排序是一年的假設,然後每月再第一號(?)(?):
private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
// Check if we are sorting by the special column.
if (myDataGridView.Columns.Contains("My_Column") && e.Column == myDataGridView.Columns["My_Column"])
{
// Parse the special values (add validation if required).
string[] parts1 = e.CellValue1.ToString().Trim().Split('/');
int a1 = int.Parse(parts1[0].Split(' ')[2]);
int b1 = int.Parse(parts1[1]);
int c1 = int.Parse(parts1[2]);
string[] parts2 = e.CellValue2.ToString().Trim().Split('/');
int a2 = int.Parse(parts2[0].Split(' ')[2]);
int b2 = int.Parse(parts2[1]);
int c2 = int.Parse(parts2[2]);
// Compare each value as required.
// First compare the last value (year?)
e.SortResult = c1.CompareTo(c2);
// If equal, then compare second value (month?)
if(e.SortResult == 0)
e.SortResult = b1.CompareTo(b2);
// Finally if still equal, then compare first value
if(e.SortResult == 0)
e.SortResult = a1.CompareTo(a2);
}
}
注意:如果你不能保證你將永遠有一個有效的格式,每一個細胞,那麼您將需要爲此事件添加驗證邏輯。例如,使用int.TryParse()
並檢查null
值,並驗證分割的長度。
嘗試製作一個特殊的'比較器',並在該比較器中使用'DataGridView.Sort'方法。示例:https://msdn.microsoft.com/en-us/library/wstxtkxs(v=vs.110).aspx – ASh