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

1

У меня есть DataGridView, который заполняется списком файлов и папок. Я бы хотел сортировать DataGridView по алфавиту, но со всеми папками над файлами. Вот общая идея:

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

У меня есть столбец с значками для разных типов файлов, поэтому есть значок папки и значки файлов. Это единственное различие между двумя столбцами. Вот картина: Изображение 174551

Таким образом, вы можете видеть, что файлы и папки имеют разные значки. Вот мой текущий метод сортировки:

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? Если да, то как?

  • 0
    Я бы отсортировал в моем утверждении выбора.
  • 0
    @briskovich "Как бы я это сделал?" это то, что я спрашиваю
Теги:
sorting
datagridview

2 ответа

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 к списку, но я этого не делал.

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню