У меня есть 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? Если да, то как?
Так что я сделал вместо этого, я создал класс для элементов папок с именем 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 к списку, но я этого не делал.
В зависимости от того, как вы установили изображение внутри столбца, но вместо использования e.CellValue1
и e.CellValue2
как вы это сделали для сортировки по размеру, используйте GridName.Rows[e.RowIndex1]
и GridName.Rows[e.RowIndex2]
для доступа к базовым данным.