首页 > 解决方案 > 按十进制对 DataGridView 进行排序

问题描述

我知道有很多这样的帖子存在,但我找不到正确的解决方案。我需要按升序对datagridview的第一列进行排序。但排序顺序是错误的。第一列是主键,包含十进制值。

下面是我的示例代码。我试图在填充列后更改数据类型,但它不起作用。

Imports System.Data.SQLite

Public Class Form1

Dim conn As SQLiteConnection
Dim da As SQLiteDataAdapter
Dim table As New DataTable
Dim cmdbl As SQLiteCommandBuilder


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Const filename As String = "database.db"
    conn = New SQLiteConnection("Data Source=" & filename & ";Version=3;")
    conn.Open()
    Dim sql As String = "select * from 'item_rate' ORDER BY 'SL NO' ASC"

    da = New SQLiteDataAdapter(sql, conn)
    da.Fill(table)
    DataGridView1.DataSource = table
    DataGridView1.Columns(0).CellTemplate.ValueType = GetType(Decimal)
    DataGridView1.Sort(DataGridView1.Columns(0), 0)


End Sub

标签: vb.netdatagridviewsqlite

解决方案


我终于找到了解决方案。不要更改 DGV 的列数据类型,而是更改 DataTable 的列数据类型。为此,您需要克隆 DataTable 并更改列 Datatype。一旦表格填满数据,您就无法更改数据类型。下面是示例代码。

Imports System.Data.SQLite

Public Class Form1

Dim conn As SQLiteConnection
Dim da As SQLiteDataAdapter
Dim table As New DataTable
Dim cmdbl As SQLiteCommandBuilder


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Const filename As String = "database.db"
    conn = New SQLiteConnection("Data Source=" & filename & ";Version=3;")
    conn.Open()
    Dim sql As String = "select * from 'item_rate'"

    da = New SQLiteDataAdapter(sql, conn)
    da.Fill(table)

    'clone the DataTable to change the data type of a column for sorting

    Dim dtCloned As DataTable = table.Clone()
    dtCloned.Columns(0).DataType = GetType(Single) 'Assign the first column to decimal type AKA Single
    For Each row As DataRow In table.Rows
        dtCloned.ImportRow(row)
    Next
    'End Of Clone Table

    'Assign cloned table to DGV
    DataGridView1.DataSource = dtCloned
    'Sort DGV
    DataGridView1.Sort(DataGridView1.Columns(0), 0)

End Sub

推荐阅读