VB.NET实现ListView排序报BC30057参数过多错误如何解决
错误触发原因
- 核心报错原因:
ListViewItemComparer类仅定义了无参数的构造函数,但你在ColumnClick事件里实例化该类时传入了e.Column、ListView2.Sorting两个参数,编译器找不到匹配的带参构造方法,直接抛出BC30057参数过多错误。 - 附带的隐性逻辑问题:
- 存储排序列索引的私有字段
col定义为String类型,但列索引是整数类型,后续比较会出现类型不匹配问题 - 类仅声明了实现
IComparer接口,没有编写接口要求的Compare核心比较逻辑,即便构造方法修复后排序功能也无法正常运行 - 原有无参构造内
Me.order = order属于无意义的自赋值,不会生效
- 存储排序列索引的私有字段
修正后的可运行代码
首先在窗体类层级声明全局排序列变量,再修正比较器类与事件逻辑:
' 窗体类层级声明全局变量,记录当前排序的列索引 Private sortColumn As Integer = 0 Public Class ListViewItemComparer Implements IComparer ' 修正字段类型:列索引为整数类型 Private col As Integer Private order As SortOrder ' 新增带参构造方法,匹配实例化时传入的两个参数 Public Sub New(columnIndex As Integer, sortOrder As SortOrder) col = columnIndex order = sortOrder End Sub ' 实现IComparer接口要求的Compare方法,编写核心比较逻辑 Public Function Compare(x As Object, y As Object) As Integer Implements IComparer.Compare Dim itemX As ListViewItem = CType(x, ListViewItem) Dim itemY As ListViewItem = CType(y, ListViewItem) Dim compareResult As Integer = String.Compare(itemX.SubItems(col).Text, itemY.SubItems(col).Text) ' 根据排序方向返回对应比较结果 If order = SortOrder.Descending Then Return compareResult * -1 Else Return compareResult End If End Function End Class Private Sub ListView2_ColumnClick(sender As Object, e As ColumnClickEventArgs) Handles ListView2.ColumnClick ' 切换排序方向 If e.Column <> sortColumn Then sortColumn = e.Column ListView2.Sorting = SortOrder.Ascending Else ListView2.Sorting = If(ListView2.Sorting = SortOrder.Ascending, SortOrder.Descending, SortOrder.Ascending) End If ' 传入匹配构造方法的两个参数 ListView2.ListViewItemSorter = New ListViewItemComparer(e.Column, ListView2.Sorting) ListView2.Sort() End Sub
补充说明
如果你的ListView列中存储的是数值、日期类型而非纯字符串,可以在Compare方法里先把列文本转成对应类型再比较,避免出现字符串比较逻辑下"10"排在"2"前面的排序异常。
内容的提问来源于stack exchange,提问作者RedRed
相关产品推荐
相关产品推荐

