4

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

DataGridView 提供了这一点——如果它没有绑定到 DataTable。如果是绑定的,它会使用绑定对象的排序机制,而 DataTables 不会公开该功能。

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

如何让它按照我的需要对我的伪整数列进行排序 - 在可能的情况下,按整数排序?这种情况似乎非常普遍,我敢肯定它已经被提供了。

4

5 回答 5

3

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

于 2010-07-14T10:52:40.943 回答
1

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

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

您有几种处理 N/A 数据的选择 - SELECT语句、RowPrePaint事件等。

于 2008-11-10T05:54:18.947 回答
1

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

于 2009-07-27T08:34:32.113 回答
0

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

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

于 2010-07-14T10:44:32.763 回答
0

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

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

为了解决这个问题,我们需要这段代码:

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确保您在隐藏列上进行过滤。

于 2013-12-03T18:31:08.387 回答