DataGridView:首先按一种类型的数据排序

时间:2014-06-09 12:30:11

标签: c# .net sorting datagridview sortcomparefunction

我有一个DataGridView,我填充了文件和文件夹列表。我想按字母顺序对DataGridView进行排序,但是文件上方的所有文件夹都是如此。这是一般的想法:

.\folder1\
.\folder2\
.\folder3\
.\file1
.\file2

我有一个包含不同文件类型图标的列,因此有一个文件夹图标和文件图标。这是我在两列之间的唯一区别。这是一张图片: enter image description here

因此,您可以看到文件和文件夹具有不同的图标。这是我目前的排序方法:

private void dgvFiles_SortCompare(object sender, DataGridViewSortCompareEventArgs e) {
    if(e.Column.Index == 1) {
        // ???
    }
    else if(e.Column.Index == 4) {
        string cellValue1 = e.CellValue1.ToString(),
        cellValue2 = e.CellValue2.ToString();

        if(!string.IsNullOrWhiteSpace(cellValue1) && !string.IsNullOrWhiteSpace(cellValue2)) {
            cellValue1 = Regex.Replace(cellValue1, "[^.0-9]", "");
            cellValue2 = Regex.Replace(cellValue2, "[^.0-9]", "");

            int a = int.Parse(cellValue1), b = int.Parse(cellValue2);

            e.SortResult = a.CompareTo(b);

            e.Handled = true;
        }
    }
}

是否可以使用自定义SortCompare方法以这种方式对DataGridView进行排序?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:0)

我取决于您在列中设置图片的方式,但不是像使用e.CellValue1e.CellValue2那样使用GridName.Rows[e.RowIndex1]和{{1而是访问底层数据。

答案 1 :(得分:0)

所以我做的是我为名为FolderItem的文件夹项创建了一个类。然后,我创建了这些FolderItem对象的列表,并使用列表填充了DataGridView。它实际上让它变得非常简单 - 我只需要使用这段代码:

List<FolderItem> items = new List<FolderItem>();

private void dgvFiles_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
    if(e.ColumnIndex == 1) {
        items.OrderBy(i => i.type).ThenBy(i => i.oldName);

        items.Reverse(); // to account for ascending/descending order

        RefreshDataGridView();
    }
}

public void RefreshDataGridView() {
    dgvFiles.Rows.Clear();

    foreach(FolderItem item in items) {
        dgvFiles.Rows.Add(item.icon, item.oldName, item.newName, item.type, item.size, item.created, item.modified);
    }
}

type对于文件夹为空,因此它出现在其他项目之上。)

你也可能找到一些方法将datagridview绑定到列表,但我没有这样做。