DataGridView.Sort()会出现这样的问题?!!!晕啊

li_guang_hua 2009-10-16 08:52:41
各位高手:我做了一个程序,有一段代码使用了DataGridView.Sort(),具体效果如下:


在代码中对语文、英语、数学等科进行了降序排列,一切正常!再接下来对“总 分”列调用objDataGridView.Sort(objDataGridView.Columns("总 分"), System.ComponentModel.ListSortDirection.Descending)进行降序排列,出现了上述结果,最后一行的总分是250,不是最小的却被排到最后一行。不知为何?


还有别人使用我的程序2年没有出现排序问题,前几天突然出现了这个问题,我花了好几天检查代码,没有问题啊,可运行却出现了这样的问题,真叫我晕啊!!!
各位高手救我啊!
...全文
538 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgx1972 2009-10-21
  • 打赏
  • 举报
回复
学习
li_guang_hua 2009-10-20
  • 打赏
  • 举报
回复
If Dt.Rows(j).Item(ColName) Is DBNull.Value Then
MsgBox(Dt.Rows(j).Item("姓名"))
End If
这几句是供调试用的,可以删除!
li_guang_hua 2009-10-19
  • 打赏
  • 举报
回复
自编了一个对表进行排序的类,发现总分列中有空值,反思应该是Excel数据有问题。再细问数据来源,原来是他的数据从FoxPro数据库导出的,估计问题出自这里。

排序的类:
Public Class SortClass

Public Dt As DataTable
Public ColName As String
Public fDescend As Boolean

Public Sub Sort()
Dim i, j, m As Integer
Dim TemDt As DataTable = Dt.Copy

If Dt.Rows.Count = 0 Then
Exit Sub
End If

For i = TemDt.Rows.Count - 1 To 0 Step -1
TemDt.Rows.RemoveAt(i)
Next

For i = 0 To Dt.Rows.Count - 2
For j = i + 1 To Dt.Rows.Count - 1



If Dt.Rows(j).Item(ColName) Is DBNull.Value Then
MsgBox(Dt.Rows(j).Item("姓名"))
End If


If (fDescend And Dt.Rows(i).Item(ColName) < Dt.Rows(j).Item(ColName)) Or ((Not fDescend) And (Dt.Rows(i).Item(ColName) > Dt.Rows(j).Item(ColName))) Then

'将第i行数据放入TemDt表中
TemDt.ImportRow(Dt.Rows(i))

'将第j行数据放入第i行中
For m = 0 To Dt.Columns.Count - 1
Dt.Rows(i).Item(m) = DBNull.Value
If Dt.Rows(j).Item(m) IsNot DBNull.Value Then
Dt.Rows(i).Item(m) = Dt.Rows(j).Item(m)
End If
Next

'将TemDt表中的数据放入第j行中
For m = 0 To Dt.Columns.Count - 1
Dt.Rows(j).Item(m) = DBNull.Value
If TemDt.Rows(0).Item(m) IsNot DBNull.Value Then
Dt.Rows(j).Item(m) = TemDt.Rows(0).Item(m)
End If
Next
TemDt.Rows.RemoveAt(0)
End If
Next
Next

If fDescend Then
For m = 0 To Dt.Rows.Count - 1
If m = 0 Then
Dt.Rows(m).Item(ColName & "排名") = 1
Else
If Dt.Rows(m - 1).Item(ColName) IsNot DBNull.Value And Dt.Rows(m).Item(ColName) IsNot DBNull.Value Then
If Dt.Rows(m - 1).Item(ColName) = Dt.Rows(m).Item(ColName) Then
Dt.Rows(m).Item(ColName & "排名") = Dt.Rows(m - 1).Item(ColName & "排名")
Else
Dt.Rows(m).Item(ColName & "排名") = m + 1
End If
Else
Exit For
End If
End If
Next
Else
For m = Dt.Rows.Count - 1 To 0 Step -1
If m = Dt.Rows.Count - 1 Then
Dt.Rows(m).Item(ColName & "排名") = 1
Else
If Dt.Rows(m + 1).Item(ColName) IsNot DBNull.Value And Dt.Rows(m).Item(ColName) IsNot DBNull.Value Then
If Dt.Rows(m).Item(ColName) = Dt.Rows(m + 1).Item(ColName) Then
Dt.Rows(m).Item(ColName & "排名") = Dt.Rows(m + 1).Item(ColName & "排名")
Else
Dt.Rows(m).Item(ColName & "排名") = Dt.Rows.Count - m
End If
Else
Exit For
End If
End If
Next
End If
End Sub


End Class
yyz985 2009-10-18
  • 打赏
  • 举报
回复
dt.Columns.Add("总分", typeof(float))
li_guang_hua 2009-10-18
  • 打赏
  • 举报
回复
可能是VS的一个Bug,vs.net 2005 sp1中包含正版验证吗?
古今多少事 2009-10-18
  • 打赏
  • 举报
回复
设个断点,数据再减少些,对你注释掉正常的代码逐句调试下看看。
shaozengwei 2009-10-18
  • 打赏
  • 举报
回复
看代码没有什么问题,可能是你的数据有问题!还有编辑行怎么关?
li_guang_hua 2009-10-18
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 zanfeng 的回复:]
很显然是你程序写的问题。排序你又不知道做什么操作了。
[/Quote]

到http://www.mosh.cn/xuzhou/zcmg/moshow?uid=106为你老婆投了一票。

你老婆挺漂亮的!建议好把墨镜摘了!
建议你把头像换了吧,被它晃得好晕啊!我的程序找不出问题已经够晕了!!!
li_guang_hua 2009-10-18
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 zanfeng 的回复:]
很显然是你程序写的问题。排序你又不知道做什么操作了。
[/Quote]

究竟是什么问题?
足球中国 2009-10-18
  • 打赏
  • 举报
回复
很显然是你程序写的问题。排序你又不知道做什么操作了。
li_guang_hua 2009-10-18
  • 打赏
  • 举报
回复
问题还是没解决!
li_guang_hua 2009-10-18
  • 打赏
  • 举报
回复
谢谢大家!
li_guang_hua 2009-10-18
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 my_skysea 的回复:]
非得把那个编辑行开着吗?把它关了!
另外在多加一个空行进去试试看,我以前遇到过,好像是这么解决的,记不太清了,有几年了吧
[/Quote]

谢谢!请问:如何关闭编辑行?
yyz985 2009-10-17
  • 打赏
  • 举报
回复
Dim dt as DataTable
dt = Select("select ...,(语文+数学+英语) as 总分")
dataGridView1.DataSource = dt;
li_guang_hua 2009-10-17
  • 打赏
  • 举报
回复
我对下面这段代码注释,再直接计算总分,并对总分排序,则排序正常。难道DataGridView.Sort()调用多次会发脾气?
For i = 0 To KmString.Length - 2
objDataGridView.Sort(objDataGridView.Columns(KmString(i)), System.ComponentModel.ListSortDirection.Descending)
objDataGridView.Rows(0).Cells(KmString(i) & "排名").Value = 1
For k = 1 To objDataGridView.Rows.Count - 1
If objDataGridView.Rows(k).Cells(KmString(i)) Is Nothing Or objDataGridView.Rows(k).Cells(KmString(i)).Value Is DBNull.Value Then
Exit For
End If
If objDataGridView.Rows(k).Cells(KmString(i)).Value = objDataGridView.Rows(k - 1).Cells(KmString(i)).Value Then
objDataGridView.Rows(k).Cells(KmString(i) & "排名").Value = objDataGridView.Rows(k - 1).Cells(KmString(i) & "排名").Value
Else
objDataGridView.Rows(k).Cells(KmString(i) & "排名").Value = k + 1
End If
Next
Next
li_guang_hua 2009-10-17
  • 打赏
  • 举报
回复
下面的KmString是字符串数组,已经赋值"语文"、"英语"、"数学"。而TemTable表中已经有列:座号、班级、姓名

'再往TemTable表中添加列:语文、语文排名、英语、英语排名、数学、数学排名
For j = 0 To KmString.Length - 2
col = New DataColumn(KmString(j), GetType(Integer))
TemTable.Columns.Add(col)
col = New DataColumn(KmString(j) & "排名", GetType(Integer))
TemTable.Columns.Add(col)
objDataGridView.DataSource = TemTable
Next

'objDataSet.Tables(0)中存放有:座号、班级、姓名、语文、英语、数学等数据,下面代码将objDataSet.Tables(0)中的语文、英语、数学三科数据搬入TemTable表中。
For i = 0 To objDataSet.Tables(0).Rows.Count - 1
TemTable.Rows.Add(TemTable.NewRow())
Next
Dim ColName As String
For i = 0 To TemTable.Columns.Count - 1
ColName = TemTable.Columns(i).ColumnName
If Not ColName.Contains("排名") Then
For j = 0 To objDataSet.Tables(0).Rows.Count - 1
TemTable.Rows(j).Item(ColName) = objDataSet.Tables(0).Rows(j).Item(ColName)
Next
End If
Next

'再往TemTable添加两列:"总 分"、"总分排名"
TemTable.Columns.Add(New DataColumn("总 分", GetType(Integer)))
TemTable.Columns.Add(New DataColumn("总分排名", GetType(Integer)))
objDataGridView.DataSource = TemTable

'依次对语文、英语、数学进行排名,并写入名次
For i = 0 To KmString.Length - 2
objDataGridView.Sort(objDataGridView.Columns(KmString(i)), System.ComponentModel.ListSortDirection.Descending)
objDataGridView.Rows(0).Cells(KmString(i) & "排名").Value = 1
For k = 1 To objDataGridView.Rows.Count - 1
If objDataGridView.Rows(k).Cells(KmString(i)) Is Nothing Or objDataGridView.Rows(k).Cells(KmString(i)).Value Is DBNull.Value Then
Exit For
End If
If objDataGridView.Rows(k).Cells(KmString(i)).Value = objDataGridView.Rows(k - 1).Cells(KmString(i)).Value Then
objDataGridView.Rows(k).Cells(KmString(i) & "排名").Value = objDataGridView.Rows(k - 1).Cells(KmString(i) & "排名").Value
Else
objDataGridView.Rows(k).Cells(KmString(i) & "排名").Value = k + 1
End If
Next
Next

'计算每一行的总分
For i = 0 To objDataGridView.Rows.Count - 1
ZongFen = 0
For j = 0 To KmString.Length - 2
If (objDataGridView.Rows(i).Cells(KmString(j)) IsNot Nothing) And (objDataGridView.Rows(i).Cells(KmString(j)).Value IsNot DBNull.Value) Then
ZongFen += objDataGridView.Rows(i).Cells(KmString(j)).Value
End If
Next
objDataGridView.Rows(i).Cells("总 分").Value = ZongFen
Next

'总分排名
objDataGridView.Sort(objDataGridView.Columns("总 分"), System.ComponentModel.ListSortDirection.Descending)
虾条哥 2009-10-17
  • 打赏
  • 举报
回复
非得把那个编辑行开着吗?把它关了!
另外在多加一个空行进去试试看,我以前遇到过,好像是这么解决的,记不太清了,有几年了吧
li_guang_hua 2009-10-17
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 asdfy 的回复:]
考虑下计算总分在表中先完成,然后绑定到Datagridview,再按总分排序试试……
[/Quote]

'在后台的表中计算总分
Try
objDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit)
Catch ex As Exception
MsgBox(ex.Message)
Return
End Try

For i = 0 To TemTable.Rows.Count - 1
ZongFen = 0
For j = 0 To KmString.Length - 2
If TemTable.Rows(i).Item(KmString(j)) IsNot DBNull.Value Then
ZongFen += TemTable.Rows(i).Item(KmString(j))
End If
Next
TemTable.Rows(i).Item("总 分") = ZongFen
Next
objDataGridView.DataSource = TemTable

'总分排名
objDataGridView.Sort(objDataGridView.Columns("总 分"), System.ComponentModel.ListSortDirection.Descending)

效果如下:问题依然存在!





十八道胡同 2009-10-17
  • 打赏
  • 举报
回复
先算出总分,再绑定呢?
古今多少事 2009-10-17
  • 打赏
  • 举报
回复
考虑下计算总分在表中先完成,然后绑定到Datagridview,再按总分排序试试……
加载更多回复(13)

16,554

社区成员

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

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