【问题标题】:DataGridView Sort does not workDataGridView 排序不起作用
【发布时间】:2010-11-09 19:30:25
【问题描述】:

Visual Studio 2010 VB.NET

我将 DataGridView.DataSource 设置为自定义对象的集合。列使用来自自定义对象的只读属性进行显示,此对话框仅用于显示。这些属性都返回 String 对象。我将除其中 2 列之外的所有列设置为自动排序模式(未设置的是按钮或复选框)。然而它没有排序。我用谷歌搜索,大多数人使用 sql 或绑定源,但我使用的是微不足道的 vb 集合。有人说我应该实现 IComparable 但 String 不是已经 IComparable 了吗?

任何帮助将不胜感激?

感谢

博杰

根据请求,这里有一些代码 sn-ps。

此方法详细定义了我在 设计师。

列名称称为 pSelected 或 pCustomer 并对应于 与列定义关联的同名属性。


Protected Sub UpdateDGVUS()
        If Not USColumnsInitted Then
            USColumnsInitted = True

            dgvUS.AutoGenerateColumns = False
            dgvUS.Columns.Clear()

            Dim iIdx As Integer

            iIdx = 0

            dgvUS.Columns.Insert(iIdx, Me.pSelected)
            dgvUS.Columns("pSelected").DisplayIndex = iIdx
            dgvUS.Columns("pSelected").SortMode = DataGridViewColumnSortMode.Automatic
            iIdx = iIdx + 1

            dgvUS.Columns.Insert(iIdx, Me.pCustomer)
            dgvUS.Columns("pCustomer").DisplayIndex = iIdx
            dgvUS.Columns("pCustomer").SortMode = DataGridViewColumnSortMode.Automatic
            iIdx = iIdx + 1

            dgvUS.Columns.Insert(iIdx, Me.pDetails)
            dgvUS.Columns("pDetails").DisplayIndex = iIdx
            dgvUS.Columns("pDetails").SortMode = DataGridViewColumnSortMode.Automatic
            iIdx = iIdx + 1

            dgvUS.Columns.Insert(iIdx, Me.pSelectCustomerInvoice)
            dgvUS.Columns("pSelectCustomerInvoice").DisplayIndex = iIdx
            iIdx = iIdx + 1

            dgvUS.Columns.Insert(iIdx, Me.pDate)
            dgvUS.Columns("pDate").DisplayIndex = iIdx
            dgvUS.Columns("pDate").SortMode = DataGridViewColumnSortMode.Automatic
            iIdx = iIdx + 1

            dgvUS.Columns.Insert(iIdx, Me.pAmount)
            dgvUS.Columns("pAmount").DisplayIndex = iIdx
            dgvUS.Columns("pAmount").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            dgvUS.Columns("pAmount").SortMode = DataGridViewColumnSortMode.Automatic
            iIdx = iIdx + 1

            dgvUS.Columns.Insert(iIdx, Me.pName)
            dgvUS.Columns("pName").DisplayIndex = iIdx
            dgvUS.Columns("pName").SortMode = DataGridViewColumnSortMode.Automatic
            iIdx = iIdx + 1

            dgvUS.Columns.Insert(iIdx, Me.pPayment)
            dgvUS.Columns("pPayment").DisplayIndex = iIdx
            dgvUS.Columns("pPayment").SortMode = DataGridViewColumnSortMode.Automatic
            iIdx = iIdx + 1

            dgvUS.Columns.Insert(iIdx, Me.pCompany)
            dgvUS.Columns("pCompany").DisplayIndex = iIdx
            dgvUS.Columns("pCompany").SortMode = DataGridViewColumnSortMode.Automatic
            iIdx = iIdx + 1

            dgvUS.Columns.Insert(iIdx, Me.pType)
            dgvUS.Columns("pType").DisplayIndex = iIdx
            dgvUS.Columns("pType").SortMode = DataGridViewColumnSortMode.Automatic
            iIdx = iIdx + 1

            dgvUS.Columns.Insert(iIdx, Me.pDescription)
            dgvUS.Columns("pDescription").DisplayIndex = iIdx
            dgvUS.Columns("pDescription").SortMode = DataGridViewColumnSortMode.Automatic
            iIdx = iIdx + 1

            dataUpdatedUS()
        End If
    End Sub

这是集合中自定义对象的 sn-p


Public Class ItemXact01
    Public Property FirstName As String
    Public Property LastName As String
    Public Property Company As String
    Public Property Type As String
    Public Property Description As String
    Public Property RefNumber As String
    Public Property DownloadID As String
    Public Property Selected As Boolean
    Public Property RequestID As Integer

    ...

    Public ReadOnly Property pCompany As String
        Get
            pCompany = Company
        End Get
    End Property

    Public ReadOnly Property pType As String
        Get
            pType = Type
        End Get
    End Property

    Public ReadOnly Property pDescription As String
        Get
            pDescription = Description
        End Get
    End Property

    Public ReadOnly Property pSelected As Boolean
        Get
            pSelected = Selected
        End Get
    End Property

...

使用此代码将数据放置到位


    Private Sub dataUpdateDGV(ByRef dgv As DataGridView, ByRef myCollection As Collection)
        myMain.Log("dataUpdatedDGV: 001 :" & dgv.RowCount & ":" & myCollection.Count & ":")

' for some reason the not equal to does not show in the next line

        If dgv.RowCount  myCollection.Count Then
            myMain.Log("dataUpdatedDGV: 002")

            dgv.DataSource = Nothing
            If myCollection.Count > 0 Then
                myMain.Log("dataUpdatedDGV: 003")

                dgv.DataSource = myCollection
            End If
        End If

        myMain.Log("dataUpdatedDGV: 004")

        dgv.Invalidate()
        dgv.Update()
        dgv.Refresh()

        myMain.Log("dataUpdatedDGV: OUT")
    End Sub

【问题讨论】:

  • 你能贴出你用来定义DataGridView的代码吗?
  • 我将设计器用于对话框。它有一个选项卡控制器,其中一些选项卡包含数据网格视图。在这里我可以放一些我想的sn-ps:

标签: .net vb.net visual-studio-2010


【解决方案1】:

这里的关键是 DataGridView 不负责排序; 底层数据源(即 DataSource 的 .DataSource)是。

你可以实现类似这样的 SortableBindingList(对于 Windows.Forms) http://www.martinwilley.com/net/code/forms/sortablebindinglist.html

【讨论】:

  • 你是对的,但必须说这是一个灾难性的设计。网格如何排序显然是一个演示问题,应该由控件处理。坦率地说,只要列中的绑定值是相同的类型(通常是这种情况)并实现 IComparable (就像所有基本数据类型一样),很难理解为什么它很难做到。这种 winforms 方法的一个副作用是您不能将列表绑定到多个视图,因为 datasource 跟踪顺序和选定项目等。想象一个包含大量金额的视图以及与每个金额相关的货币下拉列表。
  • 应用于特定网格的排序在 DataGridView 中。实际排序的方法在DataSource中。
【解决方案2】:

如果我没记错的话,您可以在您的集合和 datagridview 之间放置一个绑定源,并且该绑定源将提供一系列功能。我认为它也可以让你排序。这一切都在我的脑海中,因为我现在无法测试它。

【讨论】:

  • 我在以太网中发现了一个 SortableBindingList 类,它可以工作。
【解决方案3】:

如果这纯粹是为了只读目的,并且您不需要用户能够进行动态排序,那么我建议您在设置数据源之前在代码中对集合进行排序。

例子:

myDataGridView.DataSource = null;
myCollection.Sort();
myDataGridView.DataSource = myCollection;

这可以让您获得默认排序。 如果您需要实现动态排序, 我建议您重用您的 myCollection.Sort() 方法,例如制作一个停靠在 datagridview 上方的新面板,其中包含用于对每一列进行排序的按钮。将这些按钮中的点击事件链接到您的 .Sort() 方法,并向该方法添加一个参数以了解要按哪一列排序。

这需要一点工作,但我认为实现自定义排序方案比让你的 Microsoft 组件屈服于你的意愿更幸运。

【讨论】:

  • 感谢您的回复,但我不需要自定义排序,我只希望它按所选列排序。当我单击列标题时没有任何反应。
猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 2011-09-09
  • 2013-03-04
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
相关资源
最近更新 更多