ListView列排序(c#)

本文介绍了一个用于Windows Forms ListView控件的自定义排序类ColumnSort。该类实现了IComparer接口,并通过比较ListViewItem子项来实现升序或降序排列。文章还提供了一个具体的使用示例,展示了如何在ListView的ColumnClick事件中应用此排序类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  //定义一个排序类实现接口类IComparer中的Compare接口
  public class ColumnSort:IComparer 
  {
   private int colNum; //要排序的列
   public bool bAscend = true;  //排序方式升序或降序

   public ColumnSort(int sortColNum)
   {
    colNum = sortColNum;
   }

   //接口实现
   public int Compare(object A,object B)
   {
    System.Windows.Forms.ListViewItem listItemA = (System.Windows.Forms.ListViewItem)A;
    System.Windows.Forms.ListViewItem listItemB = (System.Windows.Forms.ListViewItem)B;

    int result = String.Compare(listItemA.SubItems[colNum].ToString(),listItemB.SubItems[colNum].ToString());
    if( bAscend == true )
                    return result;
    else
     return (-1) * result;
   }
  }

具体操作实例

在listView1的ColumnClick事件中做如下处理既可

  private void listView1_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
  {
   ColumnSort colSort = new ColumnSort(e.Column);
   colSort.bAscend = (listView1.Sorting == SortOrder.Ascending);
   
   if(colSort.bAscend == true)
   {
     listView1.Sorting = SortOrder.Descending;
   }
   else
   {
                 listView1.Sorting = SortOrder.Ascending;
   }
   listView1.ListViewItemSorter = colSort;
  } 

### C# WinForms 和 WPF 中 ListView 控件按排序 #### 在 WinForms 中实现 ListView排序 为了实现在 `WinForms` 中的 `ListView` 控件按照某一的内容进行排序,可以通过处理 `ColumnClick` 事件来改变当前排序依据的,并通过自定义比较器来进行实际的数据项对比。 ```csharp private void listView1_ColumnClick(object sender, ColumnClickEventArgs e) { // 获取点击的索引 int columnIndex = e.Column; // 判断上次排序的方向并切换方向 ListSortDirection direction; if (listView1.Sorting == SortOrder.Ascending || listView1.Sorting == SortOrder.None) { direction = ListSortDirection.Descending; } else { direction = ListSortDirection.Ascending; } // 设置新的排序方式 listView1.ListViewItemSorter = new ListViewItemComparer(columnIndex, direction); } // 自定义比较类用于排序逻辑 public class ListViewItemComparer : IComparer { private readonly int _columnToCompare; // 要比较的号 private readonly ListSortDirection _direction; // 排序顺序 public ListViewItemComparer(int columnToCompare, ListSortDirection sortDirection) { _columnToCompare = columnToCompare; _direction = sortDirection; } public int Compare(object x, object y) { var itemX = ((ListViewItem)x).SubItems[_columnToCompare].Text; var itemY = ((ListViewItem)y).SubItems[_columnToCompare].Text; // 如果是升序排,则返回正数;如果是降序排,则返回负数 return (_direction == ListSortDirection.Ascending) ? string.Compare(itemX, itemY) : -string.Compare(itemX, itemY); } } ``` 这段代码展示了如何响应用户的交互操作——当用户单击某表头时触发相应的排序行为[^1]。此方法适用于简单的字符串类型的子项目之间的比较。对于更复杂的数据类型(如日期),可能需要调整 `Compare()` 方法内的具体实现细节以适应特定需求。 #### 在 WPF 中实现 ListView排序 而在 `WPF` 下面,通常会利用数据绑定机制以及命令模式来简化 UI 更新过程: ```xml <ListView Name="lvDataBinding" HorizontalAlignment="Left" VerticalAlignment="Top" Height="208" Width="394"> <ListView.View> <GridView AllowsColumnReorder="True"> <!-- 定义各 --> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Name}" /> <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Path=Age}" /> <GridViewColumn Header="City" DisplayMemberBinding="{Binding Path=City}" /> </GridView> </ListView.View> </ListView> <Button Content="Sort by Age" Click="OnSortButtonClick"/> ``` 对应的后台代码如下所示: ```csharp private void OnSortButtonClick(object sender, RoutedEventArgs e) { CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lvDataBinding.ItemsSource); if (view != null && lvDataBinding.Items.Count > 0) { PropertyGroupDescription groupDescription = new PropertyGroupDescription(); // 清除现有分组描述符 while(view.GroupDescriptions.Contains(groupDescription)) { view.GroupDescriptions.Remove(groupDescription); } // 创建一个新的排序条件 SortDescription sd = new SortDescription("Age", ListSortDirection.Ascending); // 移除旧的排序规则再添加新规则 view.SortDescriptions.Clear(); view.SortDescriptions.Add(sd); } } ``` 这里提供了一种基于按钮点击的方式来进行排序,当然也可以监听鼠标左键双击表头等其他形式的操作来达到相同的效果。值得注意的是,在 `WPF` 中可以直接对集合视图应用多个排序标准而无需手动管理每一行的位置变化[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值