自定义排序绑定DataGridView

时间:2008-11-10 05:38:33

标签: .net sorting datagridview

我有一个绑定到DataTable的DataGridView。我有一个列是伪int - 你知道那种,大多数时候它有整数,但有时候有一个N / A.这个列是一个varchar,但是我希望它像int列一样排序,将N / A视为-1。

DataGridView为此提供了 - 如果它没有绑定到DataTable。如果绑定它,它将使用绑定对象的排序机制,而D​​ataTables不会公开该功能。

我可以使用我想要的行为在DataTable中创建一个自定义列,但由于DataGridView绑定到DataTable,它会按其显示的列进行排序。我可以在DataGridView中创建一个自定义列,但是当我已经有一个主要有效的解决方案时,我需要将表设置为虚拟模式进行排序。

如何根据需要对我的伪int列进行排序 - 如果可能,按int排序?这种情况看起来非常普遍,而且我确信它已被提供给它。

5 个答案:

答案 0 :(得分:3)

当我不得不处理与此类似的排序问题时,我最喜欢的方法是向DataTable添加一个列并将伪int解析为我想要的可排序的int。然后在DataGridView的绑定中,你可以简单地隐藏那一列数据,但因为它在那里你仍然可以对它进行排序。它为内存添加了一些额外的数据来执行此操作,因此根据性能命中和排序数据的大小,这可能是一个潜在的问题。此外,无论何时修改数据,您都需要确保此额外列保持一致。

答案 1 :(得分:1)

尝试绑定到 DataView ,而不是 DataTable ,例如:

private void SortByTwoColumns()
{
   DataView myDataView = DataTable1.DefaultView;
   myDataView.Sort = "State, ZipCode DESC";
   myGridView.DataSource = myDataView;
}

您可以选择处理N / A数据 - SELECT 语句, RowPrePaint 事件等。

答案 2 :(得分:1)

为什么不直接更改SQL查询以将此列作为int(“N / A”为-1)返回,然后对显示的列使用自定义格式化程序?

答案 3 :(得分:0)

也许您可以调整我的博客文章中的代码,以提供特定于您的int列的IComparer:

http://adamhouldsworth.blogspot.com/2010/01/bound-datagridview-sorting.html

答案 4 :(得分:0)

除了Joel Etherton的回答之外,还有一个可以处理的事件,它可以覆盖单元格的显示值。

所以,就像他说的那样,你会想要两列。一个是强类型数字列,文本值为-1s。另一个是隐藏文本列,包含实际值(混合数字和文本值)。按原样,它将正确排序,但用户将看到-1而不是实际值。

要解决此问题,我们需要以下代码:

Private Sub dgDisplay_CellFormatting(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) _
Handles dgDisplay.CellFormatting
    If Not (e.ColumnIndex = dgDisplay.Columns("NumericColumn").Index _
    AndAlso e.RowIndex >= 0) Then Exit Sub

    Dim newVal As String = dgDisplay.Item("ActualColumn", e.RowIndex).Value
    e.Value = newVal
End Sub

这将显示您想要查看的实际文本值,即使绑定DataSource中的值只是一个数字。

如果您要对DataView后面的DataGridView进行任何过滤,请务必过滤隐藏的列。