我有一个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进行排序?如果是这样,怎么样?
答案 0 :(得分:0)
我取决于您在列中设置图片的方式,但不是像使用e.CellValue1
和e.CellValue2
那样使用GridName.Rows[e.RowIndex1]
和{{1而是访问底层数据。
答案 1 :(得分: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绑定到列表,但我没有这样做。