难题,VB.net中DataGridView排序问题??望高手来解答

无名de旅人 2008-03-04 09:03:36
vb.net中的datagridview控件排序问题,我没有绑定数据源,因为绑定了对数据的操作不便,再说就具体情况也不能绑定,现在的问题就是datagridview的排序默认就按字符类型来排序,碰到数字型、日期型就无能为力了,我试过写IComparer类,在DataGridView.Sort(iComparer as IComparer)调用,目的实现了,但排序的时间太长,和控件自身的排序时间不能比,有网友说在DataGridView1_SortCompare事件中编写代码,但不知道怎么写,高手帮帮忙!!!
还有此控件刷新缓慢,改变Column的大小会一卡一卡的,怎么弄???
...全文
825 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
herol 2008-03-04
  • 打赏
  • 举报
回复
坚决支持楼上两位意见,大数据量必须做分页显示,datagridview显示大量数据就是慢,无论你排不排序,无论怎么绑定,数据量大的时候都很慢。

排序有很多方法可以解决,可以在SQL语句就排序,可以在DataTable排序,可以用数组排序 等等,随便都可以,只要写好了,都不会占用非常多的时间,主要的时间就是往datagridview上绑数据的时间,那是相当慢啊。
outh24 2008-03-04
  • 打赏
  • 举报
回复
5w行……
分页吧,不然看着也累啊
水如烟 2008-03-04
  • 打赏
  • 举报
回复
这么大的数据量显示在界面上,无论排序方法怎样,主要时间都会用在控件的反应上头.

改善的唯一方法,是尽可能的缩小显示数据量.分页显示吧.
wzuomin 2008-03-04
  • 打赏
  • 举报
回复
对于lz 5W行数据量的话,listview控件估计很难实现速度快的要求。
虚表排序没研究那么深呢,呵呵。
期待有更好的答案。
晓轩 2008-03-04
  • 打赏
  • 举报
回复
个人想法:如果你的数据源是 MS SQL你可以在查询分析器里看看T-sql排序执行的时间。
在你的程序里的执行时间肯定要超出查询分析器时间很多。如果可能请在数据源完成排序工作。
如果你非要在程序级完成,可以试用线程看看,防止假死现象。比如在线程临时的table里完成排序,再重新绑定数据源。
无名de旅人 2008-03-04
  • 打赏
  • 举报
回复
速度还可以,我的表格至少要保证5W行,以及20个字段,在这个基础上看速度,你的那个程序数据量小速度还不错,大了也不行,排数值还是很慢,对了你知道虚表这么排序?难道只能从数据源上下手?
无名de旅人 2008-03-04
  • 打赏
  • 举报
回复
起码有100W单元格数据量,不知道你还知道有什么其他内置的ICopmparer类,就是想你用[String].Compare这个现成的方法,最好能有排数字型、日期型的
wzuomin 2008-03-04
  • 打赏
  • 举报
回复
我用上面那段代码测试,listview速度还不错啊!
不知道你的数据量有多大?
无名de旅人 2008-03-04
  • 打赏
  • 举报
回复
我的那个datagridview代码和你这样差不多,当然我在IComparer中这么写的

Public Function Compare(ByVal x As double, ByVal y As double) As Integer Implements IComparer.Compare
if x>y then
return 1
elseif x=y then
return 0
else
return -1
end if
End Function

你的程序排序应该是对字符串排序吧?我在译本教程上看过,速度这么样?我的这个速度就不行了。
我的数据量大,估计不能用listview,listview有个好处,刷新不卡
wzuomin 2008-03-04
  • 打赏
  • 举报
回复
嗨,怎么发了两遍啊?
wzuomin 2008-03-04
  • 打赏
  • 举报
回复
我没有试过DataGridView控件的排序问题
倒是用过ListView控件,LZ不妨换这个试试看效果如何
下面是我当时的程序片段

Public Class Form1

Private WithEvents lstview As New ListView

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
With lstview.Columns
For i As Integer = 0 To 10
.Add("Column" + i.ToString)
Next
End With

For i As Integer = 0 To 2000
Dim item As ListViewItem = lstview.Items.Add("Item" + i.ToString)
For j As Integer = 1 To 10
Dim m As Integer = 1000 * Rnd()
item.SubItems.Add("SubItem" + m.ToString)
Next
Next
Me.Controls.Add(lstview)
lstview.View = View.Details
lstview.Dock = DockStyle.Fill
End Sub

Private Sub ListView_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles lstview.ColumnClick
lstview.ListViewItemSorter = New ListViewItemComparer(e.Column)
lstview.Sort()
End Sub

Class ListViewItemComparer
Implements IComparer

Private col As Integer

Public Sub New()
col = 0
End Sub

Public Sub New(ByVal column As Integer)
col = column
End Sub

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
Return [String].Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)
End Function
End Class

End Class

wzuomin 2008-03-04
  • 打赏
  • 举报
回复
我没有试过DataGridView控件的排序问题
倒是用过ListView控件,LZ不妨换这个试试看效果如何
下面是我当时的程序片段

Public Class Form1

Private WithEvents lstview As New ListView

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
With lstview.Columns
For i As Integer = 0 To 10
.Add("Column" + i.ToString)
Next
End With

For i As Integer = 0 To 2000
Dim item As ListViewItem = lstview.Items.Add("Item" + i.ToString)
For j As Integer = 1 To 10
Dim m As Integer = 1000 * Rnd()
item.SubItems.Add("SubItem" + m.ToString)
Next
Next
Me.Controls.Add(lstview)
lstview.View = View.Details
lstview.Dock = DockStyle.Fill
End Sub

Private Sub ListView_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles lstview.ColumnClick
lstview.ListViewItemSorter = New ListViewItemComparer(e.Column)
lstview.Sort()
End Sub

Class ListViewItemComparer
Implements IComparer

Private col As Integer

Public Sub New()
col = 0
End Sub

Public Sub New(ByVal column As Integer)
col = column
End Sub

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
Return [String].Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)
End Function
End Class

End Class

16,722

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧