由于显示数据没有将其充满,所以点击头排序后,空行会显示到最上面,如何处理,还有就是如何获得所点击的头所在的列,在线等,谢谢.

解决方案 »

  1.   

    自定义datagridview?
    .net or vb6
      

  2.   

    我vb6里只有datagrid,没有datagridview
    还有,你想把空行发到最下面?
      

  3.   

    恩,就是说空行的不参加排序,就按datagrid来.
      

  4.   

    想不到好方法,试试别的grid,也不一定行。
      

  5.   

    我在做一个对日项目,人家已经把要用到的datagridview封装好了,只是排序的时候显示不正常,问题我已经解决了,我自定义了一个排序方法,完了重写columnheadmouseclick事件,在其中调用自定义的排序,还是要谢谢你.
      

  6.   

    我的这个问题解决了,和大家分享一下.使用sort(icomparer),实现icomparer接口来实现自定义排序.Public Class CDataGridViewCtrl
        Inherits DataGridView
        Private m_SortDirectFLG As Integer = 1 'm_SortDirectFLG:1 昇順;m_SortDirectFLG:-1 降順
        Private m_ColumnHeadName As String = "" '並べ条件
        Private m_RowsCount As Integer '行の実際の数
       Protected Overrides Sub OnColumnHeaderMouseClick(ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs)
            Dim HeadName As String = Me.Columns(e.ColumnIndex).Name.ToString '列名
            Dim SortDirect As System.ComponentModel.ListSortDirection '並べ替えの方向
            If m_ColumnHeadName = "" OrElse m_ColumnHeadName.Equals(HeadName) = False Then
                m_ColumnHeadName = HeadName
                m_SortDirectFLG = 1
                SortDirect = ListSortDirection.Ascending
            ElseIf m_ColumnHeadName.Equals(HeadName) = True Then
                m_SortDirectFLG = -1
                m_ColumnHeadName = ""
                SortDirect = ListSortDirection.Descending
            End If
            If Me.Columns(0).SortMode = DataGridViewColumnSortMode.Programmatic Then
                SetRowCount()
                Dim Rcount As Integer = Me.RowCount - 1
                For i As Integer = Me.RowCount - 1 To Me.m_RowsCount Step -1
                    Me.Rows.Remove(Me.Rows(i)) '削除空白行
                Next
                Sort(New RowComparer(m_SortDirectFLG, e.ColumnIndex, Me.ColumnCount))
                For i As Integer = 0 To Rcount - m_RowsCount
                    Me.Rows.Add() '追加空白行
                Next
            ElseIf Me.Columns(0).SortMode = DataGridViewColumnSortMode.Automatic Then
                Sort(Me.Columns(e.ColumnIndex), SortDirect)
            End If
        End Sub
        ''' -----------------------------------------------------------------------------
        ''' <summary>
        ''' GridViewの並べ用
        ''' </summary>
        ''' <res>
        ''' </res>
        ''' -----------------------------------------------------------------------------
        Private Class RowComparer
            Implements System.Collections.IComparer        Private sortOrderModifier As Integer = 1 '並べ替えの方向
            Private m_ColumnIndex As Integer = 0  '列のインデックス
            Private m_ColumnCount As Integer = 0 '総列数        Public Sub New(ByVal sortIndex As Integer, ByVal ColumnIndex As Integer, ByVal ColumnCount As Integer)
                m_ColumnIndex = ColumnIndex
                m_ColumnCount = ColumnCount - 1
                sortOrderModifier = sortIndex
            End Sub
            ''' -----------------------------------------------------------------------------
            ''' <summary>
            ''' テキストの比較
            ''' </summary>
            ''' <res>
            ''' </res>
            ''' -----------------------------------------------------------------------------
            Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
                Dim DgvRow1 As DataGridViewRow = CType(x, DataGridViewRow)
                Dim DgvRow2 As DataGridViewRow = CType(y, DataGridViewRow)
                Dim Cindex As Integer = 0
                Dim CompareResult As Integer '比較の結果
                CompareResult = StrComp(DgvRow1.Cells(m_ColumnIndex).Value, DgvRow2.Cells(m_ColumnIndex).Value, CompareMethod.Text)
                If CompareResult = 0 Then
                    If m_ColumnIndex = 0 Then
                        For t As Integer = 0 To m_ColumnCount
                            If StrComp(DgvRow1.Cells(t).Value, DgvRow2.Cells(t).Value, CompareMethod.Text) <> 0 Then
                                Cindex = t
                                Exit For
                            End If
                        Next
                    ElseIf m_ColumnIndex = m_ColumnCount Then
                        For t As Integer = m_ColumnCount To 0 Step -1
                            If StrComp(DgvRow1.Cells(t).Value, DgvRow2.Cells(t).Value, CompareMethod.Text) <> 0 Then
                                Cindex = t
                                Exit For
                            End If
                        Next
                    Else
                        Dim flg As Boolean = False
                        For t As Integer = m_ColumnIndex To 0 Step -1
                            If StrComp(DgvRow1.Cells(t).Value, DgvRow2.Cells(t).Value, CompareMethod.Text) <> 0 Then
                                Cindex = t
                                flg = True
                                Exit For
                            End If
                        Next
                        If flg = False Then
                            For t As Integer = m_ColumnIndex To m_ColumnCount
                                If StrComp(DgvRow1.Cells(t).Value, DgvRow2.Cells(t).Value, CompareMethod.Text) <> 0 Then
                                    Cindex = t
                                    flg = True
                                    Exit For
                                End If
                            Next
                        End If
                    End If
                Else
                    Cindex = m_ColumnIndex
                End If
                CompareResult = StrComp(DgvRow1.Cells(Cindex).Value, DgvRow2.Cells(Cindex).Value, CompareMethod.Text)
                Return CompareResult * sortOrderModifier
            End Function
        End Class
        ''' -----------------------------------------------------------------------------
        ''' <summary>
        ''' '削除空白行
        ''' </summary>
        ''' <res>
        ''' </res>
        ''' -----------------------------------------------------------------------------
        Protected Sub SetRowCount()
            Dim flg As Boolean
            m_RowsCount = 0
            For j As Integer = 0 To Me.RowCount - 1
                For i As Integer = 0 To Me.ColumnCount - 1
                    If Not IsNothing(Me.Item(i, j).Value) Then
                        flg = True
                        Exit For
                    Else
                        flg = False
                    End If
                Next
                If flg = True Then
                    m_RowsCount += 1
                End If
            Next
        End Sub
    End Class