Пользовательская сортировка связанного DataGridView - PullRequest
4 голосов
/ 10 ноября 2008

У меня есть DataGridView, связанный с DataTable. У меня есть один столбец, который является псевдоинтеллектуальным - вы знаете тип, где большую часть времени он имеет целые числа, но иногда вместо этого есть N / A. Этот столбец является varchar, но я хочу, чтобы он был похож на столбец int, обрабатывая N / A как -1.

DataGridView обеспечивает это - , если , он не привязан к DataTable. Если он связан, он использует механизм сортировки связанного объекта, и DataTables не предоставляет эту функциональность.

Я могу создать пользовательский столбец в DataTable с нужным мне поведением, но поскольку DataGridView привязан к DataTable, он сортируется по столбцу, который отображает. Я могу создать пользовательский столбец в DataGridView, но мне нужно перевести таблицу в виртуальный режим, чтобы сортировать по нему, когда у меня уже есть решение, которое в основном работает.

Как мне сделать так, чтобы я сортировал столбец псевдо-int как я хочу - где это возможно, сортировку по int? Этот сценарий кажется невероятно распространенным, и я уверен, что где-то он был предусмотрен.

Ответы [ 5 ]

3 голосов
/ 14 июля 2010

Когда мне приходилось сталкиваться с проблемами сортировки, подобными этой, мой любимый метод - добавить столбец в DataTable и разобрать псевдо-int в сортируемое int, которое мне нужно. Затем в привязке DataGridView вы можете просто скрыть этот столбец данных, но, поскольку он там, вы все равно можете отсортировать его. Для этого он добавляет в память немного дополнительных данных, поэтому в зависимости от производительности и размера отсортированных данных это может быть потенциальной проблемой. Кроме того, каждый раз, когда данные изменяются, вам нужно следить за тем, чтобы этот дополнительный столбец оставался на одном уровне.

1 голос
/ 27 июля 2009

Почему бы вам просто не изменить запрос SQL, чтобы он возвращал этот столбец как int (-1 для 'N / A'), а затем использовать настраиваемый форматер для отображаемого столбца?

1 голос
/ 10 ноября 2008

Попробуйте связать с DataView , а не с DataTable , например ::

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

У вас есть несколько вариантов работы с данными N / A - оператор SELECT , событие RowPrePaint и другие.

0 голосов
/ 03 декабря 2013

Наряду с ответом Джоэла Этертона есть событие, которое вы можете обработать, что позволит вам переопределить отображаемое значение для ячейки.

Итак, как он сказал, вам понадобятся две колонки. Один из них - это строго типизированный числовой столбец с -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, убедитесь, что вы фильтруете на скрытом столбце.

0 голосов
/ 14 июля 2010

Возможно, вы можете адаптировать код в моем сообщении в блоге для предоставления IComparer, специфичного для вашего столбца int:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...