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]
вместо этого получить доступ к базовым данным.