DataGridView: сортировка сначала по одному типу данных

У меня есть 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;
        }
    }
}

Можно ли отсортировать DataGridView таким образом, используя собственный метод SortCompare? Если так, то как?

2 ответа

Решение

Вместо этого я создал класс для элементов папки с именем 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 был пустым для папок, так что это произошло над другими элементами.)

Вы также можете найти способ привязать сетку данных к списку, но я этого не сделал.

Я зависит от того, как вы установили изображение внутри столбца, но вместо того, чтобы использовать e.CellValue1 а также e.CellValue2 как вы сделали для сортировки по размеру, используйте GridName.Rows[e.RowIndex1] а также GridName.Rows[e.RowIndex2] вместо этого получить доступ к базовым данным.

Другие вопросы по тегам