我在datagridview中有特定数字的字符串列。它没有约束力。我想正确排序。默认DataGridView排序不会对其进行排序。
实施例: Dgv对此进行排序:
- FS 752/08/2014
- FS 752/06/2015
- FS 751/12/2013
- FS 751/08/2014
- FS 751/06/2015
它应该是这样的:
- FS 752/06/2015
- FS 751/06/2015
- FS 752/08/2014
- FS 751/08/2014
- FS 751/12/2013
我怎样才能做到这一点?
答案 0 :(得分:2)
如您所说,您没有使用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
值,并验证string
拆分的长度。