1

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

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

我有一列包含不同文件类型的图标,所以有一个文件夹图标和文件图标。这是我在两列之间的唯一区别。这是一张图片: 在此处输入图像描述

所以你可以看到文件和文件夹有不同的图标。这是我目前的排序方法:

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 进行排序?如果是这样,怎么做?

4

2 回答 2

0

我取决于您如何在列内设置图像,而不是像您对大小排序所做的那样使用和,而是使用和e.CellValue1访问基础数据。e.CellValue2GridName.Rows[e.RowIndex1]GridName.Rows[e.RowIndex2]

于 2014-06-09T15:39:08.317 回答
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 绑定到列表,但我没有这样做。

于 2014-06-11T09:57:18.313 回答