2013-09-06 3 views
4

My DataGridView's DataSource привязан к DataView. DataView равен моему dtBillsDataTable. Например:Сортировка алфавитно-цифровой столбца DataView

Dim View As New DataView 
View.Table = DataSet1.Tables("dtBills") 
dgvBills.DataSource = View 

У меня есть несколько столбцов в этом DataGridView. В частности, в качестве информации содержатся строки и целые числа. Когда я нажимаю на заголовке DataGridView колонки для сортировки столбца сортирует как строки, как в левом столбце:

'Curr Col >>> ' Wanted Result 
10001  >>> 10001 
100012  >>> 11000 
11000  >>> 12000 
110049  >>> 100012 
12000  >>> 110049 
E-1234  >>> E-1234 
T-12345 >>> T-1235 
T-1235  >>> T-12345 

Как бы я идти о сортировке связанного DataGridView столбец при нажатии на заголовок столбца, как я обычно бы? Должен ли я использовать мой DataView, чтобы помочь мне?

ответ

1

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

dgvBills.AutoGenerateColumns = False 
tbl.Columns.Add(New DataColumn("Scol1", GetType(String))) 
tbl.Columns.Add(New DataColumn("Scol2", GetType(Integer))) 

Первый будет содержать ведущие буквы (или пустую строку). Второй будет содержать только число, содержащееся в строке. Сортируем по Scol1, Scol2.

Теперь мы устанавливаем все comumns в Programatic режиме (DataGridViewColumnSortMode Enumeration)

For Each column As DataGridViewColumn In dgvBills.Columns 
    column.SortMode = DataGridViewColumnSortMode.Programmatic 
Next 

И обычай сортировки достигается в обработчике ColumnHeaderMouseClick (DataGridView.Sort Method (IComparer)). Мы будем использовать сортировку основного представления вместо сортировки Grid.

Private Sub dgvBills_ColumnHeaderMouseClick(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dgvBills.ColumnHeaderMouseClick 
    Dim newColumn As DataGridViewColumn = dgvBills.Columns(e.ColumnIndex) 

    Dim direction As ListSortDirection 
    Dim Modifier As String = "" 

    If newColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending Then 
     direction = ListSortDirection.Descending 
     Modifier = " desc" 
    Else 
     direction = ListSortDirection.Ascending 
    End If 

    Dim View As DataView = dgvBills.DataSource 

    If {"JobNumber", "JobNumber1"}.Contains(dgvBills.Columns(e.ColumnIndex).Name) Then 
     View.Table.Columns("Scol2").Expression = String.Format("Convert(iif (substring({0},1,2) like '*-',substring({0},3,len({0})-1),{0}), 'System.Int32')", dgvBills.Columns(e.ColumnIndex).Name) 
     View.Table.Columns("Scol1").Expression = String.Format("iif (substring({0},1,2) like '*-',substring({0},1,2),'')", dgvBills.Columns(e.ColumnIndex).Name) 
     View.Sort = String.Format("Scol1 {0},Scol2 {0}", Modifier) 
    Else 
     dgvBills.Sort(newColumn, direction) 
    End If 

    If direction = ListSortDirection.Ascending Then 
     newColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending 
    Else 
     newColumn.HeaderCell.SortGlyphDirection = SortOrder.Descending 
    End If 

End Sub 

В {"JobNumber", "JobNumber1"}.Contains ... можно задать столбцы, которые отсортированные differntly. Другие столбцы сортируются по типу Grid по умолчанию или можно создать другую пользовательскую сортировку.

Примечание: У меня есть полностью рабочий пример, но я надеюсь, что фрагменты достаточно хороши.

+0

Несколько вопросов здесь ... Вы вручную добавили Scol1 и Scol2 ... Я должен создать другой столбец с именем JobNumber1 в моем DataTable? Кроме того, когда вы выполняете 'substring ({0}, 1, 2)' в выражении, что должно возвращаться? Благодаря! – Alex

+0

В первом выражении 'Scol2', где мы используем' String.Format («Преобразование (...)» «Я получаю следующую ошибку:« Строка ввода не была в правильном формате ». – Alex

+0

Вы упомянули, что существует 19 столбцов для сортировки. 'JobNumber1' является примером (заполнителем) других столбцов.' substring ({0}, 1, 2) 'должен возвращать первые два символа (например, T-) столбца, который является sorted - это имя 'dgvBills.Columns (e.ColumnIndex) .Name'. Я не уверен, присутствуют ли в вашем примере все строковые форматы. Можете ли вы сказать, какая строка вызывает ошибку? – IvanH

1

Столбец отсортирован правильно, как строки, и я предполагаю, что вы хотите отсортировать его как числа. Проблема в том, что кажется, что строки, которые у вас есть, объединяют числа и символы. Результатом является необходимость довольно сложной сортировки для DataView.

Dim tbl As New DataTable("dtBills") 
Dim DataSet1 As New DataSet 
DataSet1.Tables.Add(tbl) 
tbl.Columns.Add(New DataColumn("MyCol", GetType(String))) 
Dim vals As String() = {"10001", "100012", "11000", "110049", "12000", "E-1234", "T-12345", "T-1235"} 
For qq = 0 To vals.Length - 1 
    Dim row As DataRow 
    row = tbl.NewRow 
    row(0) = vals(qq) 
    tbl.Rows.Add(vals(qq)) 
Next 
tbl = DataSet1.Tables("dtBills") 
tbl.Columns.Add(New DataColumn("Scol2", GetType(Integer)) With {.Expression = "Convert(iif (substring(MyCol,1,2) like '*-',substring(MyCol,3,len(MyCol)-1),MyCol), 'System.Int32')"}) 
tbl.Columns.Add(New DataColumn("Scol1", GetType(String)) With {.Expression = "iif (substring(MyCol,1,2) like '*-',substring(MyCol,1,2),'')"}) 
Dim View As New DataView(tbl) 
View.Sort = "Scol1,Scol2" 
View.Table = DataSet1.Tables("dtBills") 

Итак, добавлены две новые колонки. Сначала сохраните сортировку по начальным буквам второй, чтобы включить сортировку по числу, содержащемуся в строке.

+0

Я вижу. Это будет работать, если я только отсортировал Alphanumerically в одном столбце ... Есть ли другой способ, который будет сортироваться так для каждого столбца (19 столбцов)? Если бы я сделал это так, у меня было бы много столбцов для создания и не повлияло бы на производительность? Например, более длительное время загрузки, более длинная фильтрация строк в моем DataView? – Alex

+0

Кроме того, я не могу заставить ваш код работать ... Что-то странно с использованием метода подстроки: p – Alex

+0

Я полагаю, что столбец, который вы хотите отсортировать, имеет имя MyCol. Необходимо изменить его на свое имя. Я пытаюсь выяснить что-то более гибкое. Правильно ли я правильно разбираюсь? По номеру (если есть), по первой букве и по номеру после буквы. – IvanH

Смежные вопросы