我有一个绑定到DataTable的DataGridView。我有一个列是伪int - 你知道那种,大多数时候它有整数,但有时候有一个N / A.这个列是一个varchar,但是我希望它像int列一样排序,将N / A视为-1。
DataGridView为此提供了 - 如果它没有绑定到DataTable。如果绑定它,它将使用绑定对象的排序机制,而DataTables不会公开该功能。
我可以使用我想要的行为在DataTable中创建一个自定义列,但由于DataGridView绑定到DataTable,它会按其显示的列进行排序。我可以在DataGridView中创建一个自定义列,但是当我已经有一个主要有效的解决方案时,我需要将表设置为虚拟模式进行排序。
如何根据需要对我的伪int列进行排序 - 如果可能,按int排序?这种情况看起来非常普遍,而且我确信它已被提供给它。
答案 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
进行任何过滤,请务必过滤隐藏的列。